AWSMiddleTechnical

Как защитить S3 от случайного удаления?

Включите Versioning (удаление создаёт маркер, объект восстановим), добавьте Bucket Policy с Deny Delete, при необходимости Object Lock Compliance; репликация в другой регион закрывает катастрофоустойчивость.

Защита S3 от случайного удаления

AWS предоставляет несколько независимых механизмов защиты. Грамотная стратегия использует их в комбинации, потому что каждый закрывает свой класс угроз.

1. Versioning

Включение версионирования означает, что операция DELETE не уничтожает объект физически, а создаёт маркер удаления (delete marker). Восстановить объект можно, удалив этот маркер.

aws s3api put-bucket-versioning \
  --bucket my-critical-bucket \
  --versioning-configuration Status=Enabled

2. MFA Delete

При активном MFA Delete необходимо предоставить OTP-код физического или виртуального MFA-устройства для каждого постоянного удаления версии или выключения версионирования. Включить может только root-аккаунт.

# Только от root через AWS CLI с MFA
aws s3api put-bucket-versioning \
  --bucket my-critical-bucket \
  --versioning-configuration Status=Enabled,MFADelete=Enabled \
  --mfa "arn:aws:iam::123456789012:mfa/root-account-mfa-device 123456"

3. Object Lock (WORM)

Object Lock реализует модель Write Once Read Many. Поддерживает два режима хранения: Governance (можно обойти с правами s3:BypassGovernanceRetention) и Compliance (не может обойти никто, включая root, до истечения срока).

# Включается при создании бакета, потом отключить нельзя
aws s3api create-bucket \
  --bucket immutable-logs \
  --region eu-central-1 \
  --create-bucket-configuration LocationConstraint=eu-central-1

aws s3api put-object-lock-configuration \
  --bucket immutable-logs \
  --object-lock-configuration '{
    "ObjectLockEnabled": "Enabled",
    "Rule": {
      "DefaultRetention": {
        "Mode": "COMPLIANCE",
        "Days": 365
      }
    }
  }'

4. Bucket Policy — запрет удаления

IAM Deny-политика блокирует удаление для всех, кроме выделенной роли администратора.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyDeleteObject",
      "Effect": "Deny",
      "Principal": "*",
      "Action": [
        "s3:DeleteObject",
        "s3:DeleteObjectVersion",
        "s3:DeleteBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-critical-bucket",
        "arn:aws:s3:::my-critical-bucket/*"
      ],
      "Condition": {
        "ArnNotEquals": {
          "aws:PrincipalArn": "arn:aws:iam::123456789012:role/S3AdminRole"
        }
      }
    }
  ]
}

5. S3 Replication как резервная копия

Cross-Region Replication (CRR) или Same-Region Replication (SRR) реплицирует объекты в другой бакет. Если удалите в источнике, реплика останется (Delete replication по умолчанию отключена).

aws s3api put-bucket-replication \
  --bucket my-critical-bucket \
  --replication-configuration file://replication.json

6. S3 Lifecycle — защита через Glacier

Переводите важные объекты в Glacier Deep Archive после N дней. Восстановление занимает время, что даёт буфер для обнаружения случайного удаления.

Рекомендуемая комбинация

  • Versioning — обязательно для всех критичных бакетов.
  • Lifecycle rule на удаление старых версий через 90 дней (чтобы не платить бесконечно).
  • Bucket Policy с Deny Delete для обычных ролей.
  • Object Lock Compliance для юридически значимых данных (финансы, медицина).
  • CRR в другой регион для катастрофоустойчивости.

Подводные камни

  • Versioning не включено по умолчанию: новый бакет не защищён, включать нужно явно.
  • Object Lock нельзя включить постфактум: параметр задаётся только при создании бакета через API или Console.
  • Compliance-режим необратим: установив Compliance lock на год вперёд, удалить объект до истечения срока не сможет никто, включая AWS Support.
  • Стоимость версий растёт незаметно: каждая версия тарифицируется как отдельный объект; без Lifecycle-правил бакет разбухает.
  • Репликация не копирует уже существующие объекты: работает только для новых объектов после включения, для бэкфилла нужен s3 sync вручную.
  • Delete Marker реплицируется: если включить Delete Marker replication, удаление в источнике автоматически распространится на реплику.
  • MFA Delete несовместим с некоторыми SDK: ряд библиотек не умеет передавать MFA-токен при DeleteObject.

Common mistakes

  • Считать versioning полной защитой от удаления всех версий.
  • Не ограничивать lifecycle configuration changes.
  • Включать retention без понимания legal/operational impact.

What the interviewer is testing

  • Называет versioning, Object Lock и IAM/SCP controls.
  • Учитывает audit и restore process.
  • Различает accidental deletion и malicious/admin deletion.

Sources

Related topics