Google 云服务帐户联合访问 AWS 服务

Google cloud service account federated access to AWS service

我正在研究混合 AWS/Google 云基础架构系统是否可行,我的要求之一是从一个系统到另一个系统的安全和简单身份验证。目前我需要从 Google 云 VM 实例连接到受限的 AWS S3 存储桶。

我的问题通常是:是否有办法做到这一点,最好的方法是什么。我相信每个人都希望有机会为他们的基础架构使用多个云提供商,这些云提供商具有高安全性和易用性和维护性。

经过一些研究,我发现唯一可行的方法是通过 Web 身份联合,它根本不是为此目的而设计的。然后在 Google 方面探索选项后,我发现服务帐户看起来可以用于执行 OAuth2 身份验证并提供令牌以通过具有 AssumeRoleWithWebIdentity 操作的 STS 客户端访问 AWS。

但是,STS 客户端仅接受 id_token,如果客户端从浏览器中运行的应用程序登录 Google,通常客户端会从服务器获取 id_token(Javascript , PHP, Python) 而我正尝试使用 Ruby SDK 从系统级别执行此操作。目前 Google::Auth 授权对象 return 是一个访问令牌,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!是 return 任何有意义的唯一方法。有一种方法应该 return 正是我需要的 - decoded_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)

我试图找到一种方法来使用服务帐户进行身份验证,就好像我正在执行正常的 Google 登录以获得 id_token 但没有任何成功。

我有几个其他选项来执行相同的任务,但不如使用该特定类型的联盟优雅:

我不介意使用任何技术以干净和安全的方式获得服务器到服务器(更像是服务器到服务,但同样适用于服务器)联合身份验证。

抱歉问题很长,提前致谢。

由于优先级转移,我们最终没有走那条路。我们选择的解决方案是,当我们想要这样做时,Hashicorp 的 Vault 进行中间人 API 密钥交换。它足够安全并且相对容易实施和集成。它还具有使您的 AWS 帐户能够通过 API.

与其他不受支持的事物进行交互的额外好处

我知道回复这个帖子有点晚了,因为它已经 3 岁了但是这个错误

The ID Token provided is not a valid JWT

我在问题上发现的是 firebase 身份验证 return 2 个令牌,即 accessToken 和 idToken,您需要改用“idToken”