paint-brush
Как я автоматизировал резервное копирование AWS WorkMail для нескольких пользователейк@th3n00bc0d3r
306 чтения
306 чтения

Как я автоматизировал резервное копирование AWS WorkMail для нескольких пользователей

к Muhammad Bilal15m2024/05/27
Read on Terminal Reader

Слишком долго; Читать

AWS WorkMail — это мощный сервис электронной почты и календаря, сочетающий в себе безопасность, надежность и простоту использования. Используя AWS WorkMail, организации могут сосредоточиться на своей основной деятельности, не беспокоясь о сложностях управления инфраструктурой электронной почты. В этом руководстве я покажу вам процесс автоматизации резервного копирования Amazon WorkMail для нескольких пользователей, выполняя до 10 одновременных заданий экспорта почтовых ящиков.
featured image - Как я автоматизировал резервное копирование AWS WorkMail для нескольких пользователей
Muhammad Bilal HackerNoon profile picture
0-item

AWS WorkMail — это мощный сервис электронной почты и календаря, сочетающий в себе безопасность, надежность и простоту использования. Его интеграция с сервисами AWS и совместимость с существующими почтовыми клиентами делают его привлекательным выбором для компаний, стремящихся оптимизировать управление электронной почтой и календарем, обеспечивая при этом безопасность и соответствие нормативным требованиям. Используя AWS WorkMail, организации могут сосредоточиться на своей основной деятельности, не беспокоясь о сложностях управления инфраструктурой электронной почты. Настройка надежной системы резервного копирования для вашей AWS WorkMail имеет решающее значение для обеспечения безопасности вашей электронной почты и возможности ее легкого восстановления. В этом руководстве я познакомлю вас с процессом автоматизации резервного копирования AWS WorkMail для нескольких пользователей, выполняя до 10 одновременных заданий экспорта почтовых ящиков. Мы будем использовать сервисы AWS и Python для создания надежного решения для резервного копирования.


Ах! Я помню время, когда я использовал почтовый сервер CPANEL, а затем вмешивался в работу своего собственного почтового сервера. Почтовые серверы с одним экземпляром и ограниченным доступом к IP-адресам в начале 2010-х годов работали гладко, но по мере того, как все больше и больше людей во всем мире начали использовать эти серверы, Comon, мы по-прежнему получаем много спама и маркетинга. Было сложно следить за тем, чтобы ваше письмо не попало в спам.


Выбор между AWS WorkMail, автономным почтовым сервером и почтовым сервером cPanel зависит от нескольких факторов, включая бюджет, технические знания, потребности в масштабируемости и требования безопасности.


  • AWS WorkMail идеально подходит для компаний, которым требуется масштабируемое, безопасное и управляемое решение для электронной почты с минимальными затратами на обслуживание.
  • Самостоятельный почтовый сервер подходит для организаций с собственными техническими знаниями и особыми потребностями в настройке, но требует более высоких затрат и усилий по обслуживанию.
  • cPanel Mail Server предлагает сбалансированный подход для малого и среднего бизнеса, которому нужен удобный интерфейс и который устраивает определенный уровень обслуживания, пользуясь пакетными услугами хостинга.


Меня всегда больше всего беспокоило следующее;

Безопасность

  • AWS WorkMail : предоставляет встроенные функции безопасности, включая шифрование при передаче и хранении, интеграцию со службой управления ключами AWS (KMS) и соответствие различным нормативным стандартам.
  • Самостоятельный почтовый сервер . Безопасность полностью зависит от опыта администратора. Требуется настройка шифрования, фильтрации спама и регулярные обновления безопасности для защиты от угроз.
  • Почтовый сервер cPanel : предлагает функции безопасности, но ответственность за реализацию и поддержание мер безопасности ложится на пользователя. cPanel предоставляет инструменты для настройки SSL/TLS, фильтрации спама и антивируса, но правильная настройка и регулярные обновления имеют важное значение.


Затем на помощь пришел AWS, и с тех пор, как я начал использовать AWS с 2015 года, все стало очень просто, за исключением случаев, когда возникал случай резервного копирования моей учетной записи AWS для перехода на новую учетную запись. Что ж, я искал в Интернете надежное решение, потому что, насколько мы говорим на данный момент, AWS WorkMail не предоставляет простого способа резервного копирования вашей электронной почты на локальный компьютер или в S3, и это понятно, исходя из требований безопасности, но, тем не менее, я все еще ожидаю, что AWS предоставит для этого какой-то графический интерфейс или инструмент. Что ж, во время просмотра я наткнулся на инструменты, определенно ПЛАТНЫЕ, поэтому решил пойти по пути разработки своего собственного инструмента. После тщательного тестирования, основанного на моем опыте работы с AWS, 9 из 10 проблем всегда возникают, когда один сервис не может взаимодействовать с другим сервисом из-за проблем с политикой или ролью IAM.


Это мой вклад в помощь всем тем людям, которым трудно создавать резервные копии учетных записей AWS Work Mail.


Как работает резервное копирование?


Мы создали роль IAM в вашей учетной записи, предоставив ей доступ к экспорту из AWS WorkMail, а затем прикрепили политику к той же роли, чтобы разрешить ей доступ к S3. Затем мы создаем ключ KMS, который предоставляет доступ к роли IAM. Для правильной работы корзине S3 также необходим доступ к роли IAM.

Шаг 1. Настройте интерфейс командной строки AWS

Сначала убедитесь, что интерфейс командной строки AWS установлен и настроен с использованием соответствующих учетных данных. Откройте терминал и запустите:

 aws configure

Следуйте инструкциям, чтобы установить идентификатор ключа доступа AWS, секретный ключ доступа, регион по умолчанию и формат вывода.

Шаг 2. Настройте необходимые ресурсы AWS

Нам нужно создать роль IAM, политики, корзину S3 и ключ KMS. Сохраните следующий bash-скрипт как 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

Сделайте скрипт исполняемым и запустите его:

 chmod +x setup_workmail_export.sh ./setup_workmail_export.sh

Шаг 3. Напишите сценарий резервного копирования

Теперь давайте напишем скрипт Python для экспорта почтовых ящиков партиями по 10 штук. Сохраните следующий скрипт как 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()

Замените заполнители своим фактическим идентификатором организации AWS WorkMail, идентификатором пользователя для сопоставлений электронной почты, именем корзины S3, регионом, ARN ключа KMS, именем роли и идентификатором учетной записи AWS.


Шаг 4. Запустите сценарий резервного копирования.

Убедитесь, что у вас установлен Boto3:

 pip install boto3

Затем выполните скрипт 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()


Выполнив эти шаги, вы настроили автоматизированную систему резервного копирования почтовых ящиков AWS WorkMail, выполняющую до 10 одновременных заданий экспорта. Это решение гарантирует, что ваши электронные письма будут надежно храниться в корзине S3, организованы по электронной почте и дате пользователя и зашифрованы ключом KMS. Эта настройка обеспечивает надежную и масштабируемую стратегию резервного копирования данных электронной почты вашей организации.


Репозиторий Github: https://github.com/th3n00bc0d3r/AWS-WorkMail-Backup.


Не стесняйтесь обращаться к моему LinkedIn . Также вы всегда можете купить мне кофе.