Перейти к основному содержимому

Управление доступом

Управление доступом — один из ключевых аспектов работы с S3-совместимым хранилищем. Оно позволяет защитить данные, ограничить доступ к объектам и бакетам, а также гибко распределять права между пользователями и сервисами.

S3-совместимые системы поддерживают несколько механизмов управления доступом, которые можно комбинировать между собой.


Основные механизмы доступа

Список управления доступом (ACL)

ACL (Access Control List) — это механизм управления доступом к объектам и бакетам в S3.
С помощью ACL вы можете задавать, кто и какие действия может выполнять с вашими данными.

Основные моменты

  • ACL применяются как к бакетам, так и к отдельным объектам;
  • Каждый ACL состоит из грантов (grants), которые связывают право доступа с пользователем или группой;
  • Право доступа может быть разным: чтение, запись, полный доступ и т.д.;
  • ACL работают на уровне индивидуальных объектов и бакетов, но не заменяют более гибкие механизмы, например IAM-политики.

Типы прав доступа

Право доступаОписание
READРазрешает чтение объекта или списка объектов в бакете
WRITEРазрешает запись объектов в бакет (только для бакета)
READ_ACPРазрешает просмотр ACL объекта или бакета
WRITE_ACPРазрешает изменение ACL объекта или бакета
FULL_CONTROLПолный контроль: все права для указанного пользователя или группы

Примеры использования ACL

  1. Предоставление доступа конкретному пользователю
  • Вы хотите, чтобы другой аккаунт AWS мог только читать объект;
  • В ACL добавляете грант для его идентификатора с правом READ.
  1. Публичный доступ
  • Для объекта можно задать ACL с правом READ для группы AllUsers;
  • Это позволяет любому пользователю в интернете получить доступ к объекту.
  1. Совместная работа
  • Разные пользователи или группы могут иметь разные права на один объект:
    • один — только чтение (READ);
    • другой — полный контроль (FULL_CONTROL).

Примеры работы с ACL

В данном разделе показано, как работать с ACL через AWS CLI и Python (boto3).

AWS CLI

Первая команда получает текущие права доступа (ACL) для объекта в бакете, вторая устанавливает новые права доступа для объекта.

# Получить ACL объекта
aws s3api get-object-acl --bucket my-bucket --key example.txt

# Установить ACL объекта (например, public-read)
aws s3api put-object-acl --bucket my-bucket --key example.txt --acl public-read
Python (boto3)

С помощью Python и библиотеки boto3 вы можете работать с ACL объектов S3. Ниже показано, как получить ACL объекта и установить его:

import boto3

s3 = boto3.client('s3')
bucket_name = 'my-bucket'
object_key = 'example.txt'

# Получить ACL объекта
acl = s3.get_object_acl(Bucket=bucket_name, Key=object_key)
print(acl)

# Установить ACL объекта
s3.put_object_acl(
Bucket=bucket_name,
Key=object_key,
ACL='public-read' # варианты: private, public-read, authenticated-read, etc.
)

Рекомендации по ACL

  • Используйте ACL для простых сценариев доступа;
  • Для сложных политик лучше применять IAM-пользователей и роли;
  • Будьте осторожны с публичными ACL: любой пользователь в интернете сможет получить доступ к объекту;
  • ACL удобно использовать для временного доступа или при совместной работе с внешними пользователями.

Политики доступа (Bucket Policies)

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

Основные возможности

  • Разрешать или запрещать доступ к бакету и объектам;
  • Настраивать условия доступа, например по IP-адресу, времени или используемым методам API;
  • Управлять доступом для отдельных пользователей IAM, групп или внешних аккаунтов AWS;
  • Совмещать с ACL для более детального контроля.

Формат политики

Политика записывается в формате JSON и состоит из:

  • Version — версия схемы политики;
  • Statement — массив правил, где каждое правило включает:
    • Effect — разрешение (Allow) или запрет (Deny);
    • Action — действия, которые разрешены или запрещены (например, s3:GetObject, s3:PutObject);
    • Resource — объекты или бакеты, к которым применяется правило;
    • Condition — необязательные условия (IP, время, MFA и др.).

Пример простой политики, разрешающей чтение всех объектов в бакете:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}

Примеры работы с bucket policy

AWS CLI
# Получить политику бакета
aws s3api get-bucket-policy --bucket my-bucket

# Установить политику бакета
aws s3api put-bucket-policy --bucket my-bucket --policy file://policy.json

# Удалить политику бакета
aws s3api delete-bucket-policy --bucket my-bucket
Python (boto3)

С помощью Python и библиотеки boto3 можно управлять политикой доступа к бакету:

import boto3
import json

s3 = boto3.client('s3')
bucket_name = 'my-bucket'

# Пример политики в формате Python dict
policy = {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": f"arn:aws:s3:::{bucket_name}/*"
}
]
}

# Преобразуем политику в JSON строку
policy_json = json.dumps(policy)

# Установить политику бакета
s3.put_bucket_policy(Bucket=bucket_name, Policy=policy_json)

# Получить политику бакета
current_policy = s3.get_bucket_policy(Bucket=bucket_name)
print(current_policy['Policy'])

# Удалить политику бакета
s3.delete_bucket_policy(Bucket=bucket_name)

Рекомендации по политикам доступа

  • Используйте политики доступа для более сложных сценариев доступа, когда ACL недостаточно;
  • Всегда проверяйте права перед публикацией политики, чтобы случайно не открыть доступ всему миру;
  • Комбинируйте с IAM-ролями и пользователями для безопасного управления доступом;
  • Тестируйте политики на отдельном бакете перед применением на боевом хранилище.

Подписанные (pre-signed) URL

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

Основные возможности

  • Доступ к объекту возможен без дополнительных учетных данных;
  • Срок действия URL можно задать при создании (например, 5 минут, 1 час, 1 день);
  • Можно создать подписанный URL для чтения (GET) или записи (PUT) объекта;
  • Полезно для временного предоставления доступа сторонним приложениям или клиентам.

Примеры использования

  1. Предоставление доступа клиенту
  • Вы хотите, чтобы пользователь скачал отчет, не открывая полный доступ к бакету;
  • Создаете pre-signed URL с ограниченным сроком действия и отправляете пользователю.
  1. Временная загрузка данных
  • Вы хотите, чтобы клиент загрузил файл в ваш бакет, но не предоставляли ему учетные данные S3 напрямую;
  • Создаете pre-signed URL для метода PUT, который позволяет клиенту загрузить конкретный файл в бакет;
  • URL действителен только в течение ограниченного времени, после чего доступ прекращается.
  1. Интеграция с веб-приложениями
  • В браузере можно загружать или скачивать файлы напрямую из S3 без проксирования через сервер, используя pre-signed URL.

Пример создания pre-signed URL через AWS SDK (Python)

import boto3
from botocore.exceptions import NoCredentialsError
from datetime import datetime, timedelta

s3_client = boto3.client('s3')

bucket_name = 'my-bucket'
object_key = 'example.txt'
expiration = 3600 # срок действия в секундах (1 час)

try:
url = s3_client.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': bucket_name,
'Key': object_key
},
ExpiresIn=expiration
)
print("Pre-signed URL:", url)
except NoCredentialsError:
print("Ошибка: учетные данные не найдены")

Этот URL можно использовать в браузере или приложении для скачивания файла в течение указанного времени.

Рекомендации по подписанным URL

  • Используйте короткий срок действия для URL, чтобы повысить безопасность;
  • Предоставляйте URL только доверенным пользователям или приложениям;
  • Не включайте чувствительные данные в объект, к которому создаете pre-signed URL, если доступ будет публичным;
  • Pre-signed URL действуют даже для объектов с ограниченным доступом, но не продлеваются автоматически — необходимо создавать новый URL после истечения срока.

Управление доступом через IAM (Identity and Access Management)

IAM — система управления идентификацией и доступом.
Она позволяет централизованно управлять пользователями, группами, ролями и их правами на доступ к различным ресурсам, включая S3-хранилище.

IAM используется для:

  • создания и настройки учетных записей пользователей и сервисов;
  • назначения ролей с определенными наборами разрешений;
  • контроля аутентификации и авторизации при доступе к данным;
  • централизованного управления безопасностью в масштабах всей инфраструктуры.

Пример: вы можете создать роль backup-service, которая будет иметь право только читать и записывать объекты в определенный бакет, но не сможет их удалять. Такой подход особенно полезен в корпоративных системах, где важно обеспечить четкое разграничение прав между пользователями и сервисами.


Общие рекомендации по управлению доступом

  • Используйте минимально необходимые права: предоставляйте только те операции, которые действительно необходимы;
  • Избегайте публичного доступа, если он не требуется;
  • Применяйте шифрование данных при хранении и передаче;
  • Регулярно проверяйте политики и ACL, чтобы убедиться, что они соответствуют текущим требованиям безопасности;
  • Для временного доступа предпочитайте подписанные URL, а не постоянные ключи;
  • Если используется IAM, следите за тем, чтобы роли и политики соответствовали принципу наименьших привилегий.