AWS WorkMail est un puissant service de messagerie et de calendrier qui allie sécurité, fiabilité et facilité d'utilisation. Son intégration avec les services AWS et sa compatibilité avec les clients de messagerie existants en font un choix attrayant pour les entreprises cherchant à rationaliser la gestion de leurs e-mails et de leur calendrier tout en garantissant sécurité et conformité. En tirant parti d'AWS WorkMail, les organisations peuvent se concentrer sur leurs activités principales sans se soucier des complexités liées à la gestion de l'infrastructure de messagerie. La mise en place d'un système de sauvegarde fiable pour votre AWS WorkMail est cruciale pour garantir que vos e-mails sont sécurisés et facilement récupérables. Dans ce didacticiel, je vais vous guider à travers le processus d'automatisation des sauvegardes AWS WorkMail pour plusieurs utilisateurs, en gérant jusqu'à 10 tâches d'exportation de boîtes aux lettres simultanées. Nous utiliserons les services AWS et Python pour créer une solution de sauvegarde robuste.
Ah ! Je me souviens de l'époque où j'utilisais le serveur de messagerie CPANEL, puis de me mêler de mon propre serveur de messagerie. Ces serveurs de messagerie à instance unique avec un accès limité aux adresses IP au début des années 2010 fonctionnaient sans problème, mais alors que de plus en plus de personnes dans le monde ont commencé à exploiter ces serveurs, Comon, nous recevons encore beaucoup de spam et de marketing. Les choses ont été difficiles pour s'assurer que votre e-mail n'atteint pas dans la boîte de spam.
Le choix entre AWS WorkMail, un serveur de messagerie auto-hébergé et un serveur de messagerie cPanel dépend de plusieurs facteurs, notamment le budget, l'expertise technique, les besoins d'évolutivité et les exigences de sécurité.
Mes principales préoccupations ont toujours été les suivantes :
Puis est venu AWS à la rescousse, et depuis que j'utilise AWS à partir de 2015, les choses ont été un jeu d'enfant, sauf lorsqu'il m'a fallu sauvegarder mon compte AWS pour passer à un nouveau compte. Eh bien, j'ai cherché sur Internet une solution fiable car, pour l'instant, AWS WorkMail ne fournit pas de moyen simple de sauvegarder vos e-mails sur votre ordinateur local ou sur S3, et c'est le cas. compréhensible en fonction de la conformité en matière de sécurité, mais je m'attends toujours à ce qu'AWS fournisse une interface graphique ou un outil pour cela. Eh bien, en parcourant, je suis tombé sur des outils définitivement PAYANTS, j'ai donc décidé de me lancer dans le développement de mon propre outil. Après des tests rigoureux, basés sur mon expérience avec AWS, des problèmes 9/10 se produisent toujours lorsqu'un service est incapable de communiquer avec l'autre service en raison de problèmes de politique ou de rôle IAM.
C'est ma contribution à toutes ces personnes qui ont du mal à effectuer des sauvegardes de leurs comptes AWS Work Mail.
Nous avons créé un rôle IAM dans votre compte, lui donnant accès à l'exportation depuis AWS WorkMail, puis nous avons attaché une stratégie au même rôle pour lui permettre d'accéder à S3. Nous créons ensuite une clé KMS, qui a accès au rôle IAM. Le compartiment S3 doit également accéder au rôle IAM pour fonctionner correctement.
Tout d'abord, assurez-vous que l'AWS CLI est installée et configurée avec les informations d'identification appropriées. Ouvrez votre terminal et exécutez :
aws configure
Suivez les invites pour définir votre ID de clé d'accès AWS, votre clé d'accès secrète, votre région par défaut et votre format de sortie.
Nous devons créer un rôle IAM, des politiques, un compartiment S3 et une clé KMS. Enregistrez le script bash suivant sous setup_workmail_export.sh
.
#!/bin/bash # Configuration ROLE_NAME="WorkMailExportRole" POLICY_NAME="workmail-export" S3_BUCKET_NAME="s3.bucket.name" AWS_REGION="your-region" ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) # Create Trust Policy cat <<EOF > trust-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "export.workmail.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "sts:ExternalId": "$ACCOUNT_ID" } } } ] } EOF # Create IAM Role aws iam create-role --role-name $ROLE_NAME --assume-role-policy-document file://trust-policy.json # Create IAM Policy cat <<EOF > role-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::$S3_BUCKET_NAME", "arn:aws:s3:::$S3_BUCKET_NAME/*" ] }, { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "*" } ] } EOF # Attach the Policy to the Role aws iam put-role-policy --role-name $ROLE_NAME --policy-name $POLICY_NAME --policy-document file://role-policy.json # Create S3 Bucket aws s3api create-bucket --bucket $S3_BUCKET_NAME --region $AWS_REGION --create-bucket-configuration LocationConstraint=$AWS_REGION # Create Key Policy cat <<EOF > key-policy.json { "Version": "2012-10-17", "Id": "workmail-export-key", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::$ACCOUNT_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow administration of the key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::$ACCOUNT_ID:role/$ROLE_NAME" }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" } ] } EOF # Create the KMS Key and get the Key ID and ARN using Python for JSON parsing KEY_METADATA=$(aws kms create-key --policy file://key-policy.json) KEY_ID=$(python3 -c "import sys, json; print(json.load(sys.stdin)['KeyMetadata']['KeyId'])" <<< "$KEY_METADATA") KEY_ARN=$(python3 -c "import sys, json; print(json.load(sys.stdin)['KeyMetadata']['Arn'])" <<< "$KEY_METADATA") # Update S3 Bucket Policy cat <<EOF > s3_bucket_policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::$ACCOUNT_ID:role/$ROLE_NAME" }, "Action": "s3:*" "Resource": [ "arn:aws:s3:::$S3_BUCKET_NAME", "arn:aws:s3:::$S3_BUCKET_NAME/*" ] } ] } EOF # Apply the Bucket Policy aws s3api put-bucket-policy --bucket $S3_BUCKET_NAME --policy file://s3_bucket_policy.json # Clean up temporary files rm trust-policy.json role-policy.json key-policy.json s3_bucket_policy.json # Display the variables required for the backup script cat <<EOF Setup complete. Here are the variables required for the backup script: # Print out the Variables organization_id = 'your-organization-id' user_id = 'your-user-id' s3_bucket_name = '$S3_BUCKET_NAME' s3_prefix = 'workmail-backup/' region = '$AWS_REGION' kms_key_arn = '$KEY_ARN' role_name = '$ROLE_NAME' account_id = '$ACCOUNT_ID' EOF
Rendez le script exécutable et exécutez-le :
chmod +x setup_workmail_export.sh ./setup_workmail_export.sh
Maintenant, écrivons le script Python pour exporter les boîtes aux lettres par lots de 10. Enregistrez le script suivant sous workmail_export.py
.
import boto3 import json import time from datetime import datetime # Configuration organization_id = 'your-organization-id' user_emails = { 'user-id-1': '[email protected]', 'user-id-2': '[email protected]', 'user-id-3': '[email protected]', 'user-id-4': '[email protected]', 'user-id-5': '[email protected]', 'user-id-6': '[email protected]', 'user-id-7': '[email protected]', 'user-id-8': '[email protected]', 'user-id-9': '[email protected]', 'user-id-10': '[email protected]', 'user-id-11': '[email protected]', 'user-id-12': '[email protected]' # Add more user ID to email mappings as needed } s3_bucket_name = 's3.bucket.name' region = 'your-region' kms_key_arn = 'arn:aws:kms:your-region:your-account-id:key/your-key-id' role_name = 'WorkMailExportRole' account_id = 'your-account-id' # Get the current date current_date = datetime.now().strftime('%Y-%m-%d') # Set the S3 prefix with the date included s3_prefix_base = f'workmail-backup/{current_date}/' # Initialize AWS clients workmail = boto3.client('workmail', region_name=region) sts = boto3.client('sts', region_name=region) def start_export_job(entity_id, user_email): client_token = str(time.time()) # Unique client token role_arn = f"arn:aws:iam::{account_id}:role/{role_name}" s3_prefix = f"{s3_prefix_base}{user_email}/" try: response = workmail.start_mailbox_export_job( ClientToken=client_token, OrganizationId=organization_id, EntityId=entity_id, Description='Backup job', RoleArn=role_arn, KmsKeyArn=kms_key_arn, S3BucketName=s3_bucket_name, S3Prefix=s3_prefix ) return response['JobId'] except Exception as e: print(f"Failed to start export job for {entity_id}: {e}") return None def check_job_status(job_id): while True: try: response = workmail.describe_mailbox_export_job( OrganizationId=organization_id, JobId=job_id ) print(f"Full Response: {response}") # Log full response for debugging state = response.get('State', 'UNKNOWN') print(f"Job State: {state}") if state in ['COMPLETED', 'FAILED']: break except Exception as e : print(f"Error checking job status for {job_id}: {e}") time.sleep(30) # Wait for 30 seconds before checking again return state def export_mailboxes_in_batches(user_emails, batch_size=10): user_ids = list(user_emails.keys()) for i in range(0, len(user_ids), batch_size): batch = user_ids[i:i+batch_size] job_ids = [] for user_id in batch: user_email = user_emails[user_id] job_id = start_export_job(user_id, user_email) if job_id: print(f"Started export job for {user_email} with Job ID: {job_id}") job_ids.append((user_email, job_id)) for user_email, job_id in job_ids: state = check_job_status(job_id) if state == 'COMPLETED': print(f"Export job for {user_email} completed successfully") else: print(f"Export job for {user_email} failed with state: {state}") def main(): export_mailboxes_in_batches(user_emails) if __name__ == "__main__": main()
Remplacez les espaces réservés par votre ID d'organisation AWS WorkMail réel, votre ID utilisateur vers les mappages de courrier électronique, le nom du compartiment S3, la région, l'ARN de la clé KMS, le nom du rôle et l'ID du compte AWS.
Assurez-vous que Boto3 est installé :
pip install boto3
Ensuite, exécutez le script Python :
python workmail_export.py
import boto3 import json import time # Configuration organization_id = 'your-organization-id' user_import_data = { 'user-id-1': '[email protected]', 'user-id-2': '[email protected]', 'user-id-3': '[email protected]', 'user-id-4': '[email protected]', 'user-id-5': '[email protected]', 'user-id-6': '[email protected]', 'user-id-7': '[email protected]', 'user-id-8': '[email protected]', 'user-id-9': '[email protected]', 'user-id-10': '[email protected]', 'user-id-11': '[email protected]', 'user-id-12': '[email protected]' # Add more user ID to email mappings as needed } s3_bucket_name = 's3.bucket.name' s3_object_prefix = 'workmail-backup/' # Prefix for S3 objects (folders) region = 'your-region' role_name = 'WorkMailImportRole' account_id = 'your-account-id' # Initialize AWS clients workmail = boto3.client('workmail', region_name=region) sts = boto3.client('sts', region_name=region) def start_import_job(entity_id, user_email): client_token = str(time.time()) # Unique client token role_arn = f"arn:aws:iam::{account_id}:role/{role_name}" s3_object_key = f"{s3_object_prefix}{user_email}/export.zip" try: response = workmail.start_mailbox_import_job( ClientToken=client_token, OrganizationId=organization_id, EntityId=entity_id, Description='Import job', RoleArn=role_arn, S3BucketName=s3_bucket_name, S3ObjectKey=s3_object_key ) return response['JobId'] except Exception as e: print(f"Failed to start import job for {entity_id}: {e}") return None def check_job_status(job_id): while True: try: response = workmail.describe_mailbox_import_job( OrganizationId=organization_id, JobId=job_id ) state = response.get('State', 'UNKNOWN') print(f"Job State: {state}") if state in ['COMPLETED', 'FAILED']: break except Exception as e: print(f"Error checking job status for {job_id}: {e}") time.sleep(30) # Wait for 30 seconds before checking again return state def import_mailboxes_in_batches(user_import_data, batch_size=10): user_ids = list(user_import_data.keys()) for i in range(0, len(user_ids), batch_size): batch = user_ids[i:i+batch_size] job_ids = [] for user_id in batch: user_email = user_import_data[user_id] job_id = start_import_job(user_id, user_email) if job_id: print(f"Started import job for {user_email} with Job ID: {job_id}") job_ids.append((user_email, job_id)) for user_email, job_id in job_ids: state = check_job_status(job_id) if state == 'COMPLETED': print(f"Import job for {user_email} completed successfully") else: print(f"Import job for {user_email} failed with state: {state}") def main(): import_mailboxes_in_batches(user_import_data) if __name__ == "__main__": main()
En suivant ces étapes, vous avez mis en place un système automatisé pour sauvegarder vos boîtes aux lettres AWS WorkMail, gérant jusqu'à 10 tâches d'exportation simultanées. Cette solution garantit que vos e-mails sont stockés en toute sécurité dans un compartiment S3, organisés par e-mail et date de l'utilisateur, et chiffrés avec une clé KMS. Cette configuration fournit une stratégie de sauvegarde robuste et évolutive pour les données de messagerie de votre organisation.
Dépôt Github : https://github.com/th3n00bc0d3r/AWS-WorkMail-Backup
N'hésitez pas à me contacter sur mon LinkedIn , vous pouvez également toujours m'offrir un café