Object Lock в S3
Object Lock — это механизм S3 «одна запись, много чтений» (WORM), который предотвращает удаление или перезапись объектов в течение заданного срока. Object Lock особенно полезен при работе с важными архивами, резервными копиями и другой критичной информацией, которую нужно защитить от случайных или намеренных действий.
Когда функция Object Lock активирована, объекты в хранилище блокируются для удаления или изменения на определенный период. Это значит, что даже администратор системы не имеет права удалить или модифицировать объект до окончания установленного срока защиты.
Создание бакета с Object Lock
Object Lock работает в связке с версионированием (Versioning), поэтому их нужно включать одновременно при создании бакета.
Бессрочная блокировка (Legal Hold). Это механизм защиты объектов в объектном хранилище S3, который действует не по времени, а по событию. В отличие от временной блокировки (Retention Period), бессрочная не имеет заранее определенного срока окончания и действует до тех пор, пока ее явным образом не снимут уполномоченные пользователи.
Временная блокировка (Retention Period). Это блокировка на заданный промежуток времени. Так, для объекта указывается срок блокировки (например, 1 год или 365 дней) и в течение этого периода объект остается заблокированным. При этом срок назначается каждому объекту индивидуально в момент его загрузки в бакет и отсчитывается от даты создания объекта. После истечения срока блокировка автоматически снимается, и объект можно будет удалить.
В свою очередь, есть несколько режимов временной блокировки:
Режим Governance (управляемый). Предназначен для сценариев, где требуется защита данных, но с сохранением возможности административного вмешательства. В этом режиме пользователи не могут изменять или удалять заблокированные объекты до истечения срока удержания. Ключевое отличие - пользователь с соответствующими правами может намеренно обойти политику блокировки - например, для удаления объекта в случае операционной необходимости.
Режим Compliance (строгий). Обеспечивает максимальный уровень защиты. Заблокированная в этом режиме версия объекта не может быть перезаписана или удалена ни одним пользователем, включая администратора проекта, до истечения срока хранения.
Шаг 1. Создание бакета с включённым Object Lock
Object Lock нельзя добавить к существующему бакету. Если ваш бакет уже создан без Object Lock, придётся создать новый и перенести в него данные. Рассмотрим пример создания бакета через AWS CLI.
Создадим бакет:
aws s3api create-bucket \
--bucket your-bucket-name-lock \
--object-lock-enabled-for-bucket \
--endpoint-url https://s3.cloud.miran.host
Ключевой параметр --object-lock-enabled-for-bucket. Он одновременно включает Object Lock и версионирование.
Шаг 2. Настройка правила удержания по умолчанию
После создания бакета Object Lock уже включён, но правило удержания по умолчанию не задано. Его нужно настроить, чтобы все новые объекты автоматически получали защиту.
Создадим файл json с правилом Object Lock: режим GOVERNANCE, срок удержания 30 дней
cat > ~/object-lock.json <<'EOF'
{
"ObjectLockEnabled": "Enabled",
"Rule": {
"DefaultRetention": {
"Mode": "GOVERNANCE",
"Days": 30
}
}
}
EOF
Применим правило к текущему бакету your-bucket-name-lock
aws s3api put-object-lock-configuration \
--bucket your-bucket-name-lock \
--object-lock-configuration "$(cat ~/object-lock.json)" \
--endpoint-url https://s3.cloud.miran.host
Шаг 3. Проверка, что все работает
Проверить конфигурацию Object Lock на бакете:
aws s3api get-object-lock-configuration \
--bucket your-bucket-name-lock \
--endpoint-url https://s3.cloud.miran.host
В ответе должно быть "ObjectLockEnabled": "Enabled" и блок Rule с полями Mode и Days.
{
"ObjectLockConfiguration": {
"ObjectLockEnabled": "Enabled",
"Rule": {
"DefaultRetention": {
"Mode": "GOVERNANCE",
"Days": 30
}
}
}
}
Если вы хотите убедится на 100%, что Object Lock работает, можно провести тест.
Создадим тестовый файл и скопируем в бакет с Object Lock
echo "test" > test.txt
aws s3 cp test.txt s3://your-bucket-name-lock/test.txt \
--endpoint-url https://s3.cloud.miran.host
Получим информацию по объекту test.txt
aws s3api get-object-retention \
--bucket your-bucket-name-lock \
--key test.txt \
--endpoint-url https://s3.cloud.miran.host
Ответ должен содержать информацию о типе блокировки и дате ее снятия
{
"Retention": {
"Mode": "GOVERNANCE",
"RetainUntilDate": "2026-11-14T10:24:23.513883+00:00"
}
}
Особая защита: Legal Hold
Помимо срочной блокировки, для объектов можно установить Legal Hold — бессрочную блокировку, которая снимается только вручную. Обычно применяется для юридических разбирательств и аудитов.
aws s3api put-object-legal-hold \
--bucket your-bucket-name-lock \
--key your-object-key \
--legal-hold "Status=ON" \
--endpoint-url https://s3.cloud.miran.host
Legal Hold и срок удержания действуют независимо: даже если срок истёк, объект не удалится, пока Legal Hold в состоянии ON.
Частые вопросы
Можно ли отключить Object Lock после включения?
Нет. Object Lock включается необратимо, версионирование также нельзя приостановить.
Можно ли изменить правило удержания по умолчанию?
Да, но на уже загруженные объекты это не влияет — их срок определяется в момент загрузки.
Действительно ли COMPLIANCE-режим невозможно обойти?
Да. Единственный способ удалить объект в COMPLIANCE до истечения срока — удалить весь аккаунт AWS.