ذخیره بکاپ MySQL در فضای ابری یکی از بنیادی‌ترین تصمیمات معماری در استراتژی حفاظت از داده است که مستقیماً بر RPO، RTO و تاب‌آوری سازمان در برابر تهدیداتی مانند Ransomware، خطای انسانی و خرابی سخت‌افزار اثر می‌گذارد. بکاپ در فضای ابری، فراتر از یک کپی از دیتابیس است؛ یک لایه‌ی دفاعی چندبعدی که شامل Immutability، Versioning، Geo-Redundancy، Encryption at Rest و Access Control می‌شود. در محیط‌های Production، بکاپ محلی در برابر حمله‌ی Ransomware که به‌طور هدفمند بکاپ‌ها را رمزنگاری می‌کند، محافظت نمی‌کند. فضای ابری با Object Lock، امکان ذخیره‌سازی تغییرناپذیر را فراهم می‌کند. در این راهنما، فرآیند مهندسی ذخیره‌سازی بکاپ MySQL در فضای ابری، از انتخاب سرویس تا پیاده‌سازی و اعتبارسنجی، بررسی می‌شود.

در یکی از پروژه‌های سازمانی، سرور MySQL پس از یک حمله‌ی Ransomware رمزنگاری شد. بکاپ‌ها روی همان سرور و روی NAS داخلی ذخیره می‌شدند؛ هر دو از دست رفتند. اگر بکاپ ابری با Object Lock در Compliance Mode وجود داشت، این خسارت قابل پیشگیری بود. این تجربه نشان می‌دهد که محل ذخیره‌سازی بکاپ، به‌اندازه‌ی خود بکاپ اهمیت دارد.

چرا فضای ابری برای بکاپ MySQL

فضای ابری چند مزیت حیاتی برای بکاپ MySQL فراهم می‌کند:

  • جداسازی فیزیکی: بکاپ خارج از سرور اصلی و شبکه‌ی داخلی.
  • مقاومت در برابر Ransomware: با Object Lock و Immutability.
  • Geo-Redundancy: ذخیره‌سازی در چند منطقه.
  • Versioning: نگهداری نسخه‌های تاریخی.
  • مقیاس‌پذیری: بدون محدودیت فضا.
  • دسترسی از هر مکان: برای بازیابی سریع.
  • کاهش هزینه‌ی زیرساخت: بدون نیاز به خرید NAS یا Tape.
  • انطباق: با الزامات GDPR، HIPAA و SOC 2.
  • Durability: S3 با ۱۱ 9s دوام.

Immutability و Object Lock

Object Lock یکی از کلیدی‌ترین ویژگی‌های فضای ابری برای بکاپ MySQL است:

Object Lock در S3

  • Compliance Mode: حتی Root Account نمی‌تواند شیء را حذف کند.
  • Governance Mode: تنها کاربران با مجوز خاص می‌توانند حذف کنند.
  • Retention Period: مدت زمان نگهداری اجباری.
  • Legal Hold: نگهداری بدون تاریخ انقضا.
# فعال‌سازی Object Lock در S3
aws s3api create-bucket 
  --bucket my-backup-bucket 
  --object-lock-enabled-for-bucket

# تنظیم Retention پیش‌فرض
aws s3api put-object-lock-configuration 
  --bucket my-backup-bucket 
  --object-lock-configuration '
  {
    "ObjectLockEnabled": "Enabled",
    "Rule": {
      "DefaultRetention": {
        "Mode": "COMPLIANCE",
        "Days": 30
      }
    }
  }'

Immutability در سایر سرویس‌ها

سرویس ویژگی Immutability
AWS S3 Object Lock (Compliance/Governance)
Google Cloud Storage Bucket Lock + Retention Policy
Azure Blob Immutable Blob Storage
Backblaze B2 Object Lock
Wasabi Object Lock + Compliance

برای مطالعه‌ی بیشتر، پست بکاپ خودکار MySQL روی فضای ابری مرجع کاملی است.

انتخاب Storage Class

انتخاب Storage Class بر هزینه و دسترسی اثر می‌گذارد:

Storage Class دسترسی هزینه مناسب برای
Standard فوری بالا بکاپ روزانه
Standard-IA فوری متوسط بکاپ هفتگی
Glacier Instant فوری پایین‌تر بکاپ ماهانه
Glacier Flexible دقیقه تا ساعت پایین بکاپ فصلی
Glacier Deep Archive ۱۲ ساعت بسیار پایین آرشیو بلندمدت

رمزنگاری بکاپ در فضای ابری

رمزنگاری در دو لایه انجام می‌شود:

۱. رمزنگاری In Transit

# استفاده از HTTPS برای آپلود
aws s3 cp backup.sql.gz.enc s3://bucket/ --sse AES256

# یا با rclone
rclone copy backup.sql.gz.enc remote:bucket --s3-server-side-encryption AES256

۲. رمزنگاری At Rest

  • SSE-S3: رمزنگاری با کلید مدیریت‌شده توسط S3.
  • SSE-KMS: رمزنگاری با کلید KMS.
  • SSE-C: رمزنگاری با کلید مشتری.
  • Client-Side Encryption: رمزنگاری پیش از آپلود.
# رمزنگاری سمت کلاینت با GPG
gpg --symmetric --cipher-algo AES256 
  --output backup.sql.gz.gpg backup.sql.gz

# آپلود با SSE-KMS
aws s3 cp backup.sql.gz.gpg s3://bucket/ 
  --sse-kms-key-id alias/backup-key

مدیریت کلید

  • AWS KMS: مدیریت متمرکز کلید با Audit Log.
  • HashiCorp Vault: مدیریت Secret و کلید.
  • Key Rotation: تغییر دوره‌ای کلید.
  • Separation of Duties: کلید جدا از بکاپ.

Geo-Redundancy و Cross-Region Replication

ذخیره‌سازی در چند منطقه، مقاومت در برابر فاجعه‌های منطقه‌ای را فراهم می‌کند:

# فعال‌سازی Cross-Region Replication
aws s3api put-bucket-replication 
  --bucket my-backup-bucket 
  --replication-configuration '
  {
    "Role": "arn:aws:iam::123456789012:role/S3ReplicationRole",
    "Rules": [
      {
        "ID": "BackupReplication",
        "Status": "Enabled",
        "Priority": 1,
        "Filter": { "Prefix": "mysql/" },
        "Destination": {
          "Bucket": "arn:aws:s3:::my-backup-bucket-dr",
          "StorageClass": "STANDARD_IA"
        }
      }
    ]
  }'

گزینه‌های Geo-Redundancy:

  • Same-Region Replication: در همان منطقه.
  • Cross-Region Replication: در منطقه‌ی دیگر.
  • Multi-Cloud: در ابر دیگر (S3 + Backblaze B2).
  • On-Premise + Cloud: ترکیب محلی و ابری.

Access Control و IAM

دسترسی به بکاپ باید با اصل Least Privilege محدود شود:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::123456789012:role/BackupRole" },
      "Action": [
        "s3:PutObject",
        "s3:PutObjectRetention"
      ],
      "Resource": "arn:aws:s3:::my-backup-bucket/mysql/*"
    },
    {
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:DeleteObject",
      "Resource": "arn:aws:s3:::my-backup-bucket/mysql/*",
      "Condition": {
        "StringNotEquals": {
          "aws:PrincipalArn": "arn:aws:iam::123456789012:role/AdminRole"
        }
      }
    }
  ]
}

اصول Access Control:

  • Separate Accounts: بکاپ در Account جداگانه.
  • MFA Delete: نیاز به MFA برای حذف.
  • IAM Roles: به‌جای Access Key.
  • Bucket Policy: محدودسازی دسترسی.
  • VPC Endpoint: دسترسی از داخل VPC.
  • Audit Log: CloudTrail برای ثبت تمام دسترسی‌ها.

خودکارسازی آپلود

#!/bin/bash
set -euo pipefail

DB_NAME="wordpress"
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}-${DATE}.sql.gz"
ENCRYPTED_FILE="${BACKUP_FILE}.enc"
S3_BUCKET="s3://my-backup-bucket/mysql"

mkdir -p "${BACKUP_DIR}"

# بکاپ
mysqldump --single-transaction --routines --triggers 
  --hex-blob --default-character-set=utf8mb4 
  -u"backup_user" -p"$(cat /etc/mysql/backup.pass)" 
  "${DB_NAME}" | gzip > "${BACKUP_FILE}"

# رمزنگاری
openssl enc -aes-256-cbc -salt -pbkdf2 
  -in "${BACKUP_FILE}" -out "${ENCRYPTED_FILE}" 
  -pass file:/etc/backup.key

# آپلود
aws s3 cp "${ENCRYPTED_FILE}" 
  "${S3_BUCKET}/${DATE}.sql.gz.enc" 
  --storage-class STANDARD_IA 
  --sse-kms-key-id alias/backup-key

# پاک‌سازی محلی
rm -f "${BACKUP_FILE}" "${ENCRYPTED_FILE}"

echo "$(date): Backup uploaded: ${S3_BUCKET}/${DATE}.sql.gz.enc"

Lifecycle Policy و Retention

{
  "Rules": [
    {
      "Id": "BackupLifecycle",
      "Status": "Enabled",
      "Filter": { "Prefix": "mysql/" },
      "Transitions": [
        { "Days": 7, "StorageClass": "STANDARD_IA" },
        { "Days": 30, "StorageClass": "GLACIER_INSTANT_RETRIEVAL" },
        { "Days": 90, "StorageClass": "GLACIER_FLEXIBLE_RETRIEVAL" },
        { "Days": 365, "StorageClass": "DEEP_ARCHIVE" }
      ],
      "Expiration": { "Days": 2555 },
      "NoncurrentVersionExpiration": { "NoncurrentDays": 30 }
    }
  ]
}

مانیتورینگ و Alerting

#!/bin/bash
# بررسی وجود بکاپ امروز
TODAY=$(date +%Y-%m-%d)
COUNT=$(aws s3 ls "s3://my-backup-bucket/mysql/" | grep -c "${TODAY}" || true)

if [ "${COUNT}" -eq 0 ]; then
  curl -X POST https://hooks.slack.com/services/XXX 
    -d '{"text":"ALERT: No MySQL backup for '"${TODAY}"'"}'
fi

# بررسی اندازه‌ی بکاپ
LATEST=$(aws s3 ls "s3://my-backup-bucket/mysql/" --recursive 
  | sort | tail -1 | awk "{print $3}")

if [ "${LATEST}" -lt 1048576 ]; then
  curl -X POST https://hooks.slack.com/services/XXX 
    -d '{"text":"ALERT: Backup too small"}'
fi

ابزارهای Monitoring:

  • CloudWatch: پایش S3 Metrics.
  • CloudTrail: Audit دسترسی‌ها.
  • Healthchecks.io: پایش Cron.
  • Prometheus + Grafana: Dashboard.
  • PagerDuty: Incident Management.

Compliance و انطباق

استاندارد الزامات بکاپ
GDPR Encryption، Right to Erasure، Data Residency
HIPAA Encryption، Access Control، Audit Log
SOC 2 Monitoring، Access Control، Availability
PCI-DSS Encryption، Retention، Access Control
ISO 27001 Disaster Recovery، Audit، Business Continuity

برای مطالعه‌ی بیشتر، پست GDPR و تأثیر آن بر وب‌سایت‌های ایرانی مفید است.

پرسش‌های پرتکرار

آیا فضای ابری برای بکاپ MySQL امن است؟

با رمزنگاری At Rest و In Transit، Object Lock و IAM، بله. امنیت بیشتر از بکاپ محلی است.

چرا Object Lock مهم است؟

Object Lock از حذف بکاپ توسط Ransomware یا خطای انسانی جلوگیری می‌کند.

آیا رمزنگاری In Transit کافی است؟

خیر. رمزنگاری At Rest نیز ضروری است، چون فضای ابری در معرض دسترسی غیرمجاز است.

چند منطقه برای Geo-Redundancy لازم است؟

حداقل دو منطقه. برای سازمان‌های حیاتی، سه منطقه.

آیا Multi-Cloud توصیه می‌شود؟

برای سیستم‌های حیاتی، بله. اما پیچیدگی و هزینه‌ی بیشتری دارد.

چگونه کلید رمزنگاری را مدیریت کنیم؟

با AWS KMS، HashiCorp Vault یا HSM. کلید باید جدا از بکاپ ذخیره شود.

آیا S3 Durability کافی است؟

S3 با ۱۱ 9s Durability، بالاترین سطح است. اما برای مقابله با خطای انسانی و Ransomware، Versioning و Object Lock نیز ضروری است.

اشتباهات رایج

اشتباه علت راه‌حل
عدم Object Lock غفلت از Ransomware Compliance Mode
عدم رمزنگاری At Rest فرض امنیت ابر SSE-KMS یا Client-Side
کلید همراه بکاپ سادگی KMS یا Vault
Storage Class نامناسب هزینه بالا Lifecycle Policy
عدم Cross-Region Replication فرض امنیت منطقه Replication Rule
Access Key به‌جای IAM Role ناآشنایی IAM Role
عدم مانیتورینگ فرض اجرای Cron Alerting
عدم تست بازیابی از ابر فرض موفقیت تست فصلی

ملاحظات پیشرفته

در سطح معماری، ذخیره‌سازی بکاپ ابری نیازمند استراتژی جامع است:

۱. Multi-Cloud Backup: توزیع بین AWS + Backblaze + Wasabi.

۲. Immutable Storage: Object Lock در Compliance Mode.

۳. Air-Gapped Backup: ترکیب ابری و Tape.

۴. Automated Restore Testing: Pipeline CI/CD برای تست.

۵. Encryption Key Management: KMS + Vault + HSM.

۶. Compliance Automation: AWS Config Rules.

۷. Disaster Recovery Plan: مستندسازی و تمرین.

۸. Zero Trust: دسترسی محدود به بکاپ.

برای مطالعه‌ی بیشتر، پست‌های بکاپ خودکار MySQL روی فضای ابری، پشتیبان گیری از mysql، پشتیبان‌گیری امن از دیتابیس، پشتیبان‌گیری ابری چه مزایایی دارد، چرا بیشتر سایت‌ها در روز بحران نمی‌توانند از بکاپ خودشان استفاده کنند، چند نسخه بکاپ باید نگهداری کنیم و راه‌های پیشگیری از حملات باج‌گیر مراجع کاملی هستند.

نتیجه

ذخیره بکاپ MySQL در فضای ابری، یک استراتژی چندلایه است که با Immutability، Encryption، Geo-Redundancy، Access Control و مانیتورینگ، ایمنی داده را در برابر تهدیدات مختلف تضمین می‌کند. Object Lock در Compliance Mode، مقاومت در برابر Ransomware را فراهم می‌کند و Cross-Region Replication، تاب‌آوری منطقه‌ای را تضمین می‌کند. موفقیت در این حوزه، نتیجه‌ی هماهنگی بین MySQL، زیرساخت ابری و استراتژی Disaster Recovery است.

💡 اگر تجربه‌ای در ذخیره بکاپ MySQL در فضای ابری داشته‌اید، برای ما جالب است بدانیم کدام لایه بیشترین اثر را داشت: Object Lock، رمزنگاری یا Geo-Redundancy. تجربه‌ی خودتان را در دیدگاه‌ها بنویسید.