Amazon web services 模拟类似于“的行为”;sts承担角色”;用于在本地环境中设置全局身份验证的GCP

Amazon web services 模拟类似于“的行为”;sts承担角色”;用于在本地环境中设置全局身份验证的GCP,amazon-web-services,google-cloud-platform,amazon-iam,google-cloud-iam,Amazon Web Services,Google Cloud Platform,Amazon Iam,Google Cloud Iam,我相信我已经走到了死胡同,但我想从专家那里得到一些验证 本周我开始学习GCP,我正在努力实现我以前通过AWS云平台能够实现的目标。请告诉我,因为我对GCP一无所知 问题: 在本地计算机上,配置动态获取的短期凭据,以便使用公共云API进行身份验证(静态密钥是不可能的) 当经过身份验证的人工用户(GCP:IAM用户,AWS:IAM用户)模拟非人工身份(GCP:IAM服务帐户,AWS:IAM角色)时 公共云平台提供的客户端SDK在调用公共云平台API时使用这些凭据作为默认(模拟的非人类)身份 让我们说

我相信我已经走到了死胡同,但我想从专家那里得到一些验证

本周我开始学习GCP,我正在努力实现我以前通过AWS云平台能够实现的目标。请告诉我,因为我对GCP一无所知

问题:

在本地计算机上,配置动态获取的短期凭据,以便使用公共云API进行身份验证(静态密钥是不可能的)

当经过身份验证的人工用户(GCP:IAM用户,AWS:IAM用户)模拟非人工身份(GCP:IAM服务帐户,AWS:IAM角色)时

公共云平台提供的客户端SDK在调用公共云平台API时使用这些凭据作为默认(模拟的非人类)身份

让我们说,在我的本地机器上: 我有一个经过身份验证的用户A,他需要代表ServiceAccount/Role B调用公共云API

平台:

AWS-已解决

GCP-未解决

AWS解决方案

在AWS中,问题陈述将是: 从我的本地机器(在那里我被认证为User-A),我希望我的本地AWS客户端SDK以IAM-ROLE-B的形式调用AWS API

解决方案如下:

1-通过用户A上的IAM角色策略,授权用户A在IAM-ROLE-B上执行sts:AssumeRole

2-通过用户B上的IAM假定角色策略,授权用户A在IAM-ROLE-B上执行sts:AssumeRole

3-例如,使用aws cli对awsSTSAPI进行假定角色操作调用。这将返回我:a。访问密钥ID和b。秘密访问密钥

4-在~/.aws/.creds文件中设置这些,所有SDK默认为这些creds

GCP中的屏障

当我尝试模拟GCP的相同行为时,就会出现问题。

在我的本地机器上,我作为用户A进行了身份验证,我希望我的本地GCP客户端SDK作为服务帐户B调用GCP API

因为我需要动态的短期信任,所以我不能使用静态的、太不安全的服务帐户密钥文件,我们知道不使用它的理由

我知道的唯一其他选择是通过“模拟”服务帐户(代表service-account-B拨打电话)。根据我的AWS类比,我在步骤3中收到了访问密钥ID和访问密钥机密, 我可以全局设置(供客户端SDK使用)。

在GCP的情况下,projects.serviceCounts.generateAccessToken调用给我一个AccessToken,它基本上是代表SERVICE-ACCOUNT-B进行调用的短期身份验证。

尽管我可以将此访问令牌注入到我打算在将来调用GCP的请求中,但是否有任何方法可以将此全局设置为由GCP客户端SDK自动拾取,这样我就不必修改代码库并以某种方式将此令牌注入到我的代码中?

回想一下我是一个GCP新手的事实,我的想法是否正确?还是我完全搞砸了GCP auth的概念,在解决问题的方法上走错了方向


非常感谢您提供任何解决问题的输入和想法(无静态键)。

不,您在GCP中使用
gcloud
、API请求或客户端库时所寻求的方法与AWS中的方法不同。正如你已经提到的,最好的方法是

你应该考虑到,每当你模拟一个服务帐户时,你应该明确地做它,因为你不能像AWS那样存储证书,例如:

gcloud计算实例创建示例\u vm--zone=us-central1-a\
--机器类型=n1-standard-1--image=centos-8-v20200811\
--图像系列centos-8——图像项目=centos云\
--模拟服务帐户=impersonated@project_id.iam.gserviceaccount.com
或者在使用客户端库时:

从google.cloud导入存储
从google.auth导入模拟的\u凭据
导入google.auth
目标范围=['https://www.googleapis.com/auth/devstorage.read_only' ]
my_凭据,project=google.auth.default()
模拟的\u凭据=模拟的\u凭据。凭据(
source\u凭证=我的\u凭证,
目标(单位)impersonate@project.iam.gserviceaccount.com',
目标范围=目标范围,
寿命=60)
客户端=存储。客户端(凭据=模拟的\u凭据)
blobs=client.list\u blobs('bucket\u name')
对于blob中的blob:
打印(blob.name)

最后,在执行API请求时,您应该始终包括令牌,这就是您现在正在执行的操作。

谢谢您的回复,先生!我害怕发现这一点。会很酷的。谢谢你:)