AWS S3 bucket policy для ограничения доступа
Условие
Напишите JSON-политику для S3 bucket со следующими требованиями:
Требования к доступу
- Разрешить доступ только с определенных IP-адресов (192.168.1.0/24, 10.0.0.0/8)
- Запретить удаление объектов для всех, кроме root account
- Разрешить публичный read-only доступ к папке /public/*
- Требовать HTTPS для всех запросов
- Разрешить upload только для IAM роли "app-service-role"
Задача
- Напишите bucket policy
- Объясните каждый statement
- Как проверить, что политика работает корректно?
Вопросы
- Чем отличается bucket policy от IAM policy?
- Что такое Principal в policy?
- Как логировать доступ к S3 bucket?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение: AWS S3 Bucket Policy для ограничения доступа
Bucket Policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyInsecureTransport",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
},
{
"Sid": "RestrictIPAddresses",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"192.168.1.0/24",
"10.0.0.0/8"
]
}
}
},
{
"Sid": "PublicReadOnlyAccess",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/public/*"
},
{
"Sid": "DenyDeleteExceptRoot",
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:DeleteObject",
"s3:DeleteBucket"
],
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
],
"Condition": {
"StringNotLike": {
"aws:PrincipalArn": "arn:aws:iam::ACCOUNT-ID:root"
}
}
},
{
"Sid": "AllowUploadForAppService",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT-ID:role/app-service-role"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Объяснение каждого Statement
-
DenyInsecureTransport — блокирует все HTTP запросы. Условие
aws:SecureTransport: falseозначает, что всё кроме HTTPS запрещено. Это критично для безопасности данных. -
RestrictIPAddresses — разрешает GetObject и PutObject только с белых IP (192.168.1.0/24 для внутренней сети и 10.0.0.0/8 для Docker/k8s). Использует Condition для проверки исходного IP.
-
PublicReadOnlyAccess — разрешает всем только чтение файлов в
/public/*папке. Это удобно для публичного контента (картинки, CSS). -
DenyDeleteExceptRoot — использует Deny явно для удаления, исключая root account. Principal используется с StringNotLike для гибкого исключения.
-
AllowUploadForAppService — только конкретная IAM роль может загружать файлы. Principal указывает на ARN роли, а не на "*".
Ключевые отличия Bucket Policy от IAM Policy
Bucket Policy применяется к S3 bucket и контролирует доступ извне. IAM Policy привязана к пользователю или роли и контролирует, что они могут делать. Часто используются вместе: IAM разрешает действие юзеру, а Bucket Policy проверяет условия (IP, HTTPS).
Principal в Policy
Principal указывает, кому предоставляется доступ:
"*"— всем"AWS": "arn:aws:iam::123456:role/my-role"— конкретной роли"Service": "lambda.amazonaws.com"— AWS сервисам
Проверка работы политики
# Тест 1: Проверка с разрешенного IP (от внутренней сети)
aws s3api get-object --bucket my-bucket --key file.txt /tmp/file.txt
# Тест 2: Попытка удаления (должна быть заблокирована)
aws s3api delete-object --bucket my-bucket --key file.txt
# Результат: AccessDenied
# Тест 3: Публичный доступ к /public/ (должен пройти)
curl https://my-bucket.s3.amazonaws.com/public/image.jpg
# Тест 4: HTTPS requirement (HTTP должна быть заблокирована)
curl http://my-bucket.s3.amazonaws.com/file.txt
# Результат: 403 Forbidden
Логирование доступа к S3
Включи S3 Access Logging или CloudTrail:
# Включить access logs в консоли или через CLI
aws s3api put-bucket-logging \
--bucket my-bucket \
--bucket-logging-status file://logging.json
# logging.json:
# {
# "LoggingEnabled": {
# "TargetBucket": "logs-bucket",
# "TargetPrefix": "s3-access-logs/"
# }
# }