Шифрование на стороне сервера
В этом сценарии вы включите шифрование для бакета. В качестве ключа симметричного шифрования будет использоваться ключ Yandex Key Management Service. Все новые объекты в бакете будут шифроваться указанным ключом по схеме envelope encryption.
Чтобы работать с объектами в зашифрованном бакете, у пользователя или сервисного аккаунта вместе с ролью storage.configurer
должны быть следующие роли на ключ шифрования:
kms.keys.encrypter
— для чтения ключа, шифрования и загрузки объектов;kms.keys.decrypter
— для чтения ключа, расшифровки и скачивания объектов;kms.keys.encrypterDecrypter
— включает разрешения, предоставляемые ролямиkms.keys.encrypter
иkms.keys.decrypter
.
Подробнее см. Сервисные роли Key Management Service.
Чтобы включить шифрование бакета на стороне сервера:
Если шифровать новые объекты в бакете больше не требуется, отключите шифрование.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки бакета с шифрованием входит:
- плата за хранение данных в бакете (см. тарифы Object Storage);
- плата за операции с данными (см. тарифы Object Storage);
- плата за использование ключей KMS (см. тарифы Key Management Service).
Создайте бакет
Вы можете создать новый бакет или использовать существующий. Чтобы создать бакет, выполните:
-
В консоли управления
выберите каталог, в котором хотите создать бакет. -
В списке сервисов выберите Object Storage.
-
Нажмите кнопку Создать бакет.
-
В поле Имя укажите имя бакета.
Имя должно удовлетворять требованиям:
- Длина имени должна быть от 3 до 63 символов.
- Имя может содержать строчные буквы латинского алфавита, цифры, дефисы и точки.
- Первый и последний символы должны быть буквами или цифрами.
- Символы справа и слева от точки должны быть буквами или цифрами.
- Имя не должно иметь вид IP-адреса (например
10.1.3.9
).
-
Укажите максимальный размер бакета в ГБ.
-
В полях Доступ на чтение объектов, Доступ к списку объектов и Доступ на чтение настроек выберите Ограниченный.
-
Нажмите кнопку Создать бакет.
-
Если у вас еще нет AWS CLI, установите и сконфигурируйте его.
-
Выполните команду:
aws s3 mb s3://<имя_бакета> --endpoint-url=https://storage.yandexcloud.net
Результат:
make_bucket: <имя_бакета>
Примечание
Terraform взаимодействует с Object Storage от имени сервисного аккаунта. Назначьте сервисному аккаунту нужную роль, например storage.admin
, на каталог, в котором будут создаваться ресурсы.
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Опишите ресурсы в конфигурационном файле. Чтобы задать параметры, в данном сценарии используется блок
locals
:locals { cloud_id = "<идентификатор_облака>" folder_id = "<идентификатор_каталога>" oauth = "<OAuth>" zone = "ru-central1-a" sa_name = "new-buckets-account" sa_desc = "Аккаунт для управления бакетами Object Storage" sa_key_desc = "Статический ключ для ${local.sa_name}" bucket_name = "Имя бакета" # Имя создаваемого бакета. Если не задавать имя бакета для ресурса `yandex_storage_bucket`, имя будет сгенерировано автоматически. } terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } } provider "yandex" { token = local.oauth cloud_id = local.cloud_id folder_id = local.folder_id zone = local.zone } resource "yandex_iam_service_account" "buckets-account" { name = local.sa_name description = local.sa_desc } resource "yandex_resourcemanager_folder_iam_member" "buckets-account-role" { folder_id = local.folder_id role = "editor" member = "serviceAccount:${yandex_iam_service_account.buckets-account.id}" } resource "yandex_iam_service_account_static_access_key" "buckets-account-key" { service_account_id = "${yandex_iam_service_account.buckets-account.id}" description = local.sa_key_desc } resource "yandex_storage_bucket" "test" { bucket = local.bucket_name access_key = "${yandex_iam_service_account_static_access_key.buckets-account-key.access_key}" secret_key = "${yandex_iam_service_account_static_access_key.buckets-account-key.secret_key}" }
Более подробную информацию о ресурсах, которые вы можете создать с помощью Terraform
, см. в документации провайдера . -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание ресурсов.
После выполнения команды Terraform обновит или создаст в указанном каталоге следующие ресурсы:
- Сервисный аккаунт
new-buckets-account
. - Роль
editor
для сервисного аккаунтаnew-buckets-account
. - Статический ключ для сервисного аккаунта.
- Бакет.
Проверить появление ресурсов можно в консоли управления
. - Сервисный аккаунт
-
Создайте ключ
Создайте новый ключ или используйте существующий. Чтобы создать новый ключ:
-
В консоли управления
выберите каталог, в котором хотите создать ключ. -
В списке сервисов выберите Key Management Service.
-
Нажмите кнопку Создать ключ.
-
В открывшемся окне:
- В поле Имя укажите
bucket-key
. - В поле Алгоритм шифрования выберите
AES-256
. - В поле Период ротации, дни выберите период ротации
7 дней
. - Нажмите кнопку Создать.
- В поле Имя укажите
Вместе с ключом создается его первая версия: нажмите на ключ в списке, чтобы открыть страницу с его атрибутами.
Выполните команду:
yc kms symmetric-key create \
--name bucket-key \
--default-algorithm aes-256 \
--rotation-period 168h
Где:
-
--name
— имя ключа. -
--default-algorithm
— алгоритм шифрования:aes-128
,aes-192
илиaes-256
. -
--rotation-period
— период ротации ключа. Значение задается в часах, минутах и секундах и не может быть менее 24 часов. Например:--rotation-period 27h14m27s
.Чтобы создать ключ без автоматической ротации, не указывайте параметр
--rotation-period
.
Вместе с ключом создается его первая версия. Она указана в поле primary_version
.
-
Опишите ресурсы в конфигурационном файле. Чтобы задать параметры, в данном сценарии используется блок
locals
:locals { cloud_id = "<идентификатор_облака>" folder_id = "<идентификатор_каталога>" oauth = "<OAuth>" zone = "ru-central1-a" sa_name = "new-buckets-account" sa_desc = "Аккаунт для управления бакетами Object Storage" sa_key_desc = "Статический ключ для ${local.sa_name}" key_name = "bucket-key" # Имя ключа KMS. key_desc = "Ключ для шифрования бакетов" bucket_name = "Имя бакета" } terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } } provider "yandex" { token = local.oauth cloud_id = local.cloud_id folder_id = local.folder_id zone = local.zone } resource "yandex_iam_service_account" "buckets-account" { name = local.sa_name description = local.sa_desc } resource "yandex_resourcemanager_folder_iam_member" "buckets-account-role" { folder_id = local.folder_id role = "editor" member = "serviceAccount:${yandex_iam_service_account.buckets-account.id}" } resource "yandex_iam_service_account_static_access_key" "buckets-account-key" { service_account_id = "${yandex_iam_service_account.buckets-account.id}" description = local.sa_key_desc } resource "yandex_kms_symmetric_key" "key-a" { name = local.key_name description = local.key_desc default_algorithm = "AES_256" rotation_period = "168h" } resource "yandex_storage_bucket" "test" { bucket = local.bucket_name access_key = "${yandex_iam_service_account_static_access_key.buckets-account-key.access_key}" secret_key = "${yandex_iam_service_account_static_access_key.buckets-account-key.secret_key}" }
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание ресурсов.
После выполнения команды Terraform обновит или создаст в указанном каталоге следующие ресурсы:
- Сервисный аккаунт
new-buckets-account
. - Роль
editor
для сервисного аккаунтаnew-buckets-account
. - Статический ключ для сервисного аккаунта.
- Ключ KMS с названием
bucket-key
. - Бакет.
Проверить появление ресурсов можно в консоли управления
. - Сервисный аккаунт
-
Воспользуйтесь методом create для ресурса SymmetricKey
.
Включите шифрование
Чтобы включить шифрование бакета ключом KMS, выполните следующее:
- В консоли управления
выберите каталог, в котором находится бакет. - В списке сервисов выберите Object Storage.
- Выберите бакет, созданный ранее.
- На панели слева выберите Безопасность.
- Откройте вкладку Шифрование.
- В поле Ключ KMS выберите ключ
bucket-key
. - Нажмите кнопку Сохранить.
Выполните команду:
aws s3api put-bucket-encryption \
--bucket <имя_бакета> \
--endpoint-url=https://storage.yandexcloud.net \
--server-side-encryption-configuration '{
"Rules": [
{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "<идентификатор_ключа_KMS>"
},
"BucketKeyEnabled": true
}
]
}'
-
Опишите ресурсы в конфигурационном файле. Чтобы задать параметры, в данном сценарии используется блок
locals
:locals { cloud_id = "<идентификатор_облака>" folder_id = "<идентификатор_каталога>" oauth = "<OAuth>" zone = "ru-central1-a" sa_name = "new-buckets-account" sa_desc = "Аккаунт для управления бакетами Object Storage" sa_key_desc = "Статический ключ для ${local.sa_name}" key_name = "bucket-key" # Имя ключа KMS. key_desc = "Ключ для шифрования бакетов" bucket_name = "Имя бакета" # Имя бакета. } terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } } provider "yandex" { token = local.oauth cloud_id = local.cloud_id folder_id = local.folder_id zone = local.zone } resource "yandex_iam_service_account" "buckets-account" { name = local.sa_name description = local.sa_desc } resource "yandex_resourcemanager_folder_iam_member" "buckets-account-role" { folder_id = local.folder_id role = "editor" member = "serviceAccount:${yandex_iam_service_account.buckets-account.id}" } resource "yandex_iam_service_account_static_access_key" "buckets-account-key" { service_account_id = "${yandex_iam_service_account.buckets-account.id}" description = local.sa_key_desc } resource "yandex_kms_symmetric_key" "key-a" { name = local.key_name description = local.key_desc default_algorithm = "AES_256" rotation_period = "168h" } resource "yandex_storage_bucket" "test" { bucket = local.bucket_name access_key = "${yandex_iam_service_account_static_access_key.buckets-account-key.access_key}" secret_key = "${yandex_iam_service_account_static_access_key.buckets-account-key.secret_key}" server_side_encryption_configuration { rule { apply_server_side_encryption_by_default { kms_master_key_id = yandex_kms_symmetric_key.key-a.id sse_algorithm = "aws:kms" } } } }
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание ресурсов.
После выполнения команды Terraform обновит или создаст в указанном каталоге следующие ресурсы:
- Сервисный аккаунт
new-buckets-account
. - Роль
editor
для сервисного аккаунтаnew-buckets-account
. - Статический ключ для сервисного аккаунта.
- Ключ KMS с названием
bucket-key
. - Бакет с шифрованием.
Проверить появление ресурсов можно в консоли управления
. - Сервисный аккаунт
-
В результате все новые объекты в бакете будут шифроваться ключом bucket-key
.
Отключите шифрование
Если шифровать новые объекты в бакете больше не требуется, отключите шифрование.
Внимание
После отключения шифрования уже загруженные объекты будут храниться зашифрованными. Данные в Object Storage шифруются по схеме envelope encryption. Удаление ключа равносильно уничтожению зашифрованных им данных.
- В консоли управления
выберите каталог, в котором находится бакет. - В списке сервисов выберите Object Storage.
- Выберите бакет, созданный ранее.
- На панели слева выберите Безопасность.
- Откройте вкладку Шифрование.
- В поле Ключ KMS выберите
Не выбрано
. - Нажмите кнопку Сохранить.
Выполните команду:
aws s3api delete-bucket-encryption \
--bucket <имя_бакета> \
--endpoint-url=https://storage.yandexcloud.net
-
Опишите ресурсы в конфигурационном файле. Чтобы отключить шифрование, удалите или закомментируйте блок
server_side_encryption_configuration
для ресурсаyandex_storage_bucket
:locals { cloud_id = "<идентификатор_облака>" folder_id = "<идентификатор_каталога>" oauth = "<OAuth>" zone = "ru-central1-a" sa_name = "new-buckets-account" sa_desc = "Аккаунт для управления бакетами Object Storage" sa_key_desc = "Статический ключ для ${local.sa_name}" key_name = "bucket-key" key_desc = "Ключ для шифрования бакетов" bucket_name = "Имя бакета" } terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } } provider "yandex" { token = local.oauth cloud_id = local.cloud_id folder_id = local.folder_id zone = local.zone } resource "yandex_iam_service_account" "buckets-account" { name = local.sa_name description = local.sa_desc } resource "yandex_resourcemanager_folder_iam_member" "buckets-account-role" { folder_id = local.folder_id role = "editor" member = "serviceAccount:${yandex_iam_service_account.buckets-account.id}" } resource "yandex_iam_service_account_static_access_key" "buckets-account-key" { service_account_id = "${yandex_iam_service_account.buckets-account.id}" description = local.sa_key_desc } resource "yandex_kms_symmetric_key" "key-a" { name = local.key_name description = local.key_desc default_algorithm = "AES_256" rotation_period = "168h" } resource "yandex_storage_bucket" "test" { bucket = local.bucket_name access_key = "${yandex_iam_service_account_static_access_key.buckets-account-key.access_key}" secret_key = "${yandex_iam_service_account_static_access_key.buckets-account-key.secret_key}" /* server_side_encryption_configuration { rule { apply_server_side_encryption_by_default { kms_master_key_id = yandex_kms_symmetric_key.key-a.id sse_algorithm = "aws:kms" } } } */ }
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите обновление ресурсов.
После выполнения команды Terraform обновит в указанном каталоге следующие ресурсы:
- Сервисный аккаунт
new-buckets-account
. - Роль
editor
для сервисного аккаунтаnew-buckets-account
. - Статический ключ для сервисного аккаунта.
- Ключ KMS с названием
bucket-key
. - Бакет.
- Сервисный аккаунт
-
В результате в указанном каталоге шифрование для бакета будет отключено. Проверить изменение ресурсов и их настройки можно в консоли управления