Object Lock используется для защиты объектов в S3 от удаления и изменений в течение заданного времени. Эта функция гарантирует неизменность данных на весь период хранения. Object Lock особенно полезен при работе с важными архивами, резервными копиями и другой критичной информацией, которую нужно защитить от случайных или намеренных действий.
Включение Object Lock
Для включения Object Lock перейдите во вкладку «Настройки» и нажмите кнопку «Изменить» напротив пункта «Блокировка объектов отключена».
В открывшемся меню включите блокировку, нажав кнопку «Включить блокировку объектов».
Обратите внимание: при включении блокировки также будет включено версионирование объектов. Отключить блокировку объектов, как и версионирование, невозможно.
Создание бакета с Object Lock
Включить Object Lock можно сразу при создании бакета, но только с помощью сторонних утилит. Рассмотрим пример создания бакета через AWS CLI.
Создадим бакет:
aws s3api create-bucket \
--bucket object-lock-bucket \
--endpoint-url https://s3.twcstorage.ru \
--object-lock-enabled-for-bucket
Также можем создать бакет с холодным классом хранения:
aws s3api create-bucket \
--bucket object-lock-bucket \
--endpoint-url https://s3.twcstorage.ru \
--create-bucket-configuration LocationConstraint=ru:ru-1-cold \
--object-lock-enabled-for-bucket
Указать объем бакета при создании невозможно. При создании бакета через сторонние клиенты всегда устанавливается минимально возможный объем — 10 ГБ для стандартного класса хранения и 1 ГБ для холодного класса. После создания бакета объем можно увеличить через панель управления.
Проверим, что Object Lock активен:
aws s3api get-object-lock-configuration \
--bucket object-lock-bucket \
--endpoint-url https://s3.twcstorage.ru
Ответ будет таким:
{
"ObjectLockConfiguration": {
"ObjectLockEnabled": "Enabled"
}
}
Object Lock работает только с включенным версионированием. Убедимся, что оно активно:
aws s3api get-bucket-versioning \
--bucket object-lock-bucket \
--endpoint-url https://s3.twcstorage.ru
В ответе отобразится статус версионирования:
{
"Status": "Enabled",
"MFADelete": "Disabled"
}
Режимы Object Lock
Object Lock поддерживает два режима блокировки объектов: временную блокировку (Retention Mode) и постоянную блокировку (Legal Hold).
Временная блокировка
Для временной блокировки доступны два режима:
COMPLIANCE — строгий режим защиты. Объект и его версии нельзя удалить или изменить до окончания срока блокировки. Даже с правами администратора и специальными параметрами удалить данные невозможно. Этот режим подходит для сценариев, где критично обеспечить неизменность данных.
GOVERNANCE — гибкий режим защиты. Объекты защищены от удаления и изменений, но пользователи с правами BypassGovernanceRetention
могут удалить данные до истечения срока блокировки. Подходит для защиты от случайных удалений.
Основной пользователь S3 создается с полными правами, включая BypassGovernanceRetention
. Для дополнительных пользователей BypassGovernanceRetention
активен для пользователей с уровнем доступа «Управление». Для пользователей с уровнем доступа «Чтение» BypassGovernanceRetention
можно включить вручную, задав полиси. Для этого создайте файл s3-bypass.json
:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:DeleteObjectVersion",
"s3:BypassGovernanceRetention"
],
"Resource": "arn:aws:s3:::<имя_бакета>/*"
}
]
}
Вместо <имя_бакета>
укажите имя вашего бакета.
Примените полиси:
aws iam put-user-policy \
--user-name <имя__дополнительного_пользователя> \
--policy-name allow-delete-with-bypass \
--policy-document file://s3-bypass.json \
--endpoint-url https://s3.twcstorage.ru
Постоянная блокировка
LEGAL HOLD — гибкая блокировка без срока. Объект или его версию нельзя удалить, пока удержание не будет снято вручную. Блокировка не зависит от даты и действует бессрочно.
Настройка Object Lock
Для Object Lock можно задать настройки, которые будут использоваться по умолчанию для всех загружаемых объектов. Перейдите во вкладку «Настройки» и нажмите кнопку «Изменить» напротив пункта «Блокировка объектов включена».
В открывшемся меню выберите режим блокировки:
- COMPLIANCE
- GOVERNANCE
- Без глобальной политики — при выборе этого пункта для объектов не будет устанавливаться Object Lock без явной установки.
Укажите период, в течение которого объект будет защищен.
Эти настройки задают значения по умолчанию, но не мешают использовать другой режим и срок для отдельного объекта.
Использование временных блокировок
Рассмотрим примеры использования режимов COMPLIANCE и GOVERNANCE.
COMPLIANCE
Загрузим файл с блокировкой на 30 дней:
aws s3api put-object \
--bucket object-lock-bucket \
--key compliance-file.txt \
--body compliance-file.txt \
--object-lock-mode COMPLIANCE \
--object-lock-retain-until-date "$(date -d '+30 days' --utc +%Y-%m-%dT%H:%M:%SZ)" \
--endpoint-url https://s3.twcstorage.ru
Описание параметров:
--bucket
— имя бакета, в который загружается объект.--key
— имя (путь) объекта в бакете.--body
— путь к файлу, который загружается.--object-lock-mode
— режим блокировки.--object-lock-retain-until-date
— дата и время окончания блокировки в форматеYYYY-MM-DDTHH:MM:SSZ
. До этой даты объект защищен от удаления.
Убедимся, что защита применена:
aws s3api get-object-retention \
--bucket object-lock-bucket \
--key compliance-file.txt \
--endpoint-url https://s3.twcstorage.ru
В ответ получим подобный вывод:
{
"Retention": {
"Mode": "COMPLIANCE",
"RetainUntilDate": "2025-04-04T10:02:21.000000000Z"
}
}
Попробуем удалить объект:
aws s3api delete-object \
--bucket object-lock-bucket \
--key compliance-file.txt \
--endpoint-url https://s3.twcstorage.ru
При удалении файл пропадет из раздела «Объекты» в панели управления бакетом и не будет отображаться при просмотре в сторонних клиентах. При таком удалении создается маркер удаления, но сам объект остается в бакете.
Проверим версии объекта:
aws s3api list-object-versions \
--bucket object-lock-bucket \
--prefix compliance-file.txt \
--endpoint-url https://s3.twcstorage.ru
Мы увидим, что версия сохранена и для нее создан маркер.
Удаленную версию можно восстановить по инструкции.
Удаление конкретной версии с активной блокировкой будет невозможно:
aws s3api delete-object \
--bucket object-lock-bucket \
--key compliance-file.txt \
--version-id <VersionId_объекта> \
--endpoint-url https://s3.twcstorage.ru
До истечения срока блокировки команда вернет ошибку:
An error occurred (AccessDenied) when calling the DeleteObject operation: forbidden by object lock
GOVERNANCE
Загрузим файл с блокировкой на 30 дней:
aws s3api put-object \
--bucket object-lock-bucket \
--key governance-file.txt \
--body governance-file.txt \
--object-lock-mode GOVERNANCE \
--object-lock-retain-until-date "$(date -d '+30 days' --utc +%Y-%m-%dT%H:%M:%SZ)" \
--endpoint-url https://s3.twcstorage.ru
Описание параметров:
--bucket
— имя бакета, в который загружается объект.--key
— имя (путь) объекта в бакете.--body
— путь к файлу, который загружается.--object-lock-mode
— режим блокировки.--object-lock-retain-until-date
— дата и время окончания блокировки в форматеYYYY-MM-DDTHH:MM:SSZ
. До этой даты объект защищен от удаления.
Убедимся, что защита применена:
aws s3api get-object-retention \
--bucket object-lock-bucket \
--key governance-file.txt \
--endpoint-url https://s3.twcstorage.ru
В ответ получим подобный вывод:
{
"Retention": {
"Mode": "GOVERNANCE",
"RetainUntilDate": "2025-04-04T10:07:44.000000000Z"
}
}
Попробуем удалить объект:
aws s3api delete-object \
--bucket object-lock-bucket \
--key governance-file.txt \
--endpoint-url https://s3.twcstorage.ru
При удалении файл пропадет из раздела «Объекты» в панели управления бакетом и не будет отображаться при просмотре в сторонних клиентах. При таком удалении создается маркер удаления, но сам объект остается в бакете.
Проверим версии объекта:
aws s3api list-object-versions \
--bucket object-lock-bucket \
--prefix governance-file.txt \
--endpoint-url https://s3.twcstorage.ru
Мы увидим версию объекта и маркер удаления.
Удаленную версию можно восстановить по инструкции.
Полное удаление возможно только с указанием обхода блокировки при помощи параметра --bypass-governance-retention
.
Удаляем объект с обходом блокировки:
aws s3api delete-object \
--bucket object-lock-bucket \
--key governance-file.txt \
--bypass-governance-retention \
--version-id <VersionId_объекта> \
--endpoint-url https://s3.twcstorage.ru
Теперь повторно проверим версии объекта:
aws s3api list-object-versions \
--bucket object-lock-bucket \
--prefix governance-file.txt \
--endpoint-url https://s3.twcstorage.ru
Теперь отобразится только маркер удаления.
Использование постоянной блокировки
В отличие от временной блокировки COMPLIANCE
и GOVERNANCE
, LegalHold
не требует указания срока и действует бессрочно. Объект остается защищенным до тех пор, пока блокировка не будет снята вручную. Это удобно в ситуациях, когда невозможно заранее определить срок хранения данных.
Загрузим файл в бакет с включенным Object Lock:
aws s3api put-object \
--bucket object-lock-bucket \
--key legalhold-file.txt \
--body legalhold-file.txt \
--endpoint-url https://s3.twcstorage.ru
После загрузки включим LegalHold
для объекта:
aws s3api put-object-legal-hold \
--bucket object-lock-bucket \
--key legalhold-file.txt \
--legal-hold "Status=ON" \
--endpoint-url https://s3.twcstorage.ru
Проверим статус блокировки:
aws s3api get-object-legal-hold \
--bucket object-lock-bucket \
--key legalhold-file.txt \
--endpoint-url https://s3.twcstorage.ru
Ожидаемый вывод:
{
"LegalHold": {
"Status": "ON"
}
}
Попробуем удалить объект:
aws s3api delete-object \
--bucket object-lock-bucket \
--key legalhold-file.txt \
--endpoint-url https://s3.twcstorage.ru
Результатом выполнения команды будет установка маркера:
{
"DeleteMarker": true,
"VersionId": "F1IzDfHkrhpMtWUZ7gUcnYPAE2xPQ7w"
}
Проверим версии объекта:
aws s3api list-object-versions \
--bucket object-lock-bucket \
--prefix legalhold-file.txt \
--endpoint-url https://s3.twcstorage.ru
Вы увидите версию и маркер удаления.
Удаленную версию можно восстановить по инструкции.
Попробуем удалить конкретную версию:
aws s3api delete-object \
--bucket object-lock-bucket \
--key legalhold-file.txt \
--version-id <VersionId_объекта> \
--endpoint-url https://s3.twcstorage.ru
Выполнение команды вызовет ошибку.
Чтобы снять блокировку, выполните:
aws s3api put-object-legal-hold \
--bucket object-lock-bucket \
--key legalhold-file.txt \
--legal-hold "Status=OFF" \
--endpoint-url https://s3.twcstorage.ru
После снятия блокировки версию объекта можно будет удалить.