我正在研究是否可以使用混合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但没有任何成功。
我有几个其他选项可以执行相同的任务,这些选项不如使用特定类型的联合优雅:
我不介意使用任何技术来获得服务器到服务器(更像服务器到服务,但同样适用于服务器)联合身份验证以清洁和安全的方式。
对不起,提出长期问题并提前致谢。
答案 0 :(得分:1)
我知道回复这个线程已经很晚了,因为它已经3年了,但是这个错误
提供的ID令牌不是有效的JWT
我在问题上发现的是Firebase身份验证返回2个令牌,即accessToken和idToken,您需要改用“ idToken”
答案 1 :(得分:0)
由于优先顺序的转变,我们最终没有走这条路。我们选择的解决方案,就是我们想要的时候,是Hashicorp的Vault来进行中间人API密钥交换。它足够安全,并且相对容易实现和集成。它还有一个额外的好处,即让您的AWS账户能够通过API与其他不受支持的东西进行交互。