如何使用 AWS CLI 進行 AssumeRole 呼叫和存放臨時使用者憑證?

3 分的閱讀內容
0

我想要使用 AWS Command Line Interface (AWS CLI) 從 AssumeRoleWithSAML、AssumeRole 和 AssumeRoleWithWebIdentity 操作取得憑證。

解決方法

若要從 AssumeRoleWithSAMLAssumeRoleAssumeRoleWithWebIdentity取得憑證,請完成下列步驟以呼叫 API,並將輸出儲存至文字檔案。然後,使用輸出透過 AWS CLI 呼叫 API 命令。

重要:

AssumeRoleWithSAML

**注意:**您必須擁有來自識別提供者的有效 SAML 2.0 回應,以及信任 IdP 的 IAM 角色。

從開發人員工具取得 SAML 回應。

1.    請依照如何在瀏覽器中檢視 SAML 回應的指示進行疑難排解

2.    捲動至日誌,然後開啟 SAML 日誌檔案。

3.    複製整個 SAML 回應。

4.    將 SAML 回應貼到名為 samlresponse.log 的本機目錄中的檔案中。然後,執行 assume-role-with-saml 以呼叫 STS 權杖:

**注意:**這個範例使用 awk。Awk 與 Linux 型發行版兼容。

aws sts assume-role-with-saml --role-arn arn:aws:iam::ACCOUNTNUMBER:role/IAM_ROLE --principal-arn arn:aws:iam::ACCOUNTNUMBER:saml-provider/SAML_PROVIDER --saml-assertion file://samlresponse.log

awk -F:  '
                BEGIN { RS = "[,{}]" ; print "[PROFILENAME]"}
                /:/{ gsub(/"/, "", $2) }
                /AccessKeyId/{ print "aws_access_key_id = " $2 }
                /SecretAccessKey/{ print "aws_secret_access_key = " $2 }
                /SessionToken/{ print "aws_session_token = " $2 }
' >> ~/.aws/credentials

這會將設定檔的憑證保存在 ~/.aws/credentials 檔案中。

5.    (選做) 若要備份憑證,請執行以下命令:

cp -a ~/.aws/credentials ~/.aws/credentials.bak.

**提示:**請確定您在 ~/.aws/config 中具備與輸出和區域設定的配對設定檔,這樣就不會重複提示您輸入該設定檔。

6.    使用 --profile 參數呼叫使用者憑證:

aws ec2 describe-instances --profile PROFILENAME

未傳送至檔案的範例 assume-role-with-saml 輸出:

{            
    "SubjectType": "persistent",
    "AssumedRoleUser": {
       "AssumedRoleId": "ROLE_ID_NUMBER:example@corp.example.com",
       "Arn": "arn:aws:sts::ACCOUNTNUMBER:assumed-role/ROLE_ID/example@corp.example.com"
    },    
    "Audience": "https://signin.aws.amazon.com/saml",
    "NameQualifier": "RANDOM_GENERATED_STRING",
    "Credentials": {
       "SecretAccessKey": "SECRET_ACCESS_KEY",
       "SessionToken": "TOKEN_KEY",
       "Expiration": "2015-05-11T20:00:49Z",
       "AccessKeyId": "ACCESS_KEY_ID"
},
"Subject": "CORP\\\\EXAMPLE",
"Issuer": "http://SERVER_NAME.corp.example.com/adfs/services/trust"
}

傳送至憑證檔案的範例 assume-role-with-saml 輸出:

aws_access_key_id =  ACCESS_KEY_ID
aws_session_token =  SESSION_TOKEN
aws_secret_access_key =  SECRET_ACCESS_KEY
[PROFILENAME]

AssumeRole

**注意:**您的 IAM 憑證必須信任您承擔的 IAM 角色。

1.    執行 AWS 命令 get-caller-identity 以驗證回應:

aws sts get-caller-identity

**注意:**如果您沒有收到回應,請檢查是否在 .aws/credentials 檔案中存儲有有效的 IAM 存取或秘密金鑰。

2.    執行 assume-role 命令:

aws sts assume-role --role-arn arn:aws:iam::123456789012:role/ExampleRole --role-session-name ExampleSession

您會收到類似下列內容的回應:

{
    "AssumedRoleUser": {
        "AssumedRoleId": "AROAZRG5BQ2L7OB87N3RE:ExampleSession",
        "Arn": "arn:aws:sts::123456789012:assumed-role/RoleA/ExampleSession"
    },
    "Credentials": {
        "SecretAccessKey": "JCNFKY7XCUwHWTKcQhmmFokpjLetCmNLZ7pg9SJe",
        "SessionToken": "FwoGZXIvYXdzEL7//////////wEaDNoBLBJUNYWKaHXZXCKvARBGJ4CqOs+p2JR2a7Euni0d0XuSs31ZA/1QqpX6Spfuz2WAvHCyqwbE3+oxyvyqYlO8dTJwp56YCFCJ6K4Prt9pMeZU9R5NGBJHvRbXXKfxp+jktLc/ItrAfn4GMXWpoyJKZrY7hzv3MASomlIcwSD/RqWIBS1vAoo1UAxwjy29jai0OAPQ51LAnuFKeabgmllyP5Y2gu488P19D7ikfgQtmBtH5I/Q8+5IEn4qMwYo1bq/8wUyLe1b3+mQwhq+zEz4TSyHD8HBXd9W3KYcB53MIotwiJNS+m0P5ZlZnpcJm3JwtA==",
        "Expiration": "2020-03-16T21:11:01Z",
        "AccessKeyId": "ASIAZRG8BQ4K2EBXGR42”
    }
}

3.    將 AccessKeyId、SecretAccessKey 及 SessionToken 匯至環境變量中:

export AWS_ACCESS_KEY_ID=ASIAZRG8BQ4K2EBXGR42
export AWS_SECRET_ACCESS_KEY=JCNFKY7XCUwHWTKcQhmmFokpjLetCmNLZ7pg9SJe
export AWS_SESSION_TOKEN=FwoGZXIvYXdzEL7//////////wEaDNoBLBJUNYWKaHXZXCKvARBGJ4CqOs+p2JR2a7Euni0d0XuSs31ZA/1QqpX6Spfuz2WAvHCyqwbE3+oxyvyqYlO8dTJwp56YCFCJ6K4Prt9pMeZU9R5NGBJHvRbXXKfxp+jktLc/ItrAfn4GMXWpoyJKZrY7hzv3MASomlIcwSD/RqWIBS1vAoo1UAxwjy29jai0OAPQ51LAnuFKeabgmllyP5Y2gu488P19D7ikfgQtmBtH5I/Q8+5IEn4qMwYo1bq/8wUyLe1b3+mQwhq+zEz4TSyHD8HBXd9W3KYcB53MIotwiJNS+m0P5ZlZnpcJm3JwtA==

4.    驗證身份:

aws sts get-caller-identity

輸出會顯示來自 assume-role 呼叫的身分憑證。

AssumeRoleWithWebIdentity

**注意:**您必須擁有有效的 OAuth 2.0 存取權杖、OpenID 連線權杖以及信任 IdP 的 IAM 角色。

1.    執行類似下列命令的 assume-role 命令:

aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789012:role/FederatedWebIdentityRole --role-session-name ExampleSession --web-identity-token
Atza%7CIQEBLjAsAhRFiXuWpUXuRvQ9PZL3GMFcYevydwIUFAHZwXZXXXXXXXXJnrulxKDHwy87oGKPznh0D6bEQZTSCzyoCtL_8S07pLpr0zMbn6w1lfVZKNTBdDansFBmtGnIsIapjI6xKR02Yc_2bQ8LZbUXSGm6Ry6_BG7PrtLZtj_dfCTj92xNGed-CrKqjG7nPBjNIL016GGvuS5gSvPRUxWES3VYfm1wl7WTI7jn-Pcb6M-buCgHhFOzTQxod27L9CqnOLio7N3gZAGpsp6n1-AJBOCJckcyXe2c6uD0srOJeZlKUm2eTDVMf8IehDVI0r1QOnTV6KzzAI3OY87Vd_cVMQ

回應範例:

{
    "SubjectFromWebIdentityToken": "amzn1.account.AF6RHO7KZU5XRVQJGXK6HB56KR2A"
    "Audience": "client.5498841531868486423.1548@apps.example.com",
    "AssumedRoleUser": {
        "Arn": "arn:aws:sts::123456789012:assumed-role/FederatedWebIdentityRole/ExampleSession",
        "AssumedRoleId": "AROACLKWSDQRAOEXAMPLE:ExampleSession"
    }
    "Credentials": {
        "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY",
        "SessionToken": "AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE",
        "Expiration": "2020-05-19T18:06:10+00:00"
    },
    "Provider": "www.amazon.com"

2.    保存 AccessKeyId、SecretAccessKey 及 SessionToken 於 .aws/credentials 檔案中:

[ExampleRoleProfile]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY
aws_session_token=AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE

3.    執行 get-caller-identity 命令:

aws sts get-caller-identity --profile ExampleRoleProfile

輸出會顯示來自 assume-role 呼叫的身分憑證,如下所示:

{
"UserId": "AROACLKWSDQRAOEXAMPLE:ExampleSession",
"Account": "123456789012",
"Arn": "arn:aws:sts::123456789012:assumed-role/FederatedWebIdentityRole/ExampleSession"
}

相關資訊

如何使用 AD FS 授予活動目錄使用者存取 API 或 AWS CLI 的權限?

使用適用於 PowerShell 的 AWS 工具設定聯合身分