Google Cloud: как добавить роль пользователя сервиса в отдельную корзину?

Я создал пользователя службы:

gcloud iam service-accounts create test01 --display-name "test01"

И я дал ему полный доступ к Cloud Storage:

gcloud projects add-iam-policy-binding project-name \
--member serviceAccount:[email protected] \
--role roles/storage.admin

Этот код работает:

from google.cloud import storage
client = storage.Client()

buckets = list(client.list_buckets())
print(buckets)

bucket = client.get_bucket('bucket-name')
print list(bucket.list_blobs())

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

В документации я нашел этот текст:

При применении к отдельному сегменту управление применяется только к указанному сегменту и объектам в нем.

Как применить roles/storage.admin к отдельному ведру?

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

gsutil iam ch \
  serviceAccount:[email protected]:legacyBucketOwner \
  gs://bucket-name

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

Обновление 2:
Я обновил ACL по умолчанию:

gsutil defacl ch -u \
  [email protected]:OWNER gs://bucket-name

Я ждал много времени, создал другой файл другим пользователем, а он по-прежнему недоступен для test01.

Решение.
Я сделал это с нуля, и оно работает:

gsutil mb -p example-logs -c regional -l EUROPE-WEST2 gs://example-dev
gcloud iam service-accounts create test-dev --display-name "test-dev"
gcloud iam service-accounts create test-second --display-name "test-second"
# download 2 json keys from https://console.cloud.google.com/iam-admin/serviceaccounts
gsutil iam ch serviceAccount:[email protected]:legacyBucketOwner gs://example-dev
gsutil iam ch serviceAccount:[email protected]:legacyBucketOwner gs://example-dev
gsutil defacl ch -u [email protected]:OWNER gs://example-dev

person Dmitry    schedule 10.10.2018    source источник


Ответы (1)


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

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

Если это слишком много, вы можете выбрать НЕ предоставлять пользователю «Администратора хранилища», и тогда ему не будет разрешен доступ к какой-либо корзине. Очевидно, это слишком ограничительно. Затем вы можете выбрать отдельные сегменты, к которым вы хотите, чтобы пользователь имел доступ, и для каждого из этих сегментов изменить права доступа ТАКИХ сегментов. В рамках разрешений корзины вы можете давать имена пользователям и ролям. Только для этой корзины указанный пользователь будет иметь указанную роль.

Дополнительные сведения см. В разделе Создание списков управления доступом (ACL) и управление ими < / а>.

person Kolban    schedule 10.10.2018
comment
Может быть, подумайте о ведре как о файловой системе Linux. В этой модели корзина похожа на каталог, и теперь вы добавили разрешения для пользователя на работу с новыми файлами в каталоге, но, как и в Linux, объекты в корзине могут иметь свои собственные разрешения. Может быть, объекты, которые вы помещаете в этот каталог, не имеют разрешений, чтобы ваш желаемый пользователь мог их читать? Может попробовать: gsutil ls -L gs://BUCKET/OBJECT - person Kolban; 10.10.2018
comment
Я понял, но как мне сделать полный доступ к ведру для одного основного пользователя? Если другой пользователь (например, gsutil в консоли) создает файл, недоступный для основного пользователя. В Linux я могу использовать setfacl, чтобы сделать новые файлы доступными. Но я не знаю, как это сделать с ведром. - person Dmitry; 11.10.2018
comment
Дай мне посмотреть, понимаю ли я. Я думаю, вы хотите создать корзину (XYZ), и вы хотите, чтобы эта корзина была полностью доступна пользователю ABC. Пользователь ABC может создавать, удалять, читать объекты в ведре. Однако, если другой пользователь DEF создает объект, вы обнаруживаете, что ABC не может получить к нему доступ? Это история? - person Kolban; 11.10.2018
comment
Спасибо, но это не помогло. Я обновил свой пост. - person Dmitry; 12.10.2018
comment
Боюсь, я не могу воссоздать проблему. Однако я очень хочу помочь, если смогу. Я создал здесь чат-комнату, где мы можем поговорить более подробно и при желании перейти к демонстрации экрана .... chat.stackoverflow .com / rooms / 181780 / kolban. - person Kolban; 12.10.2018
comment
Спасибо, я создам для него воспроизводимый сценарий. - person Dmitry; 15.10.2018