我正在研究是否可以使用混合AWS/Google雲基礎架構系統,並且我擁有的一項要求是從一個系統到另一個系統的安全且簡單的身份驗證。目前,我需要從Google Cloud VM實例連接到受限制的AWS S3存儲桶。Google雲服務帳戶對AWS服務的聯合訪問
我的問題通常是:有沒有辦法做到這一點,什麼是最好的辦法。我相信每個人都希望有機會使用多個雲提供商爲其基礎架構提供高安全性和易用性和維護。
經過一番研究,我發現看起來可能的唯一方法是通過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!是返回任何有意義的唯一方法。有一種方法應該返回我所需要的 - decode_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)
我試圖找到一種方法與服務帳戶進行身份驗證,就好像我執行正常的谷歌登錄爲了獲得id_token但沒有任何成功。
我有其他幾個選項來執行比使用特定類型的聯盟的那麼優雅相同的任務:
- 創建爲目的的IAM賬戶和分發安全 憑證與安全系統,如Hashicorp的保險庫。
- 在AWS內部使用中介「跳轉」實例,該實例可訪問必要的資源,並可從Google Cloud中特定靜態 虛擬機的外部IP中獲得ssh。
- 使用一個可生成externalIds的簡單系統來創建自己的訪問令牌並使用該類型的聯合。
我不介意使用任何技術以乾淨和安全的方式獲取服務器到服務器(更像服務器到服務,但同樣適用於服務器)聯合身份驗證。
對不起,有很長的問題和預先感謝。
您錯過了一個步驟嗎?也許您需要使用該令牌來進行API調用以請求JWT ID令牌,然後將該JWT傳遞給STS AssumeRoleWithWebIdentity。此外,假定的角色需要專門爲身份提供商訪問而創建(IdP必須在假定的IAM角色的信任策略中指定)。 – jarmod
@jarmod感謝您的回覆。根據Web聯合身份驗證文檔的設置,我設置了AWS IAM端,但它在觸發該代碼之前會引發錯誤。我的確切問題是,我試圖使用Google服務帳戶進行身份驗證的方式,對JWT ID的請求爲空。我試着調用authorization.decoded_id_token,但它是空的。我只注意到通過調用get_application_default,我實際上得到了一個GCE授權,這可能不是我想要的。 –