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

Как организовать write-only доступ к Object Storage

· 4 мин. чтения

Write-only доступ к Yandex Cloud Object Storage может быть полезен в различных сценариях, когда вам нужно разрешить только запись данных в определенный бакет Object Storage, но не давать доступ к чтению данных из этого бакета.

Вот несколько примеров, когда это может быть полезно:

Загрузка данных из различных источников: Если у вас есть несколько источников данных или пользователей, которые должны загружать информацию в один общий бакет Object Storage, но вы не хотите, чтобы они могли читать или перезаписывать данные других пользователей.

Защита от случайного удаления или изменения данных: Если вы хотите предотвратить случайное удаление или изменение данных в Object Storage, вы можете предоставить только запись, чтобы убедиться, что никто не может изменить или удалить файлы.

Сценарии внешнего взаимодействия: В некоторых случаях вам может потребоваться предоставить сторонним приложениям или сервисам доступ к Object Storage для загрузки данных, но вы не хотите разрешать им доступ к чтению данных.

Журналирование и мониторинг: Write-only доступ может использоваться для журналирования и мониторинга данных. Например, логи приложения могут отправляться в Object Storage с правами только на запись, чтобы обеспечить надежное хранение логов без возможности их изменения или удаления.

Как организовать write-only доступ к Object Storage

Шаг 1: Создайте бакет в Object Storage

Первым шагом является создание бакта в Object Storage, который будет использоваться для хранения ваших данных. Вы можете сделать это, войдя в консоль управления Yandex Cloud, нажав кнопку «Создать ресурс» и выбрав в меню «Бакет».

Далее нужно будет задать его имя.

Шаг 2: Создайте сервисный аккаунт

Для того чтобы предоставить write-only доступ к Object Storage, вам нужно создать сервисный аккаунт, который будет использоваться для доступа к Object Storage. Для этого вам нужно войти в консоль управления Yandex Cloud, на странице фолдера, в котором вы создали бакет, выбрать таб «Сервисные аккаунты» и создать новый.

После этого нужно создать статический ключ доступа. Сгенерированный ключ доступа нужно сохранить в файл ~/.aws/credentials , так как после создания вы больше не сможете его увидеть. Нам он понадобится на шаге 4 для проверки доступа.

Стоит отметить, что роль storage.uploader шире чем нужно для write-only доступа. Именно поэтому вам нужно будет задать политику доступа, которая ограничит доступ сервисного аккаунта только для записи.

Шаг 3: Создайте политику доступа

Для того чтобы ограничить доступ сервисного аккаунта только для записи, нужно создать политику доступа, которая ограничит доступ сервисного аккаунта только для записи в бакет Object Storage. Для этого вам нужно войти в консоль управления Yandex Cloud, на странице бакета, в который вы хотите ограничить доступ, выбрать таб «Политика доступа» и создать новую политику доступа.

В поле «Действия» нужно выбрать PutObject и PutObjectAcl, а в поле «Ресурс» нужно указать бакет.

Аналогичного эффекта можно добиться если задать политику доступа через CLI или API. Например, вот как это можно сделать:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::bucket-name/*"
]
}
]
}

Шаг 4: Проверьте доступ

После того как вы создали сервисный аккаунт и политику доступа, вы можете проверить доступ к Object Storage.

Команда ниже должна вывести ошибку, так как мы пытаемся прочитать список файлов в бакете, но у нас нет прав на чтение.

aws s3 ls s3://bucket-name \
--endpoint-url=https://storage.yandexcloud.net \
--profile sa-name

Ошибка будет выглядеть примерно так:

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

Теперь мы можем проверить, что загрузка файлов работает:

aws s3 cp ./test.txt s3://bucket-name/test.txt \
--endpoint-url=https://storage.yandexcloud.net \
--profile sa-name

Если вы хотите проверить, что не вы можете прочитать файл, который вы только что загрузили, вы можете сделать это так:

aws s3 cp s3://bucket-name/test.txt ./test.txt \
--endpoint-url=https://storage.yandexcloud.net \
--profile sa-name

Вы должны получить ошибку:

fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden