Основные примеры применения ACL и Policy
- Как открыть файл для скачивания
- Как сделать файл в бакете публичными
- Как скрыть директорию
- Как разрешить запросы с одного IP
- Как разрешить запросы с сайта
- Как дать возможность листить бакет
- Разрешить доступ другому юзеру
ACL
Access Control List — список управления доступом, который определяет, кто или что может получать доступ к файлам или бакету и, какие именно операции разрешено или запрещено выполнять субъекту.
Обратите внимание, за настройку и управление ACL отвечает владелец хранилища.
Для управления нашими S3 хранилищами можно использовать команды из документации S3cmd.
Как выглядит ACL?
Команда для настройки ACL выглядит следующим образом:
s3cmd setacl s3://my_bucket/cat.jpg --acl-public
Здесь представлен пример выставления публичного acl (--acl public) на конкретный объект (cat.jpg) в бакете (my_bucket).
После применения этой команды этот объект будет доступен любому по ссылке:
https://s-ed1.cloud.gcore.lu/my_bucket/cat.jpg
ACL на объектах позволяет широко регулировать круг действий:
Действия | Описание |
--acl-public | Выставить публичный ACL на объект |
--acl-private | Выставить приватный ACL на объект |
--acl-grant=full-control | Предоставить полный доступ к управлению и регулированию бакета |
--acl-grant=read | Позволить листить объекты в бакете |
--acl-grant=read_acp | Позволить читать ACL |
--acl-grant=write | Позволить записывать, перезаписывать и удалять объекты |
--acl-grant=write_acp | Позволить писать ACL |
Policy (Политика доступа)
Для более детальной настройки прав доступа к файлам и бакетам, используйте политику доступа.
Политика доступа позволяет создавать правила для различного поведения при запросах.
С помощью нее можно регулировать не только определенные действия, но и доступы к отдельным директориям в бакете для отдельных юзеров/групп/источников.
Для создания политик доступа, используйте формат json.
Максимальный размер запроса - 20 КБ.
Как выглядит Policy?
Чтобы создать политику доступа, используйте команду cat> policy_name.json.
В json-файле указываются допустимые действия с файлами или бакетами, для направленного управления запросами действия дополняются условиями.
Обратите внимание! Все необходимые действия, условия, типы ресурсов описаны в официальной документации.
Здесь представлен пример политики доступа, которая запрещает всем пользователям доступ к операции ("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-файла, политика доступа применяется на файл или бакет.
s3cmd setpolicy policy_name.json s3://my_bucket/
Основные примеры применения ACL и Policy
Как открыть файл для скачивания
Пример выставления публичного acl (--acl public) на конкретный объект (cat.jpg) в бакете (my_bucket):
s3cmd setacl s3://my_bucket/cat.jpg --acl-public
После применения этой команды объект 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/*"
}
]
}
Применение политики доступа на бакет:
s3cmd setpolicy policy_name.json s3://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/*"
}
]
}
Применение политики доступа на бакет:
s3cmd setpolicy policy_name.json s3://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"}
}
}
]
}
Применение политики доступа на бакет:
s3cmd setpolicy policy_name.json s3://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/*"]}
}
}
]
}
Применение политики доступа на бакет:
s3cmd setpolicy policy_name.json s3://my_bucket/
Как дать возможность листить бакет
Пример команды, которая позволяет любым анонимным пользователям листить файлы в бакете, но не дает им возможности читать/записывать эти файлы.
s3cmd setacl s3://my_bucket/cat.jpg --acl-grant=read
Разрешить доступ другому юзеру
Пример 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"]
}
]
}
Применение политики доступа на бакет:
s3cmd setpolicy policy_name.json s3://my_bucket/