【问题标题】:Google cloud service account federated access to AWS service谷歌云服务账户联合访问 AWS 服务
【发布时间】:2016-07-19 20:19:21
【问题描述】:

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

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

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

但是,STS 客户端仅接受 id_token,如果客户端从在其浏览器中运行的应用程序(Javascript、PHP、Python)登录到 Google,通常客户端将从服务器获取,而我正在尝试从系统级别的 Ruby SDK。目前,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!是唯一返回任何有意义的方法。有一种方法应该可以准确地返回我需要的东西 - 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 但没有任何成功。

我有几个其他选项可以执行相同的任务,但不如使用特定类型的联合:

  • 为此目的创建一个 IAM 帐户并分发安全性 使用 Hashicorp 的 Vault 等安全系统提供凭据。
  • 在 AWS 中使用调解器“跳转”实例,该实例可以访问 必要的资源,并且可以从特定的静态 ssh'd Google Cloud 中虚拟机的外部 IP。
  • 使用会生成 externalIds 的简单系统来创建 自己访问令牌并使用这种类型的联合。

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

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

【问题讨论】:

  • 您是否缺少步骤?也许您需要使用手头的令牌进行 API 调用以请求 JWT ID 令牌,然后将该 JWT 传递给 STS AssumeRoleWithWebIdentity。此外,需要专门为身份提供商访问创建假定角色(必须在假定的 IAM 角色的信任策略中指定 IdP)。
  • @jarmod 感谢您的回复。我根据 Web Identity Federation 的文档设置了 AWS IAM 端,但在点击该代码之前它会引发错误。我遇到的确切问题是我尝试使用 Google 服务帐户进行身份验证的方式对 JWT ID 的请求为空。我尝试调用 authorization.decoded_id_token 但它为空。我刚刚注意到通过调用 get_application_default 我实际上获得了 GCE 授权,这可能不是我想要的。

标签: amazon-web-services amazon-s3 google-cloud-platform google-authentication federation


【解决方案1】:

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

提供的 ID Token 不是有效的 JWT

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

【讨论】:

【解决方案2】:

由于优先级转移,我们最终没有走那条路。当我们想做的时候,我们选择的解决方案是 Hashicorp 的 Vault 来进行中间人 API 密钥交换。它足够安全,并且相对容易实现和集成。它还有一个额外的好处是让您的 AWS 账户能够通过 API 与其他不受支持的事物进行交互。

【讨论】:

    猜你喜欢
    • 2021-02-23
    • 1970-01-01
    • 2020-03-29
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2019-05-15
    • 1970-01-01
    相关资源
    最近更新 更多