Управление политикой доступа (bucket policy)
В Object Storage реализовано несколько механизмов для управления доступом к ресурсам. Алгоритм взаимодействия этих механизмов см. в Обзор способов управления доступом в Object Storage.
Политики доступа (bucket policy) устанавливают права на действия с бакетами, объектами и группами объектов.
Образцы политик доступа для решения конкретных задач см. в подразделе Примеры конфигураций.
Важно
Если вы хотите настроить политику доступа для бакета и подключаться к нему из кластера Hive Metastore или Yandex Managed Service for Apache Airflow™, вам потребуется дополнительная настройка инфраструктуры. Подробнее см. в инструкциях для Metastore и Managed Service for Apache Airflow™.
Применить или изменить политику
Минимально необходимая роль для применения или изменения политики доступа — storage.configurer
. См. описание роли.
Примечание
Если ранее для бакета была настроена политика доступа, то после применения изменений она будет полностью перезаписана.
Для применения или изменения политики доступа к бакету:
-
В консоли управления
в списке сервисов выберите Object Storage и перейдите в бакет, в котором нужно настроить политику доступа. -
На панели слева выберите
Безопасность и перейдите на вкладку Политика доступа. -
Нажмите кнопку Настроить доступ.
-
Введите идентификатор политики доступа.
-
Настройте правило:
-
Введите идентификатор правила.
-
Настройте параметры правила:
-
Результат — разрешить или запретить.
-
Принцип выбора — включить или исключить пользователей.
-
Пользователь — выберите всех пользователей или задайте набор конкретных субъектов.
Чтобы задать набор конкретных субъектов:
-
Выберите опцию
Выбрать пользователей
. -
Выберите нужных субъектов из списка. Для этого поместите курсор в поле для ввода данных субъекта и в появившейся форме выберите нужного пользователя, сервисный аккаунт, группу пользователей, системную группу или публичную группу. При необходимости воспользуйтесь соответствующими вкладками формы или строкой поиска по имени или электронному адресу субъекта.
Вы можете выбрать одновременно нескольких субъектов, для этого выбирайте их поочередно.
-
-
Действие, для которого создается правило. Вы также можете выбрать опцию Все действия.
-
Ресурс — по умолчанию указан выбранный бакет. Чтобы добавить другие ресурсы в правило, нажмите кнопку Добавить ресурс.
Примечание
Ресурс бакета не включает в себя ресурсы всех его объектов. Чтобы правило в политике доступа относилось к бакету и всем объектам, их нужно указать как отдельные ресурсы: например,
samplebucket
иsamplebucket/*
.
-
-
При необходимости добавьте условие для правила:
- Выберите Ключ из списка.
- Выберите Оператор из списка. Чтобы оператор действовал в существующих полях, выберите опцию Применить, если поле существует. Тогда, если поля не существует, условие будет считаться выполненным.
- Введите Значение.
- Нажмите кнопку Добавить значение, чтобы добавить дополнительное значение в условие.
Вы можете настроить для правила одновременно несколько условий и задать для каждого условия несколько ключей. При этом такие условия и их ключи будут проверяться с логикой
И
. То есть для выполнения правила запрос должен будет соответствовать сразу всем указанным признакам.Для каждого ключа условия вы можете задать одновременно несколько значений. При этом такие значения будут проверяться с логикой
ИЛИ
. То есть для выполнения правила запрос должен будет соответствовать любому из заданных значений ключа условия.
-
-
При необходимости добавьте правила и настройте их.
-
Нажмите кнопку Сохранить.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>
. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name
или --folder-id
.
-
Посмотрите описание команды CLI для редактирования ACL бакета:
yc storage bucket update --help
-
Опишите конфигурацию политики доступа в виде схемы данных в формате JSON:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/*", "Condition": { "Bool": { "aws:SecureTransport": "true" } } } }
Где:
Version
— версия описания политик доступа. Необязательный параметр.Statement
— правила политики доступа:-
Effect
— запрет или разрешение запрошенного действия. Возможные значения:Allow
иDeny
. -
Principal
— идентификатор субъекта запрошенного разрешения. Получателем может быть пользователь, сервисный аккаунт или группа пользователей. Возможные значения:*
,<идентификатор_субъекта>
. Необязательный параметр.Идентификаторы можно получить следующими способами:
- Пользователь.
- Сервисный аккаунт.
- Группа пользователей — перейдите на вкладку Группы
в интерфейсе Cloud Center.
-
Action
— действие, которое будет разрешено при срабатывании политики. Возможные значения:s3:GetObject
,s3:PutObject
и*
если необходимо применять политику ко всем действиям. -
Resource
— ресурс, к которому будет применяться правило. -
Condition
— условие, которое будет проверяться. Необязательный параметр.Вы можете настроить для правила одновременно несколько условий и задать для каждого условия несколько ключей. При этом такие условия и их ключи будут проверяться с логикой
И
. То есть для выполнения правила запрос должен будет соответствовать сразу всем указанным признакам.Для каждого ключа условия вы можете задать одновременно несколько значений. При этом такие значения будут проверяться с логикой
ИЛИ
. То есть для выполнения правила запрос должен будет соответствовать любому из заданных значений ключа условия.
-
-
Выполните команду:
yc storage bucket update \ --name <имя_бакета> \ --policy-from-file <путь_к_файлу_с_политиками>
Результат:
name: my-bucket folder_id: csgeoelk7fl1******** default_storage_class: STANDARD versioning: VERSIONING_SUSPENDED max_size: "10737418240" policy: Statement: Action: s3:GetObject Condition: Bool: aws:SecureTransport: "true" Effect: Allow Principal: '*' Resource: arn:aws:s3:::my-bucket Version: "2012-10-17" acl: {} created_at: "2022-12-14T08:42:16.273717Z"
Примечание
Для управления политикой доступа с помощью AWS CLI сервисному аккаунту должна быть назначена роль storage.admin
.
Если у вас еще нет AWS CLI, установите и сконфигурируйте его.
-
Опишите конфигурацию политики доступа в виде схемы данных формата JSON:
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/*", "Condition": { "Bool": { "aws:SecureTransport": "true" } } } }
Где:
Version
— версия описания политик доступа. Необязательный параметр.Statement
— правила политики доступа:-
Effect
— запрет или разрешение запрошенного действия. Возможные значения:Allow
иDeny
. -
Principal
— идентификатор субъекта запрошенного разрешения. Получателем может быть пользователь, сервисный аккаунт или группа пользователей. Возможные значения:*
,<идентификатор_субъекта>
. Необязательный параметр.Идентификаторы можно получить следующими способами:
- Пользователь.
- Сервисный аккаунт.
- Группа пользователей — перейдите на вкладку Группы
в интерфейсе Cloud Center.
-
Action
— действие, которое будет разрешено при срабатывании политики. Возможные значения:s3:GetObject
,s3:PutObject
и*
если необходимо применять политику ко всем действиям. -
Resource
— ресурс, к которому будет применяться правило. -
Condition
— условие, которое будет проверяться. Необязательный параметр.Вы можете настроить для правила одновременно несколько условий и задать для каждого условия несколько ключей. При этом такие условия и их ключи будут проверяться с логикой
И
. То есть для выполнения правила запрос должен будет соответствовать сразу всем указанным признакам.Для каждого ключа условия вы можете задать одновременно несколько значений. При этом такие значения будут проверяться с логикой
ИЛИ
. То есть для выполнения правила запрос должен будет соответствовать любому из заданных значений ключа условия.
-
Сохраните готовую конфигурацию в файле
policy.json
. -
Выполните команду:
aws s3api put-bucket-policy \ --endpoint https://storage.yandexcloud.net \ --bucket <имя_бакета> \ --policy file://policy.json
Примечание
Terraform взаимодействует с Object Storage от имени сервисного аккаунта. Назначьте сервисному аккаунту нужную роль, например storage.admin
, на каталог, в котором будут создаваться ресурсы.
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
Получите статические ключи доступа — секретный ключ и идентификатор ключа, используемые для аутентификации в Object Storage.
Примечание
Кроме статических ключей доступа для аутентификации в Object Storage можно использовать IAM-токен. Подробнее смотрите в разделе Создание бакета и в документации провайдера
-
Опишите в конфигурационном файле параметры ресурсов, которые необходимо создать:
resource "yandex_iam_service_account" "sa" { name = "<имя_сервисного_аккаунта>" } // Назначение роли сервисному аккаунту resource "yandex_resourcemanager_folder_iam_member" "sa-admin" { folder_id = "<идентификатор_каталога>" role = "storage.admin" member = "serviceAccount:${yandex_iam_service_account.sa.id}" } // Создание статического ключа доступа resource "yandex_iam_service_account_static_access_key" "sa-static-key" { service_account_id = yandex_iam_service_account.sa.id description = "static access key for object storage" } resource "yandex_storage_bucket" "b" { access_key = "yandex_iam_service_account_static_access_key.sa-static-key.access_key" secret_key = "yandex_iam_service_account_static_access_key.sa-static-key.secret_key" bucket = "my-policy-bucket" policy = <<POLICY { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::my-policy-bucket/*", "arn:aws:s3:::my-policy-bucket" ] }, { "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::my-policy-bucket/*", "arn:aws:s3:::my-policy-bucket" ] } ] } POLICY }
Где:
access_key
— идентификатор статического ключа доступа.secret_key
— значение секретного ключа доступа.bucket
— имя бакета. Обязательный параметр.policy
— имя политики. Обязательный параметр.
Настройки политики:
Version
— версия описания политик доступа. Необязательный параметр.Statement
— правила политики доступа:-
Effect
— запрет или разрешение запрошенного действия. Возможные значения:Allow
иDeny
. -
Principal
— идентификатор субъекта запрошенного разрешения. Получателем может быть пользователь, сервисный аккаунт или группа пользователей. Возможные значения:*
,<идентификатор_субъекта>
. Необязательный параметр.Идентификаторы можно получить следующими способами:
- Пользователь.
- Сервисный аккаунт.
- Группа пользователей — перейдите на вкладку Группы
в интерфейсе Cloud Center.
-
Action
— действие, которое будет разрешено при срабатывании политики. Возможные значения:s3:GetObject
,s3:PutObject
и*
если необходимо применять политику ко всем действиям. -
Resource
— ресурс, к которому будет применяться правило. -
Condition
— условие, которое будет проверяться. Необязательный параметр.Вы можете настроить для правила одновременно несколько условий и задать для каждого условия несколько ключей. При этом такие условия и их ключи будут проверяться с логикой
И
. То есть для выполнения правила запрос должен будет соответствовать сразу всем указанным признакам.Для каждого ключа условия вы можете задать одновременно несколько значений. При этом такие значения будут проверяться с логикой
ИЛИ
. То есть для выполнения правила запрос должен будет соответствовать любому из заданных значений ключа условия.
-
Более подробную информацию о ресурсах, которые вы можете создать с помощью Terraform, см. в документации провайдера
. -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание ресурсов.
После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Чтобы управлять политикой доступа, воспользуйтесь методом REST API update для ресурса Bucket, вызовом gRPC API BucketService/Update или методом S3 API PutBucketPolicy. Если ранее для бакета уже была настроена политика доступа, то после применения новой политики она будет полностью перезаписана.
Примечание
Если к бакету применена политика доступа без правил, то доступ будет запрещен всем пользователям. Чтобы отключить проверки запросов по политике доступа, удалите ее.
Просмотреть политику
Минимально необходимая роль для просмотра политики доступа — storage.configViewer
. См. описание роли.
Чтобы просмотреть примененную к бакету политику доступа:
- В консоли управления
в списке сервисов выберите Object Storage. - Выберите бакет в списке.
- В меню слева выберите Безопасность и перейдите на вкладку Политика доступа.
Выполните следующую команду:
aws --endpoint https://storage.yandexcloud.net s3api get-bucket-policy \
--bucket <имя_бакета> \
--output text
Результат:
{
"Policy": "{\"Version\":\"2012-10-17\",\"Statement\":{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"s3:GetObject\",\"Resource\":\"arn:aws:s3:::<имя_бакета>/*\",\"Condition\":{\"Bool\":{\"aws:SecureTransport\":\"true\"}}}}"
}
Подробнее о параметрах читайте в описании схемы данных.
Воспользуйтесь методом S3 API GetBucketPolicy.
Удалить политику
Минимально необходимая роль для удаления политики доступа — storage.configurer
. См. описание роли.
Чтобы удалить политику доступа:
- В консоли управления
в списке сервисов выберите Object Storage. - Выберите бакет в списке.
- В меню слева выберите Безопасность и перейдите на вкладку Политика доступа.
- Нажмите значок
и выберите Удалить политику доступа. - Нажмите кнопку Удалить.
Выполните следующую команду:
aws --endpoint https://storage.yandexcloud.net s3api delete-bucket-policy \
--bucket <имя_бакета>
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
Если вы применили политику доступа к бакету при помощи Terraform, вы можете удалить ее:
-
Найдите в конфигурационном файле параметры созданной ранее политики доступа, которую необходимо удалить:
resource "yandex_storage_bucket" "b" { bucket = "my-policy-bucket" policy = <<POLICY { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::my-policy-bucket/*", "arn:aws:s3:::my-policy-bucket" ] }, { "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::my-policy-bucket/*", "arn:aws:s3:::my-policy-bucket" ] } ] } POLICY }
-
Удалите поле
policy
с описанием параметров политики доступа из конфигурационного файла. -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы редактировали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров без удаляемого описания политики доступа. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Удалите политику доступа.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Введите слово
yes
и нажмите Enter.
После этого в указанном каталоге будет удалена политика доступа к бакету. Проверить отсутствие политики доступа можно в консоли управления
. -
Воспользуйтесь методом S3 API DeleteBucketPolicy.