在 Docker 容器内的容器 OS 上访问 Google 云服务帐户凭据
Access Google Cloud service account credentials on Container OS inside Docker Container
-
google-compute-engine
-
google-cloud-platform
-
google-container-registry
-
google-container-os
-
google-iam
在 Docker 容器中将 Container Optimized OS (COS) on Google Cloud Compute, what's the best way to access the credentials of the default service account 用于 VM-project?
$ 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.
如果凭据在 VM 上,那么 Docker 可以只安装这些凭据。通常凭据将在 .config/gcloud/
中,并使用 docker run -v ~/.config/gcloud:~/.config/gcloud image
执行此操作。 Container OS 中是否以及在何处提供此类凭据并不明显,特别是因为缺少 gcloud
.
如果 VM 上的凭据失败并且无法安装,选项似乎包括:
- 将凭据放入容器元数据/环境变量中;
- 为服务帐户创建一个
.json
凭据文件,然后
- 上传到虚拟机,然后挂载;或
- 将
.json
添加到容器中;
- 运行 一个 Docker 容器(例如 cloud-sdk-docker),它获取凭据并通过例如与主机共享它们共享挂载分区。理想情况下,这将与
gcloud auth activate-service-account
是否有规范或 best-practices 方法来为 Docker 容器提供 VM 项目的服务帐户凭据?
Google Cloud 已经有一个 security-policy 模型,所需的模型:项目中的 VM 应该具有服务帐户提供的访问权限。为避免复杂性和错误配置或事故的可能性,正确的解决方案应采用现有的安全模型,即不涉及创建、下载、分发和维护凭证文件。
感觉这将是一个常规问题,需要用 COS、Docker 和 Kubernetes 来解决,所以我想我错过了一些直截了当的东西——但是解决方案从文档中对我来说并不明显。
EDIT — 注意 set-service-account API — 这个问题可以简化为 "How do you use the set-service-account API with Container OS?" 如果不可能(因为 Container OS 缺少 gcloud
和 gsutil
),我认为应该注意这一点,以便 VM 用户可以相应地进行计划。
编辑 对于下一个人来说:
为了重现这个问题,我使用了:
[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 中为 VM 实例设置的范围,特别是 datastore
API 已为默认帐户禁用(在 [=52 标题下) =]Cloud API VM 的访问范围)。可以找到范围和必要的 datastore
行,如下所示:
> gcloud compute instances describe test-instance
...
serviceAccounts:
- email: *****-compute@developer.gserviceaccount.com
scopes:
- https://www.googleapis.com/auth/datastore
...
...
请注意,服务帐户本身具有访问数据存储的权限(因此通常可以使用服务密钥的 json 凭据密钥访问数据存储)。服务帐户权限受 VM 范围限制。
通常的验证方式是出现在 Google cloud SDK Docker readme 上的方式。
从 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
If you want gcloud (and other tools in the Cloud SDK) to use service account credentials to make requests, use this command to import these credentials from a file that contains a private authorization key, and activate them for use in gcloud. This command serves the same function as gcloud auth login but for using a service account rather than your Google user credentials.
另外,best practice是为不同的实例创建不同的服务账号,而不是获取默认服务账号的密钥并使用:
In general, Google recommends that each instance that needs to call
a Google API should run as a service account with the minimum
permissions necessary for that instance to do its job. In practice,
this means you should configure service accounts for your instances
with the following process:
1 - Create a new service account rather than using the Compute Engine
default service account.
2 - Grant IAM roles to that service account for
only the resources that it needs.
3 - Configure the instance to run as
that service account.
4 - Grant the instance the
https://www.googleapis.com/auth/cloud-platform scope.
5 - Avoid granting
more access than necessary and regularly check your service account
permissions to make sure they are up-to-date.
更新
我不确定 set-service-account 是否按照您的要求执行 need/want。使用它,您可以更改实例使用的服务帐户(尽管必须停止该实例,因此您不能使用它来更改正在更改的实例的服务帐户)。但是您可以正常将其用于其他实例,请参阅:
jordim@cos ~ $ docker run --rm -ti --volumes-from gcloud-config google/cloud-sdk:alpine gcloud compute instances set-service-account instance-1 --service-account xx-compute@developer.gserviceaccount.com
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].
我认为这个问题在今天还不完全有效。因此,我想分享我的 2 美分。
在容器优化的情况下 OS,如果 VM 是 运行 默认服务帐户,那么它会在 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 = *************-compute@developer.gserviceaccount.com
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
命令,前提是默认服务帐户具有权限并且VM已显式启用特定api。
但是,如果在创建 VM 期间选择了 运行 no service account
选项,则此用例有效。
google-compute-engine
google-cloud-platform
google-container-registry
google-container-os
google-iam
在 Docker 容器中将 Container Optimized OS (COS) on Google Cloud Compute, what's the best way to access the credentials of the default service account 用于 VM-project?
$ 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.
如果凭据在 VM 上,那么 Docker 可以只安装这些凭据。通常凭据将在 .config/gcloud/
中,并使用 docker run -v ~/.config/gcloud:~/.config/gcloud image
执行此操作。 Container OS 中是否以及在何处提供此类凭据并不明显,特别是因为缺少 gcloud
.
如果 VM 上的凭据失败并且无法安装,选项似乎包括:
- 将凭据放入容器元数据/环境变量中;
- 为服务帐户创建一个
.json
凭据文件,然后- 上传到虚拟机,然后挂载;或
- 将
.json
添加到容器中;
- 运行 一个 Docker 容器(例如 cloud-sdk-docker),它获取凭据并通过例如与主机共享它们共享挂载分区。理想情况下,这将与
gcloud auth activate-service-account
是否有规范或 best-practices 方法来为 Docker 容器提供 VM 项目的服务帐户凭据?
Google Cloud 已经有一个 security-policy 模型,所需的模型:项目中的 VM 应该具有服务帐户提供的访问权限。为避免复杂性和错误配置或事故的可能性,正确的解决方案应采用现有的安全模型,即不涉及创建、下载、分发和维护凭证文件。
感觉这将是一个常规问题,需要用 COS、Docker 和 Kubernetes 来解决,所以我想我错过了一些直截了当的东西——但是解决方案从文档中对我来说并不明显。
EDIT — 注意 set-service-account API — 这个问题可以简化为 "How do you use the set-service-account API with Container OS?" 如果不可能(因为 Container OS 缺少 gcloud
和 gsutil
),我认为应该注意这一点,以便 VM 用户可以相应地进行计划。
编辑 对于下一个人来说:
为了重现这个问题,我使用了:
[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 中为 VM 实例设置的范围,特别是 datastore
API 已为默认帐户禁用(在 [=52 标题下) =]Cloud API VM 的访问范围)。可以找到范围和必要的 datastore
行,如下所示:
> gcloud compute instances describe test-instance
...
serviceAccounts:
- email: *****-compute@developer.gserviceaccount.com
scopes:
- https://www.googleapis.com/auth/datastore
...
...
请注意,服务帐户本身具有访问数据存储的权限(因此通常可以使用服务密钥的 json 凭据密钥访问数据存储)。服务帐户权限受 VM 范围限制。
通常的验证方式是出现在 Google cloud SDK Docker readme 上的方式。
从 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
If you want gcloud (and other tools in the Cloud SDK) to use service account credentials to make requests, use this command to import these credentials from a file that contains a private authorization key, and activate them for use in gcloud. This command serves the same function as gcloud auth login but for using a service account rather than your Google user credentials.
另外,best practice是为不同的实例创建不同的服务账号,而不是获取默认服务账号的密钥并使用:
In general, Google recommends that each instance that needs to call a Google API should run as a service account with the minimum permissions necessary for that instance to do its job. In practice, this means you should configure service accounts for your instances with the following process:
1 - Create a new service account rather than using the Compute Engine default service account.
2 - Grant IAM roles to that service account for only the resources that it needs.
3 - Configure the instance to run as that service account.
4 - Grant the instance the https://www.googleapis.com/auth/cloud-platform scope.
5 - Avoid granting more access than necessary and regularly check your service account permissions to make sure they are up-to-date.
更新
我不确定 set-service-account 是否按照您的要求执行 need/want。使用它,您可以更改实例使用的服务帐户(尽管必须停止该实例,因此您不能使用它来更改正在更改的实例的服务帐户)。但是您可以正常将其用于其他实例,请参阅:
jordim@cos ~ $ docker run --rm -ti --volumes-from gcloud-config google/cloud-sdk:alpine gcloud compute instances set-service-account instance-1 --service-account xx-compute@developer.gserviceaccount.com
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].
我认为这个问题在今天还不完全有效。因此,我想分享我的 2 美分。
在容器优化的情况下 OS,如果 VM 是 运行 默认服务帐户,那么它会在 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 = *************-compute@developer.gserviceaccount.com
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
命令,前提是默认服务帐户具有权限并且VM已显式启用特定api。
但是,如果在创建 VM 期间选择了 运行 no service account
选项,则此用例有效。