Как контролировать доступ к S3-бакетам (или аналогам в других облаках)?

Контроль доступа к S3-бакетам (и аналогам в других облаках)

Контроль доступа — это многослойная задача: нужно сочетать политики управления идентичностью, политики на ресурсах, сетевые ограничения, шифрование и аудит. Ниже — практический набор механизмов и рекомендаций.

Основные механизмы (AWS S3)

  • IAM-политики — права пользователей/ролей на уровне аккаунта (who can call S3 APIs).

  • Bucket policies (resource-based) — правила доступа, применяемые к конкретному бакету (подходят для cross-account доступа, условий по IP/VPC/VPC-endpoint, TLS и т. д.).

  • ACLs — устаревающий механизм; лучше отключать (Object Ownership = Bucket owner enforced) и не использовать для новых систем.

  • Block Public Access — глобальная/на уровне бакета защита от случайной публикации (рекомендуется включить).

  • S3 Access Points — упрощают управление доступом для больших/многопользовательских данных (каждому приложению свой access point + policy).

  • Pre-signed URLs / Signed URLs — временный доступ к объектам (подход для ограниченной публичной выдачи).

  • VPC Endpoints (Gateway VPCE) + endpoint policy — заставляют трафик к S3 идти по приватному каналу и позволяют ограничивать доступ через конкретный VPCE.

  • Server-Side Encryption / KMS — требования шифрования при записи и роль/политика KMS для управления who can decrypt.

  • Object Lock / WORM, Versioning, MFA Delete — защита от удаления и изменение истории объектов.

  • Logging & Audit: S3 access logs, CloudTrail, Amazon Macie/CloudWatch — для отслеживания и обнаружения утечек.

Практики защиты (defense in depth)

  1. Включить Block Public Access на уровне аккаунта и проверять на уровне бакета.

  2. Отключить ACLs (Object Ownership = bucket owner enforced) — использовать только IAM + bucket policies.

  3. Принцип наименьших привилегий: задать роли с минимально нужными действиями (s3:GetObject, s3:PutObject и т.д.).

  4. Запретить незащищённые соединения (aws:SecureTransport) — принуждать HTTPS.

  5. Требовать шифрование при записи (s3:x-amz-server-side-encryption = aws:kms) и контролировать KMS key policy (только нужные роли могут использовать ключ).

  6. Использовать VPC endpoint + policy, чтобы доступ к бакету возможен только из вашей приватной сети.

  7. Для внешней отдачи статического контента — ставить CloudFront (OAI/OAC) и не давать публичный доступ к самому бакету.

  8. Для временного доступа — pre-signed URLs с коротким TTL или CloudFront signed cookies.

  9. Централизованный логинг: включить S3 server access logs и CloudTrail, сохранять логи в отдельном защищённом бакете/аккаунте.

  10. Автоматические проверки: AWS Config rules (no public buckets, encryption enabled), сканирование репозиториев на ключи, регулярный audit.

Примеры полезных условий в bucket policy

  • Запрет записей без HTTPS (deny если aws:SecureTransport == false).

  • Разрешение доступа только через конкретный VPC Endpoint (StringEquals: { "aws:SourceVpce": "vpce-..." }).

  • Требование SSE-KMS при PutObject (s3:x-amz-server-side-encryption: aws:kms).

  • Restrict by principal (конкретная роль из другого аккаунта) или by aws:PrincipalOrgID для всей организации.

Эквиваленты в других облаках (коротко)

  • Azure Blob: RBAC (roles like Storage Blob Data Reader/Contributor), Shared Access Signatures (SAS) для временного доступа, Storage firewall/VNet rules, Private endpoints, Azure Policy, Blob immutability.

  • GCP Cloud Storage: IAM ролями (roles/storage.objectViewer), Signed URLs, VPC Service Controls (контекст безопасности), bucket-level IAM, uniform bucket-level access (аналог отключения ACLs), CMEK/KMS и logging.

Мониторинг, реагирование и процессы

  • Настройка алертов на аномальные чтения/писания, на создание публичных ACL/policy.

  • Регулярный аудит всех бакетов (скрипты/terraform/aws-config), отчёт по тэгам владельцев.

  • План реагирования: revoke/rotate credentials, инвентаризация объектов, forensic по логам.

Дополнительные механизмы управления доступом

  • Access Points для мульти-потребительской среды.

  • Bucket policies + IAM для cross-account access — через assume-role вместо дачи прав напрямую внешним пользователям.

  • Service Control Policies (SCP) в организации для глобальных ограничений (например, запрет public S3).

  • Least privilege + separation of duties: отдельные роли для записи, чтения, администратора.

Примеры policy-фрагментов

{
"Sid": "DenyNonTLS",
"Effect": "Deny",
"Principal": "\*",
"Action": "s3:\*",
"Resource": \["arn:aws:s3:::my-bucket","arn:aws:s3:::my-bucket/\*"\],
"Condition": { "Bool": {"aws:SecureTransport": "false"} }
}
{
"Sid":"AllowFromVpceOnly",
"Effect":"Allow",
"Principal":{"AWS":"arn:aws:iam::111122223333:role/MyAppRole"},
"Action":\["s3:GetObject","s3:PutObject"\],
"Resource":"arn:aws:s3:::my-bucket/\*",
"Condition": {"StringEquals": {"aws:SourceVpce":"vpce-0abc123"}}
}

Сочетание этих механизмов даёт надёжный, контролируемый и аудируемый доступ к объектному хранилищу — при это важно регулярно ревьювать политики, логировать события и автоматизировать проверки.