WORM политики

S3-совместимое объектное хранилище на базе Киберинфраструктуры (КИ) от компании "Киберпротект" реализует стандартный S3 API с поддержкой WORM-модели (Write Once, Read Many). Это обеспечивает неизменяемость объектов для бэкапов, архивов и compliance-требований. Ключевые фичи — Object Lock с режимами Governance (GFS) и Compliance, плюс Legal Hold.

Object Lock, Legal Hold и дополнительные механизмы в S3-совместимых хранилищах (включая сервис S3-Хранилище на базе Киберинфраструктуры) реализуют WORM-модель для защиты данных от изменений и удаления.

 

Object Lock

Это основной механизм блокировки версий объектов, предотвращающий их перезапись или удаление на заданный период (retention). Активация возможна только при создании бакета (нельзя включить позже), требует обязательного версионирования. Работает на уровне бакета (дефолтное правило) или отдельного объекта. Retention задаётся в днях или годах с датой истечения (RetainUntilDate). Два режима различаются уровнем строгости.

  • Governance (GFS): Гибкий режим, где администраторы с соответствующими IAM-правами могут сократить retention, обойти блокировку (bypass-governance-retention=true) или удалить объект досрочно. Подходит для тестирования, разработки или ситуаций, где нужна оперативная гибкость без полной потери контроля.
  • Compliance: Строгий режим, соответствующий регуляторным требованиям (например, SEC 17a-4(f), GDPR). Retention можно только продлить, но не сократить; удаление/изменение невозможно до конца срока без специальных root-прав. Идеален для юридических архивов и полной защиты от ransomware или внутренних угроз.

Применение: Защита бэкапов, финансовых отчётов, медицинских данных от случайных/злонамеренных действий. Retention применяется ко всем загружаемым объектам по умолчанию или переопределяется вручную.

Legal Hold

Дополнительная временная блокировка объекта (или его версии) без фиксированного срока retention — снимается вручную. Работает независимо от Object Lock и его режимов, может накладываться поверх существующих retention-правил. Статус: ON/OFF.

  • Особенности: Не зависит от Governance/Compliance — блокирует даже в GFS. Можно применять к конкретной версии объекта. Автоматически продлевает защиту до снятия, игнорируя Lifecycle-политики удаления.

Применение: Юридические расследования, судебные дела, аудит. Позволяет "заморозить" данные на неопределённый срок, пока не завершится процесс (например, eDiscovery).

Другие WORM-механизмы

Это вспомогательные политики, усиливающие Object Lock, но не являющиеся самостоятельными WORM-режимами.

  • Версионирование: Обязательный prerequisite для Object Lock — сохраняет все версии объектов, позволяя блокировать только текущую или указанную. Без него Lock не работает.
  • Lifecycle-политики: Автоматическое перемещение/удаление объектов по правилам (например, в Glacier через 30 дней), но заблокированные (locked) объекты игнорируются до конца retention. (Органичено)
  • IAM-политики: Контроль доступа — в GFS разрешают bypass (права s3:BypassGovernanceRetention), в Compliance — запрещают. Позволяют делегировать права без риска компрометации.

Применение: Автоматизация retention (например, автоматическое продление на год), интеграция с бэкапами (Veeam, Duplicati). Обеспечивает комплексную неизменяемость без ручного вмешательства.

Примеры работы с WORM политиками

Эффективно использовать WORM политики можно как через функционал AWS CLI так и через различные совместимые приложения.

Важно!

1. Некоторые приложения для работы с S3-совместимыми хранилищами в зависимости от версии, редакции или штатного функционала могут либо полностью не поддерживать WORM-политики (Object Lock, Legal Hold и retention), либо предлагать ограниченную их реализацию. Часто полный функционал доступен только в платных версиях или требует дополнительных модулей. Рекомендуется проверять документацию инструментов вроде S3 Browser, Cyberduck или Rclone перед использованием в production-сценариях с неизменяемостью данных.

2. При использовании S3-Хранилища в качестве репозитория для сервисов хранения данных (например, Nextcloud, ownCloud и др.) или бэкапирования (например, Veeam Backup, Zerto, Commvault и др.), применение WORM-политик (Object Lock) на уровне S3 бакета категорически не рекомендуется — это гарантированно приведет к полному отказу систем из-за блокировки операций удаления, перезаписи и ротации, без которых backup-архитектура просто не работает.

3. IAM-политики Compliance – устанавливают жесткую блокировку, которую снять невозможно до истечения срока установленной политикой.

4. Lifecycle-политики – в рамках сервиса S3-Хранилище поддерживается ограничено, только процедура удаления (Expiration), удаление версий по истечении заданного количества дней (NonCurrentVersionExpiration). Перемещение (Transition в Glacier) – Не поддерживается. https://docs.cyberprotect.ru/ru-RU/CyberInfrastructure/6.7/admin/#supported-amazon-s3-object-expiration-actions.html

Примеры применения WORM-политик AWS CLI (PowerShell)

Перед началом работы рекомендуем ознакомиться с базовыми операциями AWS CLI: https://cloud.softline.ru/faq/s3-hranilische-faq/osnovnye-operatsii/#aws-cli

 

Пример 1

Создание бакета с автоматической блокировкой объектов на 30 дней в Governance-режиме (GFS).

Создать бакет с Object Lock («my-ki-bucket» – наименование бакета)

                      aws s3api create-bucket --bucket my-ki-bucket --object-lock-enabled-for-bucket

 

Включите версионирование (обязательно для Object Lock)

                      aws s3api put-bucket-versioning --bucket my-ki-bucket --versioning-configuration Status=Enabled

 

Настройка retention-правило (GFS, 30 дней)

                      aws s3api put-object-lock-configuration --bucket my-ki-bucket --object-lock-configuration '{\"ObjectLockEnabled\":\"Enabled\",\"Rule\":{\"DefaultRetention\":{\"Mode\":\"GOVERNANCE\",\"Days\":30}}}'

 

Проверка результата

                      aws s3api get-object-lock-configuration --bucket my-ki-bucket

 

Результат:

                      {

                         "ObjectLockConfiguration": {

                              "ObjectLockEnabled": "Enabled",

                              "Rule": {

                                  "DefaultRetention": {

                                      "Mode": "GOVERNANCE",

                                      "Days": 30

                                 }

                              }

                          }

                      }

 

Пример 2

Загрузка объекта с пользовательским retention (переопределение политики по умолчанию – 30 дней)

 

                      aws s3api put-object --bucket my-ki-bucket --key backup-2026-03-16.zip --body "C:\BCS.txt" --object-lock-mode GOVERNANCE --object-lock-retain-until-date "2026-06-16T00:00:00Z"

 

Вы могли обратить внимание на приведенную форму задания ключа блокировки «--key backup-2026-03-16.zip» - это принятый формат для обозначения архивов, и влияет только на отображение. Использование ключа в формате иных расширений так же допустимо к примеру «--key backup1-2026-03-16.txt»
К примеру, загрузим тот же, но переименованный файл, взяв наименование ключа блокировки «--key backup-2026-03-16.txt»

                      aws s3api put-object --bucket my-ki-bucket --key backup-2026-03-16.txt --body "C:\BCS1.txt" --object-lock-mode GOVERNANCE --object-lock-retain-until-date "2026-06-16T00:00:00Z"

 

В S3 Browser мы увидим отображение объектов с включенной блокировкой (Object Lock в режиме GOVERNANCE до 16 июня 2026 г.) с отображением иконок файлов заданного расширения в ключе блокировки.


Сами же объекты BCS.txt и BCS1.txt хранятся на S3 как есть, получить метаданные (Content-Length и Content-Type) можно через запрос по установленному ключу


Проверка результата

                      aws s3api head-object --bucket my-ki-bucket --key backup-2026-03-16.zip

 

Результат:

                      {

                          "LastModified": "2026-03-16T17:09:08+00:00",

                         "ContentLength": 85276,

                         "ETag": "\"ed77103c4f40a4ea68122b9cdc79f193\"",

                          "VersionId": "FFF9B2D8B91F7527",

                          "ContentEncoding": "aws-chunked",

                          "Metadata": {},

                          "StorageClass": "STANDARD",

                          "ObjectLockMode": "GOVERNANCE",

                          "ObjectLockRetainUntilDate": "2026-06-16T00:00:00+00:00"

                      }

 

Проверка результата

                      aws s3api head-object --bucket my-ki-bucket --key backup-2026-03-16.txt

 

Результат:

                      {

                          "LastModified": "2026-03-16T17:31:35+00:00",

                          "ContentLength": 85276,

                          "ETag": "\"ed77103c4f40a4ea68122b9cdc79f193\"",

                          "VersionId": "FFF9B2D868CD77F2",

                          "ContentEncoding": "aws-chunked",

                          "Metadata": {},

                          "StorageClass": "STANDARD",

                          "ObjectLockMode": "GOVERNANCE",

                          "ObjectLockRetainUntilDate": "2026-06-16T00:00:00+00:00"

                      }

 

Как Вы могли заметить при выводе мы потеряли наименование исходного файла – оно потеряно навсегда. S3 – это объектное хранилище, а не файловая система. Храниться «--body» = байты содержимого, «--key» = единственное имя в S3.

Что бы сохранить наименование исходного файла, можно как отобразить его в наименовании ключа, так и обозначив в Metadata информацию о хранимом исходном объекте

Загрузим новый файл "BCS2.txt" со старым ключём --key "backup-2026-03-16.but", но добавим метки в "Metadata"

                      aws s3api put-object --bucket my-ki-bucket --key "backup-2026-03-16.but" --body "C:\BCS2.txt" --metadata "original-filename=BCS.txt,source=DesktopPC" --object-lock-mode GOVERNANCE --object-lock-retain-until-date "2026-06-16T00:00:00Z"

 

Проверка результата

                      ws s3api head-object --bucket my-ki-bucket --key backup-2026-03-16.but

 

Результат:

                      {

                          "LastModified": "2026-03-16T18:01:22+00:00",

                          "ContentLength": 85276,

                          "ETag": "\"ed77103c4f40a4ea68122b9cdc79f193\"",

                          "VersionId": "FFF9B2D7FE5628CB",

                          "ContentEncoding": "aws-chunked",

                          "Metadata": {

                              "original-filename": "BCS2.txt",

                              "source": "DesktopPC"

                          },

                          "StorageClass": "STANDARD",

                          "ObjectLockMode": "GOVERNANCE",

                          "ObjectLockRetainUntilDate": "2026-06-16T00:00:00+00:00"

                      }

 

Если при создании ключа не была указана "Metadata" для существующего объекта с Object Lock GOVERNANCE, то просто дописать метаданные не получиться, но можно копировать объект сам на себя с новыми метаданными.

 

                      aws s3api copy-object --bucket my-ki-bucket --key "backup-2026-03-16.zip" --copy-source "my-ki-bucket/backup-2026-03-16.zip" --metadata "original-filename=BCS.txt,source=Desktop" --metadata-directive REPLACE --object-lock-mode GOVERNANCE --object-lock-retain-until-date "2026-06-16T00:00:00Z"

 

Проверка результата

                      aws s3api head-object --bucket my-ki-bucket --key backup-2026-03-16.zip

 

Результат:

 

                      {

                          "LastModified": "2026-03-16T18:10:51+00:00",

                          "ContentLength": 85276,

                          "ETag": "\"ed77103c4f40a4ea68122b9cdc79f193\"",

                          "VersionId": "FFF9B2D7DC640B46",

                          "Metadata": {

                              "original-filename": "BCS.txt",

                              "source": "Desktop"

                          },

                          "StorageClass": "STANDARD",

                          "ObjectLockMode": "GOVERNANCE",

                         "ObjectLockRetainUntilDate": "2026-06-16T00:00:00+00:00"

                      }

 

 

Пример 3

Загрузка с Legal Hold + Retention. Создаём объект с двойной защитой — 1 год Compliance retention (нельзя изменить/удалить) + Legal Hold (вечная заморозка до ручного снятия).

                      aws s3api put-object --bucket my-ki-bucket --key "legal-BCS.txt" --body "C:\BCS3.txt" --metadata "original-filename=BCS3.txt,source=Desktop,protection=legal" --object-lock-mode COMPLIANCE --object-lock-retain-until-date "2027-03-16T00:00:00Z"

Проверка результата

                      aws s3api head-object --bucket my-ki-bucket --key legal-BCS.txt

Результат:

                      {

                          "LastModified": "2026-03-16T18:22:08+00:00",

                          "ContentLength": 85276,

                          "ETag": "\"ed77103c4f40a4ea68122b9cdc79f193\"",

                          "VersionId": "FFF9B2D7B40A1297",

                         "ContentEncoding": "aws-chunked",

                          "Metadata": {

                             "original-filename": "BCS3.txt",

                              "protection": "legal",

                             "source": "Desktop"

                          },

                          "StorageClass": "STANDARD",

                          "ObjectLockMode": "COMPLIANCE",

                          "ObjectLockRetainUntilDate": "2027-03-16T00:00:00+00:00"

                      }

 

Добавим Legal Hold — это бессрочная защита конкретной версии объекта S3, которая не имеет даты окончания.

                      aws s3api put-object-legal-hold --bucket my-ki-bucket --key "legal-BCS.txt" --legal-hold Status=ON

Проверка результата

                      aws s3api head-object --bucket my-ki-bucket --key legal-BCS.txt

Результат:

                      {

                          "LastModified": "2026-03-16T18:22:08+00:00",

                          "ContentLength": 85276,

                          "ETag": "\"ed77103c4f40a4ea68122b9cdc79f193\"",

                          "VersionId": "FFF9B2D7B40A1297",

                          "Metadata": {},

                          "StorageClass": "STANDARD",

                          "ObjectLockMode": "COMPLIANCE",

                          "ObjectLockRetainUntilDate": "2027-03-16T00:00:00+00:00",

                          "ObjectLockLegalHoldStatus": "ON"

                      }

 

Как могли заметить не отображаются ранее установленные метаданные, они всё ещё существуют, но не отображаются в head-object после установки Legal Hold из-за ограничений прав IAM. Даже если Legal Hold отключить «Status=OFF» метаданные не отобразятся – баг AWS CLI.

Что бы вернуть метаданные потребуется воспользоваться обходным вариантом копирования объекта самого на себя

                      aws s3api copy-object --bucket my-ki-bucket --key "legal-BCS.txt" --copy-source "my-ki-bucket/legal-BCS.txt" --metadata "original-filename=BCS3.txt,protection=legal,source=Desktop" --metadata-directive REPLACE

Проверка:

                      aws s3api head-object --bucket my-ki-bucket --key legal-BCS.txt

 

Результат:

                      {

                          "LastModified": "2026-03-16T18:34:37+00:00",

                          "ContentLength": 85276,

                         "ETag": "\"ed77103c4f40a4ea68122b9cdc79f193\"",

                          "VersionId": "FFF9B2D78766FF0A",

                          "Metadata": {

                              "original-filename": "BCS3.txt",

                              "protection": "legal",

                              "source": "Desktop"

                          },

                          "StorageClass": "STANDARD",

                          "ObjectLockMode": "GOVERNANCE",

                          "ObjectLockRetainUntilDate": "2026-04-15T18:34:37+00:00"

                      }

 

Пример 4

Compliance-режим с retention

Устанавливаем политику полгода Compliance (182 дня) для всего бакета. Все новые объекты автоматически блокируются на 182 дня с начал загрузки - RetainUntilDate считается индивидуально для каждой версии объекта.

                      aws s3api put-object-lock-configuration --bucket my-ki-bucket --object-lock-configuration "ObjectLockEnabled=Enabled,Rule={DefaultRetention={Mode=COMPLIANCE,Days=182}}"

Проверка

                      aws s3api get-object-lock-configuration --bucket my-ki-bucket

 

Результат:

                      {

                          "ObjectLockConfiguration": {

                              "ObjectLockEnabled": "Enabled",

                              "Rule": {

                                  "DefaultRetention": {

                                      "Mode": "COMPLIANCE",

                                      "Days": 182

                                  }

                              }

                          }

                      }

 

Важно! Нельзя полностью отключить Object Lock с бакета! Это необратимая настройка AWS.

 

Пример 5

Lifecycle-политики с Object Lock

Создаём бакет my-ki-bucket-life с Object Lock + Lifecycle правилами Expiration (удаление текущих объектов) и NonCurrentVersionExpiration (удаление старых версий). Заблокированные объекты игнорируются до конца retention.

Создать бакет с Object Lock

                      aws s3api create-bucket --bucket my-ki-bucket-life --object-lock-enabled-for-bucket

Включить версионирование (обязательно)

                      aws s3api put-bucket-versioning --bucket my-ki-bucket-life --versioning-configuration Status=Enabled

Политика: 90 дней Governance по умолчанию

                      aws s3api put-object-lock-configuration --bucket my-ki-bucket-life --object-lock-configuration '{\"ObjectLockEnabled\":\"Enabled\",\"Rule\":{\"DefaultRetention\":{\"Mode\":\"GOVERNANCE\",\"Days\":90}}}'

Далее нам потребуется создать Lifecycle конфигурации (JSON файл). Для удобства создадим файл lifecycle.json с содержимыми:

                      {

                        "Rules": [

                          {

                            "ID": "ExpireCurrentObjects",

                            "Status": "Enabled",

                            "Filter": { "Prefix": "" },

                            "Expiration": { "ExpiredObjectDeleteMarker": true, "Days": 30 }

                          },

                          {

                            "ID": "ExpireNonCurrentVersions",

                            "Status": "Enabled",

                            "Filter": { "Prefix": "" },

                            "NoncurrentVersionExpiration": { "NoncurrentDays": 7 }

                          }

                        ]

                      }

 

После чего подгрузим конфигурацию
                      aws s3api put-bucket-lifecycle-configuration --bucket my-ki-bucket-life --lifecycle-configuration file://C:\lifecycle.json

Проверка:

                      aws s3api get-bucket-lifecycle-configuration --bucket my-ki-bucket-life

Результат:

                      {

                          "Rules": [

                              {

                                  "Expiration": {

                                      "Days": 30,

                                      "ExpiredObjectDeleteMarker": true

                                  },

                                  "ID": "ExpireCurrentObjects",

                                  "Filter": {

                                      "Prefix": ""

                                  },

                                  "Status": "Enabled"

                              },

                              {

                                  "ID": "ExpireNonCurrentVersions",

                                  "Filter": {

                                      "Prefix": ""

                                  },

                                  "Status": "Enabled",

                                  "NoncurrentVersionExpiration": {

                                      "NoncurrentDays": 7

                                  }

                              }

                          ]

                      }

 

Для проверки функционала загрузим тестовый файл

                      aws s3api put-object --bucket my-ki-bucket-life --key "test-life.txt" --body "C:\BCS4.txt"

Выполним перезапись (создадим non-current версию – другой файл)

                      aws s3api put-object --bucket my-ki-bucket-life --key "test-life.txt" --body "C:\BCS5.txt"

Выполним просмотр версий

                      aws s3api list-object-versions --bucket my-ki-bucket-life --prefix "test-life.txt" --output table



Соответственно через 7+ дней мы увидим, что:

  • Current версия: Удалена (Expiration 30 дней)
  • Non-current версия: Удалена (NonCurrentVersionExpiration 7 дней)
  • Object Lock версии: остануться до конца retention (90 дней)

Примеры применения WORM-политик S3 Browser

Работа с WORM-политиками также доступна в различных S3-совместимых приложениях. Однако функциональность зависит от версии, редакции или штатного функционала — приложения могут либо полностью не поддерживать WORM-политики (Object Lock, Legal Hold и retention), либо предлагать ограниченную их реализацию. Часто полный функционал доступен только в платных версиях или требует дополнительных модулей.

В данном разделе рассмотрим возможности работы с WORM-политиками на примере S3 Browser в бесплатной версии (Pro Free). Эта версия поддерживает просмотр статусов, создание бакетов с Object Lock и базовое управление.

 

Пример 1

Создаем новый бакет с Object Lock (Governance, 30 дней) в S3 Browser. В таком бакете с меткой "Object Lock: Enabled" новые объекты, помещаемые в бакет автоматически принимают статус «locked» на 30 дней – необратимо.

  1. «New Bucket» – указываем Bucket name
  2. Включаем отображение расширенных настроек «Show more settings», активируем опцию «Enable S3 Object Locl»
  3. Открываем конфигурацию настроек удержания «Configure default retention». В открывшемся окне активируем опцию «Enable Object Lock». Выбираем гибкий режим блокировки (GFS) «Gowernance mod» - что позволит администраторам досрочно удалить или изменить retention locked-объектов. Если выбрать «Compliance mode» - активируется строгий режим соответствия регуляторным требованиям (Retention можно только продлить, но не сократить; удаление/изменение невозможно до конца срока даже для администраторов).

Далее устанавливаем «Retention period» - в данном примере 30 дней.

  1. Подтверждаем конфигурацию «OK», подтверждаем создание бакета «Create new bucket»


Если необходимо применить политики удержания к уже существующему бакету, то нажмите правой клавишей мыши на целевой бакет, в открывшемся меню выберите раздел «Objekt Lock» и активируйте подходящие функции:

Default retention settings – устанавливает период хранения по умолчанию на уровне бакета – будет применяться для всех объектов в бакете автоматически.

Update retention for all objects – применяет\изменяет\ обновляет режим хранения для всех существующих объектов в бакете

Update legal hold for all objects - Устанавливает/снимает Legal Hold для всех объектов или выбранных версий (бессрочная защита).  Status: ON (заморозка) / OFF (разблокировка)

 

Пример 2

Включение версионирования.

Хотя Free версия S3-Browser не позволяет устанавливать «LifeCycle», тем не менее позволяет включать версионирование на уровне бакета, для это нажмите правой клавишей мыши на целевой бакет, в открывшемся меню выберите пункт «Edit Versioning Settings» и активируйте «Enable versioning for my-bucket», нажмите «OK» для подтверждения.

Версии объектов будут отображаться в разделе «Versions» нижнего меню.

Пример 3

Применение политик удержания и блокировки на уровне отдельного объекта в бакете. Для реализации нажмите правой клавишей мыши на целевой объект, в открывшемся меню выберите раздел «Objekt Lock» и активируйте подходящие функции:

Retention – позволяет установить режим удержания «Gowernance mod» (GFS) – режим гибкой блокировки, 1.        «Compliance mode» - активируется строгий режим соответствия регуляторным требованиям (Retention можно только продлить, но не сократить; удаление/изменение невозможно до конца срока даже для администраторов).

Legal hold - Устанавливает/снимает Legal Hold для всех объектов или выбранных версий (бессрочная защита).  Status: ON (заморозка) / OFF (разблокировка)

Консультация WORM политики

Не нашли инструкцию?

Заполните форму, и наш специалист свяжется с вами.

Мы дополним информацию и ответим на ваш вопрос.

Оставить заявку

Введение в сервис S3 хранилище

Основные возможности и ограничения

Основные операции