paint-brush
Birden Fazla Kullanıcı için AWS WorkMail Yedeklemelerini Nasıl Otomatikleştirdimby@th3n00bc0d3r
238

Birden Fazla Kullanıcı için AWS WorkMail Yedeklemelerini Nasıl Otomatikleştirdim

Muhammad Bilal15m2024/05/27
Read on Terminal Reader

AWS WorkMail; güvenliği, güvenilirliği ve kullanım kolaylığını bir araya getiren güçlü bir e-posta ve takvim hizmetidir. AWS WorkMail'den yararlanan kuruluşlar, e-posta altyapısını yönetmenin karmaşıklığı konusunda endişelenmeden temel faaliyetlerine odaklanabilirler. Bu eğitimde, birden fazla kullanıcı için Amazon WorkMail yedeklemelerini otomatikleştirme ve 10 adede kadar eş zamanlı posta kutusu dışa aktarma işini yönetme sürecinde size yol göstereceğim.
featured image - Birden Fazla Kullanıcı için AWS WorkMail Yedeklemelerini Nasıl Otomatikleştirdim
Muhammad Bilal HackerNoon profile picture
0-item

AWS WorkMail; güvenliği, güvenilirliği ve kullanım kolaylığını birleştiren güçlü bir e-posta ve takvim hizmetidir. AWS hizmetleriyle entegrasyonu ve mevcut e-posta istemcileriyle uyumluluğu, güvenlik ve uyumluluk sağlarken e-posta ve takvim yönetimini kolaylaştırmak isteyen işletmeler için onu cazip bir seçim haline getiriyor. AWS WorkMail'den yararlanan kuruluşlar, e-posta altyapısını yönetmenin karmaşıklığı konusunda endişelenmeden temel faaliyetlerine odaklanabilirler. AWS WorkMail'iniz için güvenilir bir yedekleme sistemi kurmak, e-postalarınızın güvenli ve kolayca kurtarılabilir olmasını sağlamak açısından çok önemlidir. Bu eğitimde, birden fazla kullanıcı için AWS WorkMail yedeklemelerini otomatikleştirme ve 10 adede kadar eş zamanlı posta kutusu dışa aktarma işini yönetme sürecinde size yol göstereceğim. Sağlam bir yedekleme çözümü oluşturmak için AWS hizmetlerini ve Python'u kullanacağız.


Ah! CPANEL posta sunucusunu kullandığımı ve ardından kendi posta sunucuma müdahale ettiğimi hatırlıyorum. 2010'ların başında IP adreslerine sınırlı erişimi olan tek örnekli posta sunucuları sorunsuzdu, ancak dünya çapında giderek daha fazla insan bu sunucuları kullanmaya başladıkça, Comon, hala çok fazla spam ve pazarlama alıyoruz. E-postanızın spam kutusuna düşmemesini sağlamak zordu.


Şirket içinde barındırılan bir posta sunucusu olan AWS WorkMail ile cPanel posta sunucusu arasındaki seçim; bütçe, teknik uzmanlık, ölçeklenebilirlik ihtiyaçları ve güvenlik gereksinimleri gibi çeşitli faktörlere bağlıdır.


  • AWS WorkMail, minimum bakım masrafıyla ölçeklenebilir, güvenli ve yönetilen bir e-posta çözümü arayan işletmeler için idealdir.
  • Kendi Kendine Barındırılan Posta Sunucusu, şirket içi teknik uzmanlığa ve özel özelleştirme ihtiyaçlarına sahip kuruluşlar için uygundur ancak daha yüksek maliyetler ve bakım çalışmaları gerektirir.
  • cPanel Mail Server, kullanıcı dostu bir arayüze ihtiyaç duyan ve bir miktar bakım konusunda rahat olan ve paket barındırma hizmetlerinden yararlanan küçük ve orta ölçekli işletmeler için dengeli bir yaklaşım sunar.


Temel endişelerim her zaman şunlardı;

Güvenlik

  • AWS WorkMail : Aktarım sırasında ve beklemedeyken şifreleme, AWS Key Management Service (KMS) ile entegrasyon ve çeşitli düzenleyici standartlarla uyumluluk gibi yerleşik güvenlik özellikleri sağlar.
  • Kendi Kendine Barındırılan Posta Sunucusu : Güvenlik tamamen yöneticinin uzmanlığına bağlıdır. Tehditlere karşı koruma sağlamak amacıyla şifreleme, spam filtreleme ve düzenli güvenlik güncellemeleri için yapılandırma gerektirir.
  • cPanel Mail Sunucusu : Güvenlik özellikleri sunar ancak güvenlik önlemlerinin uygulanması ve sürdürülmesi sorumluluğu kullanıcıya aittir. cPanel, SSL/TLS yapılandırması, spam filtreleme ve antivirüs için araçlar sağlar, ancak doğru kurulum ve düzenli güncellemeler önemlidir.


Daha sonra AWS imdada yetişti ve 2015'ten beri AWS'yi kullanmaya başladığımdan beri, AWS Hesabımı yedekleyerek yeni bir hesaba geçme durumu dışında işler çok kolaylaştı. Güvenilir bir çözüm bulmak için internette arama yapıyordum çünkü şu an konuştuğumuz kadarıyla AWS WorkMail, e-postanızı yerel bilgisayarınıza veya S3'e yedeklemenin basit bir yolunu sunmuyor ve bu Güvenlik uyumluluğuna göre anlaşılabilir, ancak yine de AWS'nin bunun için bir GUI veya araç sunmasını bekliyorum. Gezinirken kesinlikle ÜCRETLİ araçlarla karşılaştım, bu yüzden kendi aracımı geliştirme yoluna gitmeye karar verdim. AWS ile olan deneyimime dayanarak, sıkı testlerden sonra, politika veya IAM rolü sorunları nedeniyle bir hizmet diğer hizmetle iletişim kuramadığında 9/10 sorunları her zaman ortaya çıkar.


Bu, AWS İş Posta Hesaplarının yedeklerini almakta zorlanan tüm insanlara yaptığım katkıdır.


Yedekleme nasıl çalışır?


Hesabınızda bir IAM Rolü oluşturduk, role AWS WorkMail'den dışa aktarma erişimi sağladık ve ardından S3'e erişmesine izin vermek için aynı role bir politika ekledik. Daha sonra IAM Rolüne erişim izni verilen bir KMS Anahtarı oluştururuz. S3 paketinin düzgün çalışması için IAM rolüne de erişmesi gerekir.

1. Adım: AWS CLI'yi yapılandırın

Öncelikle AWS CLI'nin uygun kimlik bilgileriyle yüklendiğinden ve yapılandırıldığından emin olun. Terminalinizi açın ve çalıştırın:

 aws configure

AWS Erişim Anahtarı Kimliğinizi, Gizli Erişim Anahtarınızı, varsayılan bölgenizi ve çıktı biçiminizi ayarlamak için talimatları izleyin.

2. Adım: Gerekli AWS Kaynaklarını Kurun

Bir IAM rolü, politikalar, bir S3 klasörü ve bir KMS anahtarı oluşturmamız gerekiyor. Aşağıdaki bash betiğini setup_workmail_export.sh olarak kaydedin.

 #!/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

Komut dosyasını yürütülebilir hale getirin ve çalıştırın:

 chmod +x setup_workmail_export.sh ./setup_workmail_export.sh

Adım 3: Yedekleme Komut Dosyasını Yazın

Şimdi posta kutularını 10'lu gruplar halinde dışa aktarmak için Python betiğini yazalım. Aşağıdaki betiği workmail_export.py olarak kaydedin.

 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()

Yer tutucuları gerçek AWS WorkMail kuruluş kimliğiniz, kullanıcı kimliğiniz ile e-posta eşlemeleri, S3 klasör adı, bölge, KMS anahtarı ARN, rol adı ve AWS hesap kimliğiniz ile değiştirin.


Adım 4: Yedekleme Komut Dosyasını Çalıştırın

Boto3'ün kurulu olduğundan emin olun:

 pip install boto3

Ardından Python betiğini yürütün:

 python workmail_export.py 


Posta Kutusunu İçe Aktar

 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()


Bu adımları izleyerek AWS WorkMail posta kutularınızı yedeklemek için 10'a kadar eş zamanlı dışa aktarma işini gerçekleştiren otomatik bir sistem kurdunuz. Bu çözüm, e-postalarınızın, kullanıcı e-postası ve tarihine göre düzenlenen ve bir KMS anahtarıyla şifrelenen bir S3 klasöründe güvenli bir şekilde saklanmasını sağlar. Bu kurulum, kuruluşunuzun e-posta verileri için sağlam ve ölçeklenebilir bir yedekleme stratejisi sağlar.


Github Deposu: https://github.com/th3n00bc0d3r/AWS-WorkMail-Backup


LinkedIn adresimden iletişime geçmekten çekinmeyin, Ayrıca bana her zaman bir kahve ısmarlayabilirsiniz.