Кастомные роли позволяют гибко настроить права дополнительного пользователя S3, если стандартных уровней доступа недостаточно.
В панели управления S3 доступны готовые уровни доступа: «Чтение», «Чтение и запись», «Управление» и «Нет доступа». Это пресеты для популярных сценариев, которые помогают быстро выдать типовые права. Если нужен более точный набор разрешений, его можно настроить через API: например, разрешить пользователю работать только с отдельными префиксами, объектами или действиями.
Например, с помощью кастомной роли можно выдать пользователю доступ только к нужной части бакета и разрешить только те действия, которые требуются для его задачи: чтение, загрузку, удаление или работу с версиями объектов.
Такая настройка выполняется через IAM-совместимую политику пользователя. Политика применяется к конкретному дополнительному пользователю и не меняет права остальных пользователей бакета.
Кастомная роль не заменяет политики бакета. Политика бакета задает правила доступа на уровне бакета, а кастомная роль ограничивает действия конкретного пользователя.
Предварительная подготовка
Перед настройкой кастомной роли:
-
Создайте дополнительного пользователя S3.
-
Установите и настройте AWS CLI.
-
Подготовьте реквизиты основного пользователя S3 или пользователя с правами на управление политиками.
При создании дополнительного пользователя в панели управления можно не выдавать ему доступ к нужному бакету и не назначать разрешения. Необходимые права будут настроены ниже с помощью пользовательской политики.
В бакете заранее создайте папки, для которых будут настроены разные права:
-
public/— для файлов, которые пользователь сможет только читать; -
uploads/— для файлов, которые пользователь сможет читать и загружать; -
reports/— для файлов, которые пользователь сможет читать, загружать и удалять.
В S3 папки являются префиксами в именах объектов.
Создание политики
Создайте файл user-prefix-policy.json:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListWholeBucket",
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::<имя_бакета>"]
},
{
"Sid": "ReadPublicPrefix",
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:GetObjectVersion"],
"Resource": ["arn:aws:s3:::<имя_бакета>/public/*"]
},
{
"Sid": "UploadToUploadsPrefix",
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:GetObjectVersion", "s3:PutObject"],
"Resource": ["arn:aws:s3:::<имя_бакета>/uploads/*"]
},
{
"Sid": "ManageReportsPrefix",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectVersion",
"s3:PutObject",
"s3:DeleteObject",
"s3:DeleteObjectVersion"
],
"Resource": ["arn:aws:s3:::<имя_бакета>/reports/*"]
}
]
}
Вместо <имя_бакета> укажите имя вашего бакета.
Другие действия для поля Action можно подобрать по списку поддерживаемых методов для работы с объектами.
Права на объекты задаются через ARN вида:
arn:aws:s3:::<имя_бакета>/<префикс>/*
Для просмотра списка объектов используется отдельное действие s3:ListBucket. Оно применяется к ARN бакета без префикса:
arn:aws:s3:::<имя_бакета>
В примере
s3:ListBucketразрешен для всего бакета. Это значит, что пользователь сможет видеть список объектов в бакете, но выполнять действия с объектами сможет только в разрешенных префиксах.
Применение политики
Примените политику к дополнительному пользователю:
aws iam put-user-policy \ --user-name <имя_пользователя> \ --policy-name user-prefix-policy \ --policy-document file://user-prefix-policy.json \ --endpoint-url https://s3.twcstorage.ru \ --region ru-1
После выполнения команды политика будет привязана к пользователю.
Если нужно изменить права, отредактируйте файл user-prefix-policy.json и повторно выполните команду put-user-policy с тем же именем политики. Новая версия политики заменит предыдущую.
Проверка доступа
Чтобы проверить права, настройте отдельный профиль AWS CLI с реквизитами дополнительного пользователя:
aws configure --profile s3-limited-user
Укажите S3 Access Key, S3 Secret Key, регион ru-1 и формат вывода json.
Проверьте, что пользователь может посмотреть список объектов:
aws s3 ls s3://<имя_бакета> \
--profile s3-limited-user \
--endpoint-url https://s3.twcstorage.ru
Проверьте загрузку в разрешенный префикс:
aws s3 cp test.txt s3://<имя_бакета>/uploads/test.txt \
--profile s3-limited-user \
--endpoint-url https://s3.twcstorage.ru
Проверьте действие, которое не входит в политику. Например, пользователь не должен удалять файлы из префикса uploads/:
aws s3 rm s3://<имя_бакета>/uploads/test.txt \
--profile s3-limited-user \
--endpoint-url https://s3.twcstorage.ru
Если политика применена корректно, команда завершится ошибкой доступа.
Удаление политики
Чтобы удалить кастомную роль у пользователя, выполните команду:
aws iam delete-user-policy \ --user-name <имя_пользователя> \ --policy-name user-prefix-policy \ --endpoint-url https://s3.twcstorage.ru \ --region ru-1
После удаления политики у пользователя останутся только права, заданные для него в панели управления S3.