---
title: "Использование Object Lock в S3"
description: "Как использовать Object Lock в S3-хранилище для защиты объектов от удаления и изменений. Документация и инструкции по настройке облачных сервисов Timeweb Cloud."
---

# Object Lock в S3

> Полный индекс документации для ИИ-агентов: [llms.txt](https://timeweb.cloud/llms.txt).

Object Lock используется для защиты объектов в S3 от удаления и изменений в течение заданного времени. Эта функция гарантирует неизменность данных на весь период хранения. Object Lock особенно полезен при работе с важными архивами, резервными копиями и другой критичной информацией, которую нужно защитить от случайных или намеренных действий.

## Включение Object Lock

Для включения Object Lock перейдите во вкладку «Настройки» и нажмите кнопку «Изменить» напротив пункта «Блокировка объектов отключена».

![Image1](https://content.timeweb.com/assets/0c9e3da4-1393-4ee7-b8d2-aefd92a2d66e.png?width=1999&height=1453)

В открывшемся меню включите блокировку, нажав кнопку «Включить блокировку объектов».

Обратите внимание: при включении блокировки также будет включено [версионирование объектов](https://timeweb.cloud/docs/s3-storage/supported-features/s3-object-versioning). Отключить блокировку объектов, как и версионирование, невозможно.

## Создание бакета с Object Lock

Включить Object Lock можно сразу при создании бакета, но только с помощью сторонних утилит. Рассмотрим пример создания бакета через [AWS CLI](https://timeweb.cloud/docs/s3-storage/tools/aws-cli).

Создадим бакет:

```bash
aws s3api create-bucket \
	--bucket object-lock-bucket \
	--endpoint-url https://s3.twcstorage.ru \
	--object-lock-enabled-for-bucket
```

Также можем создать бакет с холодным классом хранения:

```bash
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
```

И с премиальным классом:

```bash
aws s3api create-bucket \
	--bucket object-lock-bucket \
	--endpoint-url https://s3.twcstorage.ru \
	--create-bucket-configuration LocationConstraint=ru:ru-1-standard-ia \
	--object-lock-enabled-for-bucket
```

> [!NOTE]
> Указать объем бакета при создании невозможно. При создании бакета через сторонние клиенты всегда устанавливается минимально возможный объем — 10 ГБ для стандартного класса хранения и 1 ГБ для холодного класса. После создания бакета объем [можно увеличить через панель управления](https://timeweb.cloud/docs/s3-storage/manage-storage/manage-buckets#smena-tarifa).

Проверим, что Object Lock активен:

```bash
aws s3api get-object-lock-configuration \
  --bucket object-lock-bucket \
  --endpoint-url https://s3.twcstorage.ru
```

Ответ будет таким:

```js
{
	"ObjectLockConfiguration": {
    	"ObjectLockEnabled": "Enabled"
	}
}
```

Object Lock работает только с включенным версионированием. Убедимся, что оно активно:

```bash
aws s3api get-bucket-versioning \
  --bucket object-lock-bucket \
  --endpoint-url https://s3.twcstorage.ru
```

В ответе отобразится статус версионирования:

```js
{
	"Status": "Enabled",
	"MFADelete": "Disabled"
}
```

## Режимы Object Lock

Object Lock поддерживает два режима блокировки объектов: временную блокировку (Retention Mode) и постоянную блокировку (Legal Hold).

### Временная блокировка

Для временной блокировки доступны два режима:

**COMPLIANCE** — строгий режим защиты. Объект и его версии нельзя удалить или изменить до окончания срока блокировки. Даже с правами администратора и специальными параметрами удалить данные невозможно. Этот режим подходит для сценариев, где критично обеспечить неизменность данных.

**GOVERNANCE** — гибкий режим защиты. Объекты защищены от удаления и изменений, но пользователи с правами `BypassGovernanceRetention` могут удалить данные до истечения срока блокировки. Подходит для защиты от случайных удалений.

Основной пользователь S3 создается с полными правами, включая `BypassGovernanceRetention`. Для дополнительных пользователей `BypassGovernanceRetention` активен для пользователей с [уровнем доступа «Управление»](https://timeweb.cloud/docs/s3-storage/manage-storage/additional-users#upravlenie). Для пользователей с уровнем доступа «Чтение» `BypassGovernanceRetention` можно включить вручную, задав полиси. Для этого создайте файл `s3-bypass.json`:

```js
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:DeleteObjectVersion",
        "s3:BypassGovernanceRetention"
      ],
      "Resource": "arn:aws:s3:::<имя_бакета>/*"
    }
  ]
}
```

Вместо `<имя_бакета>` укажите имя вашего бакета.

Примените полиси:

```bash
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 можно задать настройки, которые будут использоваться по умолчанию для всех загружаемых объектов. Перейдите во вкладку «Настройки» и нажмите кнопку «Изменить» напротив пункта «Блокировка объектов включена».

![Image3](https://content.timeweb.com/assets/f13d220f-4efd-4f99-924e-6433363a686b.png?width=1998&height=1444)

В открывшемся меню выберите режим блокировки:

-   **COMPLIANCE**
-   **GOVERNANCE**
-   **Без глобальной политики** — при выборе этого пункта для объектов не будет устанавливаться Object Lock без явной установки.

Укажите период, в течение которого объект будет защищен.

Эти настройки задают значения по умолчанию, но не мешают использовать другой режим и срок для отдельного объекта.

## Использование временных блокировок

Рассмотрим примеры использования режимов **COMPLIANCE** и **GOVERNANCE**.

COMPLIANCE

Загрузим файл с блокировкой на 30 дней:

```bash
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`. До этой даты объект защищен от удаления.

Убедимся, что защита применена:

```bash
aws s3api get-object-retention \
  --bucket object-lock-bucket \
  --key compliance-file.txt \
  --endpoint-url https://s3.twcstorage.ru
```

В ответ получим подобный вывод:

```js
{
	"Retention": {
    	"Mode": "COMPLIANCE",
    	"RetainUntilDate": "2025-04-04T10:02:21.000000000Z"
	}
}
```

Попробуем удалить объект:

```bash
aws s3api delete-object \
  --bucket object-lock-bucket \
  --key compliance-file.txt \
  --endpoint-url https://s3.twcstorage.ru
```

При удалении файл пропадет из раздела «Объекты» в панели управления бакетом и не будет отображаться при просмотре в сторонних клиентах. При таком удалении создается маркер удаления, но сам объект остается в бакете.

Проверим версии объекта:

```bash
aws s3api list-object-versions \
  --bucket object-lock-bucket \
  --prefix compliance-file.txt \
  --endpoint-url https://s3.twcstorage.ru
```

Мы увидим, что версия сохранена и для нее создан маркер.

![Image2](https://content.timeweb.com/assets/a90ab580-1f23-4672-9313-0a5410cc7233.png?width=781&height=558)

Удаленную версию можно [восстановить по инструкции](https://timeweb.cloud/docs/s3-storage/supported-features/s3-object-versioning#vosstanovlenie-konkretnoj-versii-obekta).

Удаление конкретной версии с активной блокировкой будет невозможно:

```bash
aws s3api delete-object \
  --bucket object-lock-bucket \
  --key compliance-file.txt \
  --version-id <VersionId_объекта> \
  --endpoint-url https://s3.twcstorage.ru
```

До истечения срока блокировки команда вернет ошибку:

```shell
An error occurred (AccessDenied) when calling the DeleteObject operation: forbidden by object lock
```

GOVERNANCE

Загрузим файл с блокировкой на 30 дней:

```bash
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`. До этой даты объект защищен от удаления.

Убедимся, что защита применена:

```bash
aws s3api get-object-retention \
  --bucket object-lock-bucket \
  --key governance-file.txt \
  --endpoint-url https://s3.twcstorage.ru
```

В ответ получим подобный вывод:

```js
{
	"Retention": {
    	"Mode": "GOVERNANCE",
    	"RetainUntilDate": "2025-04-04T10:07:44.000000000Z"
	}
}
```

Попробуем удалить объект:

```bash
aws s3api delete-object \
  --bucket object-lock-bucket \
  --key governance-file.txt \
  --endpoint-url https://s3.twcstorage.ru
```

При удалении файл пропадет из раздела «Объекты» в панели управления бакетом и не будет отображаться при просмотре в сторонних клиентах. При таком удалении создается маркер удаления, но сам объект остается в бакете.

Проверим версии объекта:

```bash
aws s3api list-object-versions \
  --bucket object-lock-bucket \
  --prefix governance-file.txt \
  --endpoint-url https://s3.twcstorage.ru
```

Мы увидим версию объекта и маркер удаления.

![Image5](https://content.timeweb.com/assets/6f88a2da-d589-433b-90d8-d80a20742150.png?width=766&height=558)

Удаленную версию можно [восстановить по инструкции](https://timeweb.cloud/docs/s3-storage/supported-features/s3-object-versioning#vosstanovlenie-konkretnoj-versii-obekta).

Полное удаление возможно только с указанием обхода блокировки при помощи параметра --`bypass-governance-retention`.

Удаляем объект с обходом блокировки:

```bash
aws s3api delete-object \
  --bucket object-lock-bucket \
  --key governance-file.txt \
  --bypass-governance-retention \
  --version-id <VersionId_объекта> \
  --endpoint-url https://s3.twcstorage.ru
```

Теперь повторно проверим версии объекта:

```bash
aws s3api list-object-versions \
  --bucket object-lock-bucket \
  --prefix governance-file.txt \
  --endpoint-url https://s3.twcstorage.ru
```

Теперь отобразится только маркер удаления.

## Использование постоянной блокировки

В отличие от временной блокировки `COMPLIANCE` и `GOVERNANCE`, `LegalHold` не требует указания срока и действует бессрочно. Объект остается защищенным до тех пор, пока блокировка не будет снята вручную. Это удобно в ситуациях, когда невозможно заранее определить срок хранения данных.

Загрузим файл в бакет с включенным Object Lock:

```bash
aws s3api put-object \
  --bucket object-lock-bucket \
  --key legalhold-file.txt \
  --body legalhold-file.txt \
  --endpoint-url https://s3.twcstorage.ru
```

После загрузки включим `LegalHold` для объекта:

```bash
aws s3api put-object-legal-hold \
  --bucket object-lock-bucket \
  --key legalhold-file.txt \
  --legal-hold "Status=ON" \
  --endpoint-url https://s3.twcstorage.ru
```

Проверим статус блокировки:

```bash
aws s3api get-object-legal-hold \
  --bucket object-lock-bucket \
  --key legalhold-file.txt \
  --endpoint-url https://s3.twcstorage.ru
```

Ожидаемый вывод:

```js
{
  "LegalHold": {
    "Status": "ON"
  }
}
```

Попробуем удалить объект:

```bash
aws s3api delete-object \
  --bucket object-lock-bucket \
  --key legalhold-file.txt \
  --endpoint-url https://s3.twcstorage.ru
```

Результатом выполнения команды будет установка маркера:

```js
{
    "DeleteMarker": true,
    "VersionId": "F1IzDfHkrhpMtWUZ7gUcnYPAE2xPQ7w"
}
```

Проверим версии объекта:

```bash
aws s3api list-object-versions \
  --bucket object-lock-bucket \
  --prefix legalhold-file.txt \
  --endpoint-url https://s3.twcstorage.ru
```

Вы увидите версию и маркер удаления.

![Image4](https://content.timeweb.com/assets/d1e6a9a8-2612-47aa-a8e1-cacb8930bf94.png?width=1080&height=822)

Удаленную версию можно [восстановить по инструкции](https://timeweb.cloud/docs/s3-storage/supported-features/s3-object-versioning#vosstanovlenie-konkretnoj-versii-obekta).

Попробуем удалить конкретную версию:

```bash
aws s3api delete-object \
  --bucket object-lock-bucket \
  --key legalhold-file.txt \
  --version-id <VersionId_объекта> \
  --endpoint-url https://s3.twcstorage.ru
```

Выполнение команды вызовет ошибку.

Чтобы снять блокировку, выполните:

```bash
aws s3api put-object-legal-hold \
  --bucket object-lock-bucket \
  --key legalhold-file.txt \
  --legal-hold "Status=OFF" \
  --endpoint-url https://s3.twcstorage.ru
```

После снятия блокировки версию объекта можно будет удалить.
