前言
雖然平常都使用標準帳號來登入 AWS 的管理主控台 (Web Console),但如果我們只有 API Key 的時候,是不是也能用來登入 Web Console 呢 ?
答案是: 可以
我們只需要透過 聯合存取/登入 ( Federated Access/Login ) 機制,就可以拿 AWS API Key 來登入 AWS 的管理主控台 (Web Console)。
整體流程
流程摘要
透過聯合存取/登入機制產生登入連結的大致上流程如下:
- 向 AWS STS 請求 Federation Token
- 向 AWS Signin Federation 送出請求,取得 Signin Token
- 產生登入網址
- 登入 Web Console
流程說明
向 AWS STS 請求 Federation Token
我們先使用 AWS API Key 向 AWS STS (AWS Security Token Service),請求一個 Federation Token。
# aws sts get-federation-token --name "Rilakkuma" --policy '{"Version": "2012-10-17", "Statement": [{"Effect": "Allow", "Action": "*", "Resource": "*"}]}'
參數的 name 可以隨意填寫,不需要真的存在。
Policy 的部分我們直接給 All ,來避免拿不到任何權限,但這也不代表我們可以拿到 Root ,AWS 會進行權限交集運算,計算最終可以拿到的權限。
![](https://polyfiles.blog.keniver.com//2023/01/aws_permissions_boundary.png)
來源: AWS Policies Evaluation Logic
從回應中我們可以得到 STS Token 三件組 AccessKeyId
, SecretAccessKey
, SessionToken
![](https://polyfiles.blog.keniver.com//2023/01/aws_federa_token.png)
向 AWS Signin Federation API 送出請求,取得 Signin Token
在拿到 STS Token 三件組後,我們就可以向 AWS Signin Federation API (https://signin.aws.amazon.com/federation) 提出請求
請求結構如下
{
"Action": "getSigninToken",
"Session": {
"sessionId": AccessKeyId,
"sessionKey": SecretAccessKey,
"sessionToken": SessionToken
}
}
使用 HTTP Get 方式送出請求
curl "https://signin.aws.amazon.com/federation?Action=getSigninToken&Session=%7B%22sessionId%22:%22[AccessKeyId]%22,%22sessionKey%22:%22[SecretAccessKey]%22,%22sessionToken%22:%22[SessionToken]%22%7D"
記得要 URL Encode
從回應中取得 SigninToken
![](https://polyfiles.blog.keniver.com//2023/01/aws_federation_signin_token.png)
產生登入網址
取得 SigninToken 後,我們就可以產生登入網址
請求結構如下
{
"Action": "login",
"Issuer": "Keniver",
"Destination": "https://console.aws.amazon.com/console/home",
"SigninToken": SigninToken
}
將請求結構進行 URL Encode 後直接做為參數傳入 https://signin.aws.amazon.com/federation
https://signin.aws.amazon.com/federation?Action=login&Issuer=Keniver&Destination=https%3A%2F%2Fconsole%2Eaws%2Eamazon%2Ecom%2Fconsole%2Fhome&SigninToken=[SigninToken]
登入 Web Console
最後,我們訪問上面做出來的網址,就可以成功登入 AWS 的管理主控台 (Web Console)
![](https://polyfiles.blog.keniver.com//2023/01/aws_federation_signin_successful.png)
Python Code
偵測
這類型的登入行為,透過 AWS CloudTrail 是很容易可以發現的。
我們可以從 ConsoleLogin 事件下手
![](https://polyfiles.blog.keniver.com//2023/01/aws_coludtrail_consolelogin_event.png)
在事件的細節中,可以觀察到聯合登入的使用者名稱(可能是假的),以及這個 Token 簽出的使用者
![](https://polyfiles.blog.keniver.com//2023/01/aws_cloudtrail_consolelogin_event_detail.png)
或者可以考慮用更前期的事件 GetFederationToken 去做偵測
![](https://polyfiles.blog.keniver.com//2023/01/aws_cloudtrail_-get_federation_token_event.png)
後記
雖然有 API Key 就可以直接操作 API ,但對於雲端不太熟悉的同仁來說,直接用 Web GUI 會比較輕鬆。
請各位好好保護 AWS API Key,非自動化的帳號不要沒事產生 API Key。