---
title: "Кастомные роли пользователей S3-хранилища"
---

> Полный индекс документации для ИИ-агентов: [llms.txt](https://timeweb.cloud/llms.txt).

Кастомные роли позволяют гибко настроить права дополнительного пользователя S3, если [стандартных уровней доступа](https://timeweb.cloud/docs/s3-storage/manage-storage/additional-users#urovni-dostupa) недостаточно.

В панели управления S3 доступны готовые уровни доступа: «Чтение», «Чтение и запись», «Управление» и «Нет доступа». Это пресеты для популярных сценариев, которые помогают быстро выдать типовые права. Если нужен более точный набор разрешений, его можно настроить через API: например, разрешить пользователю работать только с отдельными префиксами, объектами или действиями.

Например, с помощью кастомной роли можно выдать пользователю доступ только к нужной части бакета и разрешить только те действия, которые требуются для его задачи: чтение, загрузку, удаление или работу с версиями объектов.

Такая настройка выполняется через IAM-совместимую политику пользователя. Политика применяется к конкретному дополнительному пользователю и не меняет права остальных пользователей бакета.

> [!NOTE]
> Кастомная роль не заменяет [политики бакета](https://timeweb.cloud/docs/s3-storage/supported-features/bucket-policies). Политика бакета задает правила доступа на уровне бакета, а кастомная роль ограничивает действия конкретного пользователя.

## Предварительная подготовка

Перед настройкой кастомной роли:

1.  Создайте [дополнительного пользователя S3](https://timeweb.cloud/docs/s3-storage/manage-storage/additional-users).
    
2.  Установите и настройте [AWS CLI](https://timeweb.cloud/docs/s3-storage/tools/aws-cli).
    
3.  Подготовьте реквизиты основного пользователя S3 или пользователя с правами на управление политиками.
    

При создании дополнительного пользователя в панели управления можно не выдавать ему доступ к нужному бакету и не назначать разрешения. Необходимые права будут настроены ниже с помощью пользовательской политики.

В бакете заранее создайте папки, для которых будут настроены разные права:

-   `public/` — для файлов, которые пользователь сможет только читать;
    
-   `uploads/` — для файлов, которые пользователь сможет читать и загружать;
    
-   `reports/` — для файлов, которые пользователь сможет читать, загружать и удалять.
    

В S3 папки являются префиксами в именах объектов. 

## Создание политики

Создайте файл `user-prefix-policy.json`:

```js
{
 "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` можно подобрать по списку поддерживаемых [методов для работы с объектами](https://timeweb.cloud/docs/s3-storage/manage-storage/s3-guide#metody-dlya-raboty-s-obektami).

Права на объекты задаются через ARN вида:

```bash
arn:aws:s3:::<имя_бакета>/<префикс>/*
```

Для просмотра списка объектов используется отдельное действие `s3:ListBucket`. Оно применяется к ARN бакета без префикса:

```bash
arn:aws:s3:::<имя_бакета>
```

> [!NOTE]
> В примере `s3:ListBucket` разрешен для всего бакета. Это значит, что пользователь сможет видеть список объектов в бакете, но выполнять действия с объектами сможет только в разрешенных префиксах.

## Применение политики

Примените политику к дополнительному пользователю:

```bash
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 с реквизитами дополнительного пользователя:

```bash
aws configure --profile s3-limited-user
```

Укажите S3 Access Key, S3 Secret Key, регион `ru-1` и формат вывода `json`.

Проверьте, что пользователь может посмотреть список объектов:

```bash
aws s3 ls s3://<имя_бакета> \
 --profile s3-limited-user \
 --endpoint-url https://s3.twcstorage.ru
```

Проверьте загрузку в разрешенный префикс:

```bash
aws s3 cp test.txt s3://<имя_бакета>/uploads/test.txt \
 --profile s3-limited-user \
 --endpoint-url https://s3.twcstorage.ru
```

Проверьте действие, которое не входит в политику. Например, пользователь не должен удалять файлы из префикса `uploads/`:

```bash
aws s3 rm s3://<имя_бакета>/uploads/test.txt \
 --profile s3-limited-user \
 --endpoint-url https://s3.twcstorage.ru
```

Если политика применена корректно, команда завершится ошибкой доступа.

## Удаление политики

Чтобы удалить кастомную роль у пользователя, выполните команду:

```bash
aws iam delete-user-policy \
 --user-name <имя_пользователя> \
 --policy-name user-prefix-policy \
 --endpoint-url https://s3.twcstorage.ru \
 --region ru-1
```

После удаления политики у пользователя останутся только права, заданные для него в панели управления S3.
