Политика доступа (bucket policy)
В Object Storage реализовано несколько механизмов для управления доступом к ресурсам. Алгоритм взаимодействия этих механизмов см. в Обзор способов управления доступом в Object Storage.
Политики доступа устанавливают права на действия с бакетами, объектами и группами объектов.
Политика срабатывает, когда пользователь делает запрос к какому-либо ресурсу. В результате срабатывания политики запрос либо выполняется, либо отклоняется.
Открытие публичного доступа к операциям с бакетом не отменяет ограничений, заданных в политиках доступа.
Примечание
Если к бакету применена политика доступа без правил, то доступ будет запрещен всем пользователям. Чтобы отключить проверки запросов по политике доступа, удалите ее.
Политику доступа можно настроить в консоли управления или описать в формате JSON по специальной схеме, чтобы передать через один из программных инструментов — Yandex Cloud CLI, AWS CLI, Terraform или API. Подробнее об управлении политикой см. в инструкции.
Если вы хотите назначить политику доступа на бакет и подключаться к нему из кластера Hive Metastore или Yandex Managed Service for Apache Airflow™, вам потребуется дополнительная настройка инфраструктуры. Подробнее см. в инструкциях для Metastore и Managed Service for Apache Airflow™.
Из чего состоит политика
Политика доступа состоит из правил, а правило — из следующих базовых элементов:
- Ресурс
-
Бакет, объект в бакете (
<имя_бакета>/some/key
) или префикс (<имя_бакета>/some/path/*
), в том числе пустой префикс для обозначения всех объектов в бакете (<имя_бакета>/*
). В правиле можно указать несколько ресурсов.Примечание
Ресурс бакета не включает в себя ресурсы всех его объектов. Чтобы правило в политике доступа относилось к бакету и всем объектам, их нужно указать как отдельные ресурсы: например,
samplebucket
иsamplebucket/*
.Если вы описываете политику в формате JSON, у ресурса должен быть префикс
arn:aws:s3:::
, напримерarn:aws:s3:::<имя_бакета>
.Если имя ресурса содержит символ
?
,*
или$
, поставьте перед таким символом знак$
, а сам символ заключите в фигурные скобки{}
. Например, имени бакетаmy?bucket
будет соответствовать записьmy${?}bucket
. - Действие
-
Набор операций над ресурсом, который будет запрещен или разрешен правилом. Подробнее читайте в разделе Действия.
- Результат
-
Запрет или разрешение запрошенного действия. Сначала проверяется попадание запроса в фильтр с действием
Deny
, при совпадении запрос отклоняется и дальнейшие проверки не проводятся. При попадании в фильтр с действиемAllow
запрос разрешается. Если запрос не попал ни в один из фильтров, то запрос отклоняется. - Принципал
-
Получатель запрошенного разрешения. Это может быть пользователь IAM, федеративный пользователь, сервисный аккаунт или анонимный пользователь.
- Условие
-
Определение случаев, когда действует правило.
Примечание
Для условия
aws:sourceip
поддержан особый порядок проверки IP-адресов обратных прокси-серверов.Если для правила задано одновременно несколько условий или внутри одного условия задано одновременно несколько ключей, то такие условия и ключи применяются с логикой
И
.Если для одного ключа условия задано одновременно несколько значений, то такие значения применяются с логикой
ИЛИ
.Подробнее читайте в разделе Условия.
Доступ к бакету через консоль управления
Если для бакета настроена политика доступа, то по умолчанию доступ к бакету через консоль управления Yandex Cloud запрещен. Чтобы разрешить доступ к бакету, нужно добавить в секцию Statement
политики доступа правило, разрешающее любые запросы к ресурсам <имя_бакета>/*
и <имя_бакета>
через консоль управления.
Пример правила для конкретного пользователя Yandex Cloud:
{
"Effect": "Allow",
"Principal": {
"CanonicalUser": "<идентификатор_пользователя>"
},
"Action": "*",
"Resource": [
"arn:aws:s3:::<имя_бакета>/*",
"arn:aws:s3:::<имя_бакета>"
],
"Condition": {
"StringLike": {
"aws:referer": "https://console.yandex.cloud/folders/*/storage/buckets/your-bucket-name*"
}
}
}
Пример для совместного использования доменов console.cloud.yandex.* и console.yandex.cloud
Если вы используете старый домен console.cloud.yandex.*
совместно с новым доменом console.yandex.cloud
, задайте следующие правила политики:
{
"Effect": "Allow",
"Principal": {
"CanonicalUser": "<идентификатор_пользователя>"
},
"Action": "*",
"Resource": [
"arn:aws:s3:::<имя_бакета>/*",
"arn:aws:s3:::<имя_бакета>"
],
"Condition": {
"StringLike": {
"aws:referer": [
"https://console.cloud.yandex.*/folders/*/storage/buckets/your-bucket-name*",
"https://console.yandex.cloud/folders/*/storage/buckets/your-bucket-name*"
]
}
}
}
Идентификатор пользователя можно получить по инструкции в документации Yandex Identity and Access Management.
Доступ к бакету через цепочку обратных прокси-серверов
Чтобы обеспечить работу Object Storage с запросами, переданными через цепочку обратных прокси-серверовaws:sourceip
проверяется не только IP-адрес, с которого пришел запрос, но и IP-адреса обратных прокси-серверов, например переданных в заголовке X-Forwarded-For
Сначала запрос проверятся на соответствие правилам Deny
политики доступа. Если хотя бы один из IP-адресов попадает под правило Deny
, запрос отклоняется. Дальнейшие проверки не проводятся.
Далее запрос проверятся на соответствие правилам Allow
. Если хотя бы один из IP-адресов попадает под правило Allow
, запрос разрешается.
Пример настройки политики доступа к бакету через цепочку обратных прокси-серверов
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "the-allowing-rule",
"Effect": "Allow",
"Principal": "*",
"Action": "*",
"Resource": "arn:aws:s3:::sample-bucket/*",
"Condition": {
"IpAddress": {
"aws:sourceip": [
"192.168.1.1",
"192.168.1.2"
]
}
}
},
{
"Sid": "the-denying-rule",
"Effect": "Deny",
"Principal": "*",
"Action": "*",
"Resource": "arn:aws:s3:::sample-bucket/*",
"Condition": {
"IpAddress": {
"aws:sourceip": [
"192.168.1.11",
"192.168.1.12"
]
}
}
}
]
}
Если к бакету поступит запрос, содержащий заголовок X-Forwarded-For: 192.168.1.1, 192.168.1.2, 192.168.1.12
, то такой запрос будет отклонен, поскольку в заголовке содержится IP-адрес, указанный в правиле с действием Deny
.
Если к бакету поступит запрос, содержащий заголовок X-Forwarded-For: 192.168.2.100, 192.168.2.1, 192.168.1.2
, то такой запрос будет разрешен, поскольку в заголовке нет IP-адресов, указанных в правиле с действием Deny
, но есть IP-адрес, указанный в правиле с действием Allow
.
Примеры конфигурации
-
Правило, которое разрешает анонимному пользователю чтение объектов бакета по зашифрованному подключению:
{ "Id": "epd4limdp3dg********", "Version": "2012-10-17", "Statement": [ { "Sid": "f1qqoehl1q53********", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/*", "Condition": { "Bool": { "aws:SecureTransport": "true" } } } ] }
-
Правило, которое разрешает скачивать объекты только из указанного диапазона IP-адресов:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/*", "Condition": { "IpAddress": { "aws:SourceIp": "100.101.102.128/30" } } } ] }
-
Правило, которое запрещает скачивать объекты с указанного IP-адреса:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": "arn:aws:s3:::<имя_бакета>/*" }, { "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<имя_бакета>/*", "Condition": { "IpAddress": { "aws:SourceIp": "100.101.102.103" } } } ] }
-
Правило, которое дает разным пользователям полный доступ только к определенным папкам, каждому пользователю — к своей:
{ "Version":"2012-10-17", "Statement":[ { "Sid":"User1PermissionsResource", "Effect":"Allow", "Principal": { "CanonicalUser": "<идентификатор_пользователя>" }, "Action": "*", "Resource":["arn:aws:s3:::<имя_бакета>/user1path/*"] }, { "Sid":"User1PermissionsPrefix", "Effect":"Allow", "Principal": { "CanonicalUser": "<идентификатор_пользователя>" }, "Action": "s3:ListBucket", "Resource":["arn:aws:s3:::<имя_бакета>"], "Condition": { "StringLike": { "s3:prefix": "user1path/*" } } }, { "Sid":"User2PermissionsResource", "Effect":"Allow", "Principal": { "CanonicalUser": "<идентификатор_пользователя>" }, "Action": "*", "Resource":["arn:aws:s3:::<имя_бакета>/user2path/*"] }, { "Sid":"User2PermissionsPrefix", "Effect":"Allow", "Principal": { "CanonicalUser": "<идентификатор_пользователя>" }, "Action": "s3:ListBucket", "Resource":["arn:aws:s3:::<имя_бакета>"], "Condition": { "StringLike": { "s3:prefix": "user2path/*" } } } ] }
-
Правило, которое дает каждому пользователю и сервисному аккаунту полный доступ к папке с названием, равным идентификатору пользователя или сервисного аккаунта:
{ "Version":"2012-10-17", "Statement":[ { "Sid": "OwnDirPermissions", "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": ["arn:aws:s3:::<имя_бакета>/${aws:userid}/*"] } ] }