Доступ к бакету другого пользователя

Доступ к бакету другого пользователя

Инструкция описывает пример, как предоставить одному пользователю доступ к бакету другого пользователя в S3-совместимом объектном хранилище внутри одного аккаунта (тенанта).

Важно: доступ через Панель управления

Если доступ нужен внутри панели управления, используйте встроенные механизмы:

  • Проекты
  • Роли пользователей

Чтобы пользователь видел или изменял бакеты:

  • его нужно добавить в проект владельца бакета
  • назначить соответствующую роль (редактирование или только просмотр)

Использование bucket policy требуется только если:

  • доступ нужен на уровне API / CLI
  • или между пользователями, не связанными через проект

Ограничения

  • Оба пользователя должны быть в одном тенанте
  • Политику может задать только владелец бакета
  • Используется Bucket Policy, не ACL

Исходные данные

Есть два пользователя:

  • User A — владелец бакета
  • User B — пользователь, которому нужен доступ

У каждого есть сгенерированные ранее в панели управления ключи доступа (создание ключей доступа):

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

Endpoint объектного хранилища:

https://storage.pro-data.tech (пример url в зоне доступности UZ-5)

🪪 Шаг 1. Определить tenant и user ID

Выполнить (для каждого пользователя отдельно):

aws --endpoint-url https://storage.pro-data.tech s3api list-buckets

В ответе:

"Owner": {
"DisplayName": "...",
"ID": "company$USR123456"
}

Расшифровка:

company$USR123456
│ │
│ └── user_id
└────────── tenant

✅ Проверка

Если tenant совпадает — можно продолжать.
Если нет — доступ выдать нельзя.


📦 Шаг 2. Проверить бакет и текущие права

ACL (от имени владельца):

  1. aws --endpoint-url https://storage.pro-data.tech s3api get-bucket-acl \
  2. --bucket <bucket-name>

Обычно:

  • только владелец имеет FULL_CONTROL
  • бакет приватный

Проверка доступа у User B:

  1. aws --endpoint-url https://storage.pro-data.tech s3api list-objects \
  2. --bucket <bucket-name>

Ожидаемо:

403 Forbidden

🔑 Шаг 3. Выдать доступ через Bucket Policy

Действие выполняет владелец бакета (User A)


🧠 Где взять корректный ARN пользователя

Для указания пользователя в policy нужен корректный ARN.

📍 Его можно получить в панели управления:

  • Настройки → Управление пользователями
  • выбрать пользователя
  • нажать иконку 

👉 Используйте именно этот ARN, чтобы избежать ошибок.


🟢 Вариант 1: Только чтение

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Sid": "AllowRead",
  6. "Effect": "Allow",
  7. "Principal": {
  8. "AWS": "arn:aws:iam::<tenant>:user/<user_id>"
  9. },
  10. "Action": [
  11. "s3:ListBucket",
  12. "s3:GetObject"
  13. ],
  14. "Resource": [
  15. "arn:aws:s3:::<bucket>",
  16. "arn:aws:s3:::<bucket>/*"
  17. ]
  18. }
  19. ]
  20. }

🟡 Вариант 2: Чтение + запись

  1. {
  2. "Version": "2012-10-17",
  3. "Statement": [
  4. {
  5. "Sid": "AllowReadWrite",
  6. "Effect": "Allow",
  7. "Principal": {
  8. "AWS": "arn:aws:iam::<tenant>:user/<user_id>"
  9. },
  10. "Action": [
  11. "s3:ListBucket",
  12. "s3:GetObject",
  13. "s3:PutObject",
  14. "s3:DeleteObject"
  15. ],
  16. "Resource": [
  17. "arn:aws:s3:::<bucket>",
  18. "arn:aws:s3:::<bucket>/*"
  19. ]
  20. }
  21. ]
  22. }

📌 Применение policy

  1. aws --endpoint-url https://storage.pro-data.tech s3api put-bucket-policy \
  2. --bucket <bucket-name> \
  3. --policy '<JSON>'

📍 Формирование Resource

Обязательно указать оба:

arn:aws:s3:::bucket-name
arn:aws:s3:::bucket-name/*

🧪 Шаг 4. Проверка доступа

Проверка policy:

  1. aws --endpoint-url https://storage.pro-data.tech s3api get-bucket-policy \
  2. --bucket <bucket-name>

Проверка от User B:

  1. aws --endpoint-url https://storage.pro-data.tech s3api list-objects \
  2. --bucket <bucket-name>

Ожидаемо:

{
"Contents": [...]
}

❌ Шаг 5. Отзыв доступа

  1. aws --endpoint-url https://storage.pro-data.tech s3api delete-bucket-policy \
  2. --bucket <bucket-name>

🚨 Типичные ошибки

❌ Пользователи в разных tenant'ах

→ доступ не работает


❌ Неверный ARN

→ policy не применяется
👉 всегда лучше брать из панели


❌ Указан только один Resource

→ часть операций даёт 403


❌ Попытка использовать ACL

→ не подходит для межпользовательского доступа


🧾 Результат

После выполнения:

  • User B получает доступ к бакету User A
  • уровень доступа соответствует policy

⚡ Кратко

ДействиеКто выполняет
Узнать user ID         любой пользователь
Проверить ACL         владелец
Выдать доступ         владелец
Проверить доступ         пользователь B
Отозвать доступ         владелец