我正在研究是否可以使用混合AWS/Google云基础架构系统,并且我拥有的一项要求是从一个系统到另一个系统的安全且简单的身份验证。目前,我需要从Google Cloud VM实例连接到受限制的AWS S3存储桶。Google云服务帐户对AWS服务的联合访问
我的问题通常是:有没有办法做到这一点,什么是最好的办法。我相信每个人都希望有机会使用多个云提供商为其基础架构提供高安全性和易用性和维护。
经过一番研究,我发现看起来可能的唯一方法是通过Web Identity Federation,它不是专为此目的而设计的。然后,在从Google方面探索选项后,我发现服务帐户看起来好像可以用来进行OAuth2身份验证,并通过带有AssumeRoleWithWebIdentity操作的STS客户端访问AWS提供令牌。
但是,STS客户端只接受id_token,如果他们通过在浏览器中运行的应用程序(Javascript,PHP,Python)登录到Google,通常客户端将从服务器获取id_token,而我试图从系统级别与Ruby SDKs。目前Google :: Auth授权对象返回Aws :: STS :: Client不接受的访问令牌。我试图做这样的事情:
require 'aws-sdk'
require 'googleauth'
scopes = ['https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/compute']
authorization = Google::Auth.get_application_default(scopes)
token = authorization.fetch_access_token!['access_token']
bucket_name = 'xxx'
arn_role = 'arn:aws:iam::xxx:role/xxx'
session_name = 'GoogleApps'
client = Aws::STS::Client.new(region: 'us_east-1')
resp = client.assume_role_with_web_identity({
role_arn: arn_role,
role_session_name: session_name,
web_identity_token: token
})
正如提到的fetch_access_token!是返回任何有意义的唯一方法。有一种方法应该返回我所需要的 - decode_id_token;然而,在那种情况下它是空的。运行上述结果的代码(如预期)以下错误:
The ID Token provided is not a valid JWT. (You may see this error if you sent an Access Token) (Aws::STS::Errors::InvalidIdentityToken)
我试图找到一种方法与服务帐户进行身份验证,就好像我执行正常的谷歌登录为了获得id_token但没有任何成功。
我有其他几个选项来执行比使用特定类型的联盟的那么优雅相同的任务:
- 创建为目的的IAM账户和分发安全 凭证与安全系统,如Hashicorp的保险库。
- 在AWS内部使用中介“跳转”实例,该实例可访问必要的资源,并可从Google Cloud中特定静态 虚拟机的外部IP中获得ssh。
- 使用一个可生成externalIds的简单系统来创建自己的访问令牌并使用该类型的联合。
我不介意使用任何技术以干净和安全的方式获取服务器到服务器(更像服务器到服务,但同样适用于服务器)联合身份验证。
对不起,有很长的问题和预先感谢。
您错过了一个步骤吗?也许您需要使用该令牌来进行API调用以请求JWT ID令牌,然后将该JWT传递给STS AssumeRoleWithWebIdentity。此外,假定的角色需要专门为身份提供商访问而创建(IdP必须在假定的IAM角色的信任策略中指定)。 – jarmod
@jarmod感谢您的回复。根据Web联合身份验证文档的设置,我设置了AWS IAM端,但它在触发该代码之前会引发错误。我的确切问题是,我试图使用Google服务帐户进行身份验证的方式,对JWT ID的请求为空。我试着调用authorization.decoded_id_token,但它是空的。我只注意到通过调用get_application_default,我实际上得到了一个GCE授权,这可能不是我想要的。 –