Политика доступа (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
.
Примеры конфигурации
- Разрешить анонимному пользователю чтение объектов бакета по зашифрованному подключению
- Разрешить скачивать объекты только из указанного диапазона IP-адресов
- Запретить скачивать объекты с указанного IP-адреса
- Предоставить пользователям разным полный доступ к определенным папкам
- Предоставить каждому пользователю или сервисному аккаунту полный доступ к папке
Правило, которое разрешает анонимному пользователю чтение объектов бакета по зашифрованному подключению:
{
"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}/*"]
}
]
}