在Google Cloud Compute上使用Container Optimized OS(COS),从Docker容器中访问VM项目的default service account凭据的最佳方法是什么?
$ 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
执行此操作 . 容器操作系统中是否有这样的凭证,特别是因为缺少 gcloud
,这一点并不明显 .
如果VM上的凭据失败并且可安装,则选项似乎包括:
-
将凭据放在容器元数据/环境变量中;
-
然后为服务帐户创建
.json
凭证文件 -
将其上传到VM,然后挂载;要么
-
将
.json
添加到容器中; -
运行获取凭证的Docker容器(例如cloud-sdk-docker)并通过例如主机与主机共享 . 共享安装分区 . 理想情况下这将与
gcloud auth activate-service-account
是否有规范或最佳实践方法为Docker容器提供VM项目的服务帐户凭据?
Google Cloud已经拥有了一个安全策略模型,即所需的模型:项目中的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用户可以相应地进行规划 .
EDIT 对于接下来的人来说:
为了复制这个问题,我使用了:
[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]
问题确实是在VM实例的API中设置的范围,特别是为默认帐户禁用了 datastore
API(在VM的 Headers Cloud API access scopes 下) . 可以找到范围和必要的 datastore
行如下:
> gcloud compute instances describe test-instance
...
serviceAccounts:
- email: *****-compute@developer.gserviceaccount.com
scopes:
- https://www.googleapis.com/auth/datastore
...
...
请注意,服务帐户本身具有数据存储区的权限(因此,通常可以使用服务密钥的json凭据密钥访问数据存储区) . 服务帐户权限受VM范围的限制 .
1 回答
通常的身份验证方式是Google cloud SDK Docker readme上出现的方式 .
从COS实例中运行一次:
这会将您的凭据存储在
gcloud-config
容器卷中 .这个卷应该只安装你想要访问你的凭据的容器,这可能赢了't be anything that' s而不是
cloud-sdk
服务帐户通常意味着使用他们必须从某个地方获取的凭据集,密钥文件,环境变量或令牌:
gcloud auth activate-service-account
此外,best practice是为不同的实例创建不同的服务帐户,而不是获取默认服务帐户的密钥并使用它:
UPDATE
我不确定set-service-account能做你需要/想做的事情 . 有了它,您可以更改实例使用的服务帐户(但必须停止实例,因此您不能使用它来更改服务帐户,而不会更改实例) . 但是,您可以将其正常用于其他实例,请参阅: