Google云服务帐户对AWS服务的联合访问权限

时间:2016-03-31 11:40:38

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

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

我的问题一般是:有没有办法做到这一点,最好的办法是什么。我相信每个人都希望有机会在其基础架构中使用多个云提供商,具有高安全性,易于使用和维护。

经过一番研究后,我发现唯一可行的方法是通过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!是唯一返回任何有意义的方法。有一种方法可以准确地返回我需要的方法 - decoding_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's Vault这样的安全系统的凭证。
  • 在AWS内部使用中介“跳转”实例,该实例可以访问 必要的资源,可以从特定的静态ssh'd Google Cloud中虚拟机的外部IP。
  • 使用一个简单的系统来生成externalIds来创建 自己访问令牌并使用该类型的联合。

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

对不起,提出长期问题并提前致谢。

2 个答案:

答案 0 :(得分:1)

我知道回复这个线程已经很晚了,因为它已经3年了,但是这个错误

提供的ID令牌不是有效的JWT

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

答案 1 :(得分:0)

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