Как защитить 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.