Доступ к учетным данным учетной записи службы Google Cloud в ОС контейнера внутри контейнера Docker

Использование оптимизированной для контейнеров ОС (COS) в Google Cloud Compute - лучшее способ доступа к учетным данным учетной записи службы по умолчанию для виртуальной машины -project из контейнера Docker?

$ gcloud compute instances create test-instance \
  --image=cos-stable --image-project=cos-cloud

$ ssh (ip of the above)
# gcloud ...
Command not found

# docker run -ti google/cloud-sdk:alpine /bin/sh
# gcloud auth activate-service-account
... --key-file: Must be specified.

Если бы учетные данные были на виртуальной машине, Docker мог бы просто их смонтировать. Обычно учетные данные должны быть в .config/gcloud/, и сделать это с помощью docker run -v ~/.config/gcloud:~/.config/gcloud image. Неизвестно, доступны ли такие учетные данные в ОС контейнера и где, особенно потому, что они отсутствуют gcloud.

Если учетные данные не находятся на виртуальной машине и могут быть подключены, варианты, по-видимому, включают:

  1. Поместите учетные данные в метаданные контейнера / переменную среды;
  2. Create a .json credentials file for the service account, then
    1. upload it to the VM, then mount it; or
    2. добавить .json в контейнер;
  3. Запустите контейнер Docker (например, cloud-sdk-docker), который получает учетные данные и передает их. с хостами через, например, общий монтируемый раздел. В идеале это было бы с gcloud auth activate-service-account

Есть ли канонический или рекомендуемый способ предоставить контейнеру Docker учетные данные учетной записи службы проекта виртуальной машины?

В Google Cloud уже есть желаемая модель политики безопасности: виртуальная машина внутри проекта должна иметь доступ, предоставляемый учетной записью службы. Чтобы избежать сложности и возможности неправильной конфигурации или сбоя, правильное решение будет использовать эту существующую модель безопасности, то есть не предполагающую создание, загрузку, распространение и поддержку файлов учетных данных.

Похоже, это будет обычная проблема, которую нужно будет решить с помощью COS, Docker и Kubernetes, поэтому я предполагаю, что упустил что-то прямое, но решение не было для меня очевидным из документации.

ИЗМЕНИТЬ. Обратите внимание на set-service-account API - этот вопрос можно свести к следующему:" Как вы используете API set-service-account с Контейнерной ОС? " Если это невозможно (из-за того, что в Контейнерной ОС отсутствуют gcloud и gsutil), я думаю, это следует отметить, чтобы пользователи ВМ могли планировать соответственно.

РЕДАКТИРОВАТЬ Чтобы следующие пользователи перечеркнули это:

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

[local] $ ssh test-instance-ip
[test-instance] $ docker run -it gcr.io/google-appengine/python /bin/bash
[test-instance] $ pip install --upgrade google-cloud-datastore
[test-instance] $ python

>>> from google.cloud import datastore
>>> datastore_client = datastore.Client()
>>> q = datastore.query.Query(datastore_client, kind='MODEL-KIND')
>>> list(q.fetch())
[... results]

Проблема действительно заключалась в областях, заданных в API для экземпляра виртуальной машины, и, в частности, datastore API был отключен для учетной записи по умолчанию (под заголовком Области доступа к облачному API для ВМ). Можно найти области и необходимую datastore строку следующим образом:

> gcloud compute instances describe test-instance
...
serviceAccounts:
- email: *****[email protected]
  scopes:
  - https://www.googleapis.com/auth/datastore
  ...
...

Обратите внимание, что сама учетная запись службы имеет разрешение на хранилище данных (поэтому, как правило, к хранилищу данных можно получить доступ с помощью ключа учетных данных json для служебного ключа). Разрешения учетной записи службы были ограничены областями виртуальной машины.




Ответы (2)


Обычный способ аутентификации - это тот, который отображается в файле readme для Docker из Google Cloud SDK.

Из экземпляра COS выполните это один раз:

docker run -ti --name gcloud-config google/cloud-sdk gcloud auth login

Это сохранит ваши учетные данные в томе контейнера gcloud-config.

Этот том должен монтироваться только с контейнерами, для которых вы хотите иметь доступ к своим учетным данным, которые, вероятно, не будут чем-то отличным от cloud-sdk

docker run --rm -ti --volumes-from gcloud-config google/cloud-sdk:alpine gcloud compute instances create test-docker --project [PROJECT]  


Created [https://www.googleapis.com/compute/v1/projects/project/zones/us-east1-b/instances/test-docker].
NAME         ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP      STATUS
test-docker  us-east1-b  n1-standard-1               10.142.0.8   X.X.X.X  RUNNING

Учетные записи служб обычно предназначены для использования собственного набора учетных данных, которые они должны откуда-то получить, в качестве ключевого файла и переменной среды или токена:

gcloud auth activate-service-account

Если вы хотите, чтобы gcloud (и другие инструменты в Cloud SDK) использовали учетные данные учетной записи службы для выполнения запросов, используйте эту команду, чтобы импортировать эти учетные данные из файла, содержащего закрытый ключ авторизации, и активировать их для использования в gcloud. Эта команда выполняет ту же функцию, что и вход в gcloud auth, но для использования учетной записи службы, а не учетных данных пользователя Google.

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

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

1 - Создайте новую учетную запись службы, а не используйте учетную запись службы по умолчанию Compute Engine.
2 - Предоставьте роли IAM этой учетной записи службы только для необходимых ресурсов.
3 - Настройте экземпляр для работы в качестве этой службы учетной записи.
4 - Предоставьте экземпляру https://www.googleapis.com/auth/cloud-platform.
5 - Избегайте предоставления большего доступа, чем необходимо, и регулярно проверяйте разрешения своего служебного аккаунта, чтобы убедиться, что они актуальны.

ОБНОВЛЕНИЕ

Я не уверен, что set-service-account делает то, что вам нужно / нужно. С его помощью вы можете изменить учетную запись службы, которую использует экземпляр (хотя экземпляр должен быть остановлен, поэтому вы не можете использовать его для изменения учетной записи службы с изменяемым экземпляром). Однако вы можете использовать его в других случаях, см.

jordim@cos ~ $ docker run --rm -ti --volumes-from gcloud-config google/cloud-sdk:alpine gcloud compute instances set-service-account instance-1 --service-account [email protected]
Did you mean zone [us-east1-b] for instance: [instance-1] (Y/n)?  

Updated [https://www.googleapis.com/compute/v1/projects/XX/zones/us-east1-b/instances/instance-1].
person DevopsTux    schedule 14.05.2018
comment
Спасибо, Джорди. Вот пара моментов. 1. gcloud auth login предоставит личные учетные данные, чего следует избегать. 2. Google предоставляет сервис set-service -account API, который явно предназначен для определения учетных данных - но какой смысл в этом API с ОС контейнера, если эти учетные данные недоступны? Я обновлю вопрос, чтобы отметить это. Благодарен за вашу помощь. - person Brian M. Hunt; 14.05.2018
comment
Привет, Джорди, спасибо за обновление. Итак, я хочу, чтобы контейнеры Docker унаследовали учетную запись разрешений / службы своего экземпляра. - person Brian M. Hunt; 16.05.2018
comment
Бот, не так ли? Убедитесь, что ваш экземпляр ContainerOS имеет необходимые области действия, а затем запустите контейнер google / cloud-sdk: alpine в интерактивном режиме (docker run -it google / cloud-sdk: alpine / bin / bash). Оказавшись внутри, создайте экземпляр: gcloud compute instance create test. Если учетная запись службы в вашем базовом экземпляре имеет необходимые разрешения и области действия, вы увидите, как работает контейнер. cloud.google.com/kubernetes-engine/ docs / tutorials / - person DevopsTux; 17.05.2018
comment
При запуске gcloud я получаю недостаточное разрешение; при использовании API хранилища данных я получаю google.api_core.exceptions.Forbidden: 403 Request had insufficient authentication scopes.. У учетной записи службы в метаданных есть доступ на редактирование ко всем ресурсам. - person Brian M. Hunt; 17.05.2018
comment
Это связано с областями экземпляра, а не с разрешениями учетной записи службы. Задайте область экземпляра, чтобы разрешить полный доступ ко всем облачным API, и повторите попытку. Вот как это сделать: cloud.google. ru / compute / docs / access / - person DevopsTux; 17.05.2018
comment
@TarunLalwani Я дал награду за полезные усилия здесь (а таймер истекает через час), но у меня еще не было возможности проверить это - я собираюсь сделать это сегодня. Помечу это как правильный ответ, если он работает, в противном случае я прокомментирую / обновлю вопрос. Скоро вернусь, чтобы проверить. - person Brian M. Hunt; 20.05.2018
comment
Совет @TarunLalwani Jordi действительно устранил проблему, а именно: доступ к хранилищу данных мешал доступ к учетной записи службы. Я добавил еще несколько деталей в вопрос. - person Brian M. Hunt; 20.05.2018

Я думаю, что этот вопрос не совсем актуален на сегодняшний день. Поэтому я хотел бы поделиться своими 2 центами.

В случае ОС, оптимизированной для контейнеров, если виртуальная машина работает с учетной записью службы по умолчанию, она автоматически настраивается внутри контейнера cloud-sdk.

user@instance-1 ~ $ docker run -it gcr.io/google.com/cloudsdktool/cloud-sdk:alpine /bin/bash
bash-5.1# gcloud config list
[component_manager]
disable_update_check = true
[core]
account = *************[email protected]
disable_usage_reporting = true
project = my-project-id
[metrics]
environment = github_docker_image

Your active configuration is: [default]
bash-5.1# gcloud compute instances list
NAME        ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
instance-1  us-central1-a  e2-medium                  10.128.0.3   34.**.**.***  RUNNING

Следовательно, нет необходимости выполнять gcloud auth login, и можно напрямую выполнять все gcloud команды при условии, что учетная запись службы по умолчанию имеет разрешения и виртуальная машина явно включила конкретный API.

Однако этот вариант использования допустим, если виртуальная машина работает с параметром no service account, выбранным во время создания виртуальной машины.

person Manish Bansal    schedule 07.03.2021