Основные примеры применения ACL и Policy
- Как открыть файл для скачивания
- Как сделать файл в бакете публичными
- Как скрыть директорию
- Как разрешить запросы с одного IP
- Как разрешить запросы с сайта
- Как дать возможность листить бакет
- Разрешить доступ другому юзеру
ACL
Access Control List - список управления доступом, который определяет, кто или что может получать доступ к файлам или бакету и, какие именно операции разрешено или запрещено выполнять субъекту.
Обратите внимание, за настройку и управление ACL отвечает владелец хранилища.
Для управления наших S3 хранилищ можно использовать команды из документации awscli.
Как выглядит ACL?
Команда для настройки ACL выглядит следующим образом:
aws s3api put-object-acl --bucket my_bucket --key cat.jpg --acl public-read --endpoint-url=https://s-ed1.cloud.gcore.lu
Здесь представлен пример выставления публичного acl (--acl public-read --) на конкретный объект (cat.jpg) в бакете (my_bucket).
После применения этой команды этот объект будет доступен любому по ссылке https://s-ed1.cloud.gcore.lu/my_bucket/cat.jpg
ACL на объектах позволяет широко регулировать круг действий:
Действия | Описание |
--public-read-- | Выставить публичный ACL на объект. |
--private-- | Выставить приватный ACL на объект. |
--grant-full-control (string) | Предоставить полный доступ к управлению и регулированию бакета. |
--grant-read (string) | Позволить листить объекты в бакете. |
--grant-read-acp (string) | Позволить читать ACL. |
--grant-write (string) | Позволить записывать, перезаписывать и удалять объекты. |
--grant-write-acp (string) | Позволить писать ACL. |
Policy (Политика доступа)
Для более детальной настройки прав доступа к файлам и бакетам, используйте политику доступа.
Политика доступа позволяет создавать правила для различного поведения при запросах.
С помощью нее можно регулировать не только определенные действия, но и доступы к отдельным директориям в бакете для отдельных юзеров/групп/источников.
Для создания политик доступа, используйте формат json.
Максимальный размер запроса - 20 КБ.
Как выглядит Policy?
В json-файле указываются допустимые действия с файлами или бакетами, для направленного управления запросами действия дополняются условиями (conditions).
Обратите внимание! Все необходимые действия, условия, типы ресурсов описаны в официальной документации.
Здесь представлен пример политики доступа, которая запрещает всем пользователям доступ к операции ("s3:GetObject") в директории бакета ("Resource": arn:aws:s3:::my_bucket/secret/*"), но разрешает доступ к бакету ("Resource": "arn:aws:s3:::my_bucket/*") уровнем выше.
{
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/*"
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/secret/*"
}
]
}
После создания json- файла, политика доступа применяется на файл или бакет.
aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-ed1.cloud.gcore.lu --bucket my_bucket
Основные примеры применения ACL и Policy
Как открыть файл для скачивания
Пример выставления публичного acl (--acl public-read --) на конкретный объект (cat.jpg) в бакете (my_bucket):
aws s3api put-object-acl --bucket my_bucket --key cat.jpg --acl public-read --endpoint-url=https://s-ed1.cloud.gcore.lu
После применения этой команды объект cat.jpg будет доступен любому по ссылке https://s-ed1.cloud.gcore.lu/my_bucket/cat.jpg
Как сделать файлы в бакете публичными
Пример json-файла, где разрешен доступ к объектам на скачивание ("Action": "s3:GetObject") для всех ("Principal": "*") в бакете ("Resource": "arn:aws:s3:::my_bucket/*").
Важно! Такая политика доступа позволяет получать файлы по прямой ссылке, но не позволяет листить файлы в бакете.
{
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/*"
}
]
}
Применение политики доступа на бакет:
aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-ed1.cloud.gcore.lu --bucket my_bucket
Как скрыть директорию
Пример json-файла, который запрещает всем пользователям доступ к операции ("s3:GetObject") в директории бакета ("Resource": arn:aws:s3:::my_bucket/secret/*"), но разрешает доступ к бакету ("Resource": "arn:aws:s3:::my_bucket/*") в целом:
{
"Version": "2012-10-17",
"Id": "S3PolicyId1", [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/*"
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my_bucket/secret/*"
}
]
}
Применение политики доступа на бакет:
aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-ed1.cloud.gcore.lu --bucket my_bucket
Как разрешить запросы с одного IP
Пример json-файла, который разрешает запросы к хранилищу с указанного IP ("IpAddress": {"aws:SourceIp": "54.240.143.0/24"})
{
"Version": "2012-10-17",
"Id": "S3PolicyId1",
"Statement":
[
{
"Sid": "IPAllow",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::",
"arn:aws:s3:::/*"
],
"Condition":
{
"IpAddress": {"aws:SourceIp": "54.240.143.0/24"}
}
}
]
}
Применение политики доступа на бакет:
aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-ed1.cloud.gcore.lu --bucket my_bucket
Как разрешить запросы с сайта
Пример json-файла, который разрешает только запросы с сайтов, указанных в политике доступа ("StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}):
{
"Version":"2012-10-17",
"Id":"http referer policy example",
"Statement":
[
{
"Sid":"Allow get requests originating from www.example.com and example.com.",
"Effect":"Allow",
"Principal":"*",
"Action":["s3:GetObject","s3:GetObjectVersion"],
"Resource":"arn:aws:s3:::/*",
"Condition":
{
"StringLike":{"aws:Referer":["http://www.example.com/*","http://example.com/*"]}
}
}
]
}
Применение политики доступа на бакет:
aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-ed1.cloud.gcore.lu --bucket my_bucket
Как дать возможность листить бакет
Пример команды, которая позволяет любым анонимным пользователям листить файлы в бакете, но не дает им возможности читать/записывать эти файлы.
aws s3api put-bucket-acl --bucket my_bucket --acl public-read --endpoint-url=https://s-ed1.cloud.gcore.lu
Разрешить доступ другому юзеру
Пример json-файла, который разрешает доступ юзеру, где 4702-test — это имя хранилища в личном кабинете, а my_bucket — бакет, к которому предоставляется доступ.
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal": {"AWS":["arn:aws:iam:::user/4702-test"]},
"Action":["s3:GetObject","s3:ListBucket"],
"Resource":["arn:aws:s3:::my_bucket/*", "arn:aws:s3:::my_bucket"]
}
]
}
Применение политики доступа на бакет:
aws s3api put-bucket-policy --policy file://policy.json --endpoint-url=https://s-ed1.cloud.gcore.lu --bucket my_bucket