← Назад к вопросам

AWS S3 bucket policy для ограничения доступа

2.3 Middle🔥 211 комментариев
#Облачные технологии

Условие

Напишите JSON-политику для S3 bucket со следующими требованиями:

Требования к доступу

  1. Разрешить доступ только с определенных IP-адресов (192.168.1.0/24, 10.0.0.0/8)
  2. Запретить удаление объектов для всех, кроме root account
  3. Разрешить публичный read-only доступ к папке /public/*
  4. Требовать HTTPS для всех запросов
  5. Разрешить upload только для IAM роли "app-service-role"

Задача

  • Напишите bucket policy
  • Объясните каждый statement
  • Как проверить, что политика работает корректно?

Вопросы

  • Чем отличается bucket policy от IAM policy?
  • Что такое Principal в policy?
  • Как логировать доступ к S3 bucket?

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение: 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

  1. DenyInsecureTransport — блокирует все HTTP запросы. Условие aws:SecureTransport: false означает, что всё кроме HTTPS запрещено. Это критично для безопасности данных.

  2. RestrictIPAddresses — разрешает GetObject и PutObject только с белых IP (192.168.1.0/24 для внутренней сети и 10.0.0.0/8 для Docker/k8s). Использует Condition для проверки исходного IP.

  3. PublicReadOnlyAccess — разрешает всем только чтение файлов в /public/* папке. Это удобно для публичного контента (картинки, CSS).

  4. DenyDeleteExceptRoot — использует Deny явно для удаления, исключая root account. Principal используется с StringNotLike для гибкого исключения.

  5. 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/"
#   }
# }
AWS S3 bucket policy для ограничения доступа | PrepBro