paint-brush
여러 사용자를 위해 AWS WorkMail 백업을 자동화하는 방법by@th3n00bc0d3r
233

여러 사용자를 위해 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을 위한 안정적인 백업 시스템을 설정하는 것이 중요합니다. 이 자습서에서는 최대 10개의 동시 사서함 내보내기 작업을 처리하여 여러 사용자를 위한 AWS WorkMail 백업을 자동화하는 프로세스를 안내합니다. 우리는 AWS 서비스와 Python을 사용하여 강력한 백업 솔루션을 만들 것입니다.


아! CPANEL 메일 서버를 사용하다가 내 메일 서버에 간섭하던 때가 기억납니다. 2010년대 초 IP 주소에 대한 액세스가 제한된 단일 인스턴스 메일 서버는 원활했지만 전 세계적으로 점점 더 많은 사람들이 이러한 서버인 Comon을 악용하기 시작하면서 여전히 많은 스팸과 마케팅을 받고 있습니다. 귀하의 이메일이 스팸함에 들어가지 않도록 하는 것이 어려웠습니다.


자체 호스팅 메일 서버인 AWS WorkMail과 cPanel 메일 서버 중에서 선택하는 것은 예산, 기술 전문 지식, 확장성 요구 사항, 보안 요구 사항 등 여러 요소에 따라 달라집니다.


  • AWS WorkMail은 유지 관리 오버헤드를 최소화하면서 확장 가능하고 안전하며 관리되는 이메일 솔루션을 원하는 기업에 이상적입니다.
  • 셀프 호스팅 메일 서버는 사내 기술 전문 지식과 특정 사용자 정의 요구 사항이 있는 조직에 적합하지만 비용과 유지 관리 노력이 더 많이 필요합니다.
  • cPanel 메일 서버는 사용자 친화적인 인터페이스가 필요하고 일정 수준의 유지 관리에 익숙하며 번들 호스팅 서비스의 이점을 누리는 중소기업을 위한 균형 잡힌 접근 방식을 제공합니다.


나의 주요 관심사는 항상 다음과 같습니다.

보안

  • AWS WorkMail : 전송 중 및 저장 중 암호화, AWS Key Management Service(KMS)와의 통합, 다양한 규제 표준 준수 등 내장된 보안 기능을 제공합니다.
  • 자체 호스팅 메일 서버 : 보안은 전적으로 관리자의 전문 지식에 달려 있습니다. 위협으로부터 보호하려면 암호화, 스팸 필터링 및 정기적인 보안 업데이트 구성이 필요합니다.
  • cPanel 메일 서버 : 보안 기능을 제공하지만 보안 조치를 구현하고 유지하는 책임은 사용자에게 있습니다. cPanel은 SSL/TLS 구성, 스팸 필터링 및 바이러스 백신을 위한 도구를 제공하지만 적절한 설정과 정기적인 업데이트가 필수적입니다.


그런 다음 AWS가 구출되었고 2015년부터 AWS를 사용한 이후로 새 계정으로 이동하기 위해 AWS 계정을 백업하는 경우를 제외하고는 모든 것이 순조롭게 진행되었습니다. 글쎄요, 저는 신뢰할 수 있는 솔루션을 찾기 위해 인터넷을 검색해 왔습니다. 현재로서는 AWS WorkMail이 이메일을 로컬 컴퓨터나 S3에 백업하는 간단한 방법을 제공하지 않기 때문입니다. 보안 규정 준수를 기반으로 이해할 수 있지만 여전히 AWS가 이를 위한 GUI나 도구를 제공해야 한다고 기대합니다. 검색하는 동안 확실히 유료인 도구를 발견했기 때문에 나만의 도구를 개발하기로 결정했습니다. AWS에 대한 내 경험을 바탕으로 엄격한 테스트를 거친 결과, 정책 또는 IAM 역할 문제로 인해 한 서비스가 다른 서비스와 통신할 수 없는 경우 항상 9/10 문제가 발생합니다.


이는 AWS 업무 메일 계정을 백업하는 데 어려움을 겪고 있는 모든 사람들을 위한 저의 기여입니다.


백업은 어떻게 작동하나요?


귀하의 계정에 IAM 역할을 생성하여 해당 역할에 AWS WorkMail에서 내보낼 수 있는 액세스 권한을 부여한 다음 동일한 역할에 정책을 연결하여 S3에 액세스할 수 있도록 했습니다. 그런 다음 IAM 역할에 대한 액세스 권한이 부여되는 KMS 키를 생성합니다. S3 버킷이 제대로 작동하려면 IAM 역할에 대한 액세스 권한도 필요합니다.

1단계: AWS CLI 구성

먼저, AWS CLI가 적절한 자격 증명으로 설치 및 구성되었는지 확인합니다. 터미널을 열고 다음을 실행하세요.

 aws configure

프롬프트에 따라 AWS 액세스 키 ID, 보안 액세스 키, 기본 리전 및 출력 형식을 설정합니다.

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단계: 백업 스크립트 작성

이제 사서함을 10개씩 일괄 내보내는 Python 스크립트를 작성해 보겠습니다. 다음 스크립트를 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 조직 ID, 이메일 매핑에 대한 사용자 ID, S3 버킷 이름, 리전, KMS 키 ARN, 역할 이름 및 AWS 계정 ID로 바꿉니다.


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 으로 편하게 연락주세요. 또한 언제든지 커피를 사주실 수도 있습니다.