Как организовать write-only доступ к Object Storage
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