【发布时间】: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