Создать ключ доступа
Для работы с Object Storage через S3 API необходим ключ доступа. Ключи доступа создаются через Identity and Access Management с использованием сервисных аккаунтов. Можно использовать статический ключ или выпустить на его основе временный ключ с ограниченными правами и сроком действия.
Перед началом работы
-
Создайте сервисный аккаунт в проекте:
kubectl create serviceaccount <имя_сервисного_аккаунта> -n <название_проекта> -
Назначьте сервисному аккаунту роль
storage.editorдля доступа к бакетам:apiVersion: iam.stackland.yandex.cloud/v1alpha1 kind: AccessBinding metadata: name: <имя_сервисного_аккаунта>-storage-access namespace: <название_проекта> spec: roleID: storage.editor subject: kind: ServiceAccount name: <имя_сервисного_аккаунта> namespace: <название_проекта>Сохраните манифест в файл
access-binding.yamlи примените его:kubectl apply -f access-binding.yaml -
Создайте статический ключ доступа для сервисного аккаунта:
apiVersion: iam.stackland.yandex.cloud/v1alpha1 kind: AccessKey metadata: name: <имя_сервисного_аккаунта>-s3-key namespace: <название_проекта> spec: serviceAccountRef: <имя_сервисного_аккаунта>Сохраните манифест в файл
access-key.yamlи примените его:kubectl apply -f access-key.yaml -
Проверьте готовность ключа:
kubectl get accesskey <имя_сервисного_аккаунта>-s3-key -n <название_проекта>Дождитесь значения
Trueв колонкеREADY. Имя созданного секрета отображается в колонкеSECRETи полеstatus.secretName. -
Получите идентификатор и секретную часть ключа из секрета:
S3_SECRET_NAME=$(kubectl get accesskey <имя_сервисного_аккаунта>-s3-key -n <название_проекта> -o jsonpath='{.status.secretName}') export AWS_ACCESS_KEY_ID=$(kubectl get secret -n <название_проекта> "$S3_SECRET_NAME" -o jsonpath='{.data.access-key-id}' | base64 -d) export AWS_SECRET_ACCESS_KEY=$(kubectl get secret -n <название_проекта> "$S3_SECRET_NAME" -o jsonpath='{.data.access-key-secret}' | base64 -d) export AWS_DEFAULT_REGION=ru-central1 unset AWS_SESSION_TOKEN -
Проверьте подключение к Object Storage:
export CLUSTER_DOMAIN=$(kubectl get platformenvironments main -o jsonpath='{.status.clusterDomain}') aws --endpoint-url=https://storage.sys.$CLUSTER_DOMAIN s3 ls
-
Если вы еще не открыли проект, выберите проект.
-
В левом меню выберите Сервисные аккаунты.
-
Нажмите Создать сервисный аккаунт.
-
Укажите имя сервисного аккаунта и нажмите Создать.
-
Выберите созданный сервисный аккаунт.
-
Перейдите на вкладку Ключи доступа.
-
Нажмите Создать ключ.
-
Сохраните Access Key ID и Secret Access Key.
Важно
Секретный ключ отображается только один раз. Сохраните его в надежном месте.
-
Назначьте сервисному аккаунту роль
storage.editor:- Перейдите в раздел Права доступа проекта.
- Нажмите Назначить роль.
- Выберите роль
storage.editor. - В качестве субъекта выберите созданный сервисный аккаунт.
- Нажмите Назначить.
Создать временный ключ доступа
STS включается автоматически вместе с Object Storage. Для получения ключа используйте AWS CLI и эндпоинт https://sts.sys.<домен кластера>.
-
Создайте сервисный аккаунт, назначьте ему необходимые права на бакет и получите статический ключ по инструкции выше. Настройте AWS CLI на использование этого ключа. Права сервисного аккаунта должны разрешать операции, которые вы хотите предоставить приложению.
-
Сохраните политику временного доступа в файл
policy.json. Например, разрешите читать объекты только с префиксомreports/в бакетеapp-data:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::app-data/reports/*" } ] }Замените имя бакета и префикс на свои. В одной политике STS задавайте доступ к одному бакету. Подробнее о формате политики читайте в документации STS.
-
Запросите временный ключ на один час:
aws --endpoint-url=https://sts.sys.<домен_кластера> --region ru-central1 sts assume-role \ --role-arn stackland-storage-session \ --role-session-name reports-reader \ --policy file://policy.json \ --duration-seconds 3600В
--role-arnпередается произвольное описание длиной от 20 символов, а в--role-session-name— имя сессии. Для них используйте латинские буквы, цифры,_и-. Параметр--duration-secondsзадает срок действия в секундах, максимум —43200(12 часов). -
Из блока
Credentialsв ответе передайте приложениюAccessKeyId,SecretAccessKeyиSessionToken. Для AWS CLI задайте их в отдельной сессии терминала:export AWS_ACCESS_KEY_ID='<AccessKeyId>' export AWS_SECRET_ACCESS_KEY='<SecretAccessKey>' export AWS_SESSION_TOKEN='<SessionToken>'При работе с временным ключом токен сессии обязателен. В поле
Expirationуказан момент окончания действия ключа. -
Проверьте чтение существующего объекта из разрешенного префикса:
aws --endpoint-url=https://storage.sys.<домен_кластера> --region ru-central1 s3 cp \ s3://app-data/reports/<имя_объекта> ./Замените путь на путь к своему объекту. Для получения следующего временного ключа снова используйте исходный статический ключ.
Доступные роли
storage.viewer— позволяет читать объекты и получать список бакетов.storage.editor— позволяет читать, создавать, изменять и удалять объекты.storage.admin— полный доступ к Object Storage, включая управление настройками бакетов.
Что дальше
- Узнайте больше об управлении доступом в Object Storage.
- Ознакомьтесь с документацией Identity and Access Management.