Bucket Policy — набор правил доступа к бакету в формате JSON. С его помощью можно сделать часть объектов публичными, ограничить доступ по IP-адресу или запретить удаление объектов.
В примерах используется AWS CLI, настроенный для UzCloud. Замените my-bucket на имя своего бакета.
В консоли политику можно задать в поле Bucket Policy при создании бакета. Через AWS CLI сохраните политику в файл и примените ее:
aws s3api put-bucket-policy --bucket my-bucket --policy file://policy.json
aws s3api get-bucket-policy --bucket my-bucket
aws s3api delete-bucket-policy --bucket my-bucket # remove the policy
Публичный доступ к папке
Любой может скачивать объекты с префиксом public/, остальные объекты бакета остаются закрытыми:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadForPublicFolder",
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::my-bucket/public/*"]
}
]
}
После этого объекты доступны по адресу https://s3.uzcstorage.uz/my-bucket/public/<файл>.
Доступ только с ваших IP-адресов
Запретите все запросы, кроме запросов с указанных адресов:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyOutsideOffice",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": ["arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*"],
"Condition": {
"NotIpAddress": { "aws:SourceIp": ["203.0.113.0/24"] }
}
}
]
}
Внимание
Если ошибиться в списке адресов, можно потерять доступ к бакету и из своих инструментов. Сначала проверьте политику на тестовом бакете. Удалить политику можно в консоли или командой delete-bucket-policy с разрешенного адреса.
Запрет удаления объектов
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyDelete",
"Effect": "Deny",
"Principal": "*",
"Action": ["s3:DeleteObject", "s3:DeleteObjectVersion"],
"Resource": ["arn:aws:s3:::my-bucket/*"]
}
]
}
Для надежной защиты бэкапов используйте Object Lock: в отличие от политики, его не сможет снять тот, у кого есть ваши ключи.