跳至內容

我該如何使用 AWS CLI 進行 AssumeRole 呼叫並儲存臨時使用者憑證?

3 分的閱讀內容
0

我想使用 AWS Command Line Interface (AWS CLI) 來取得來自 AssumeRoleWithSAML、AssumeRole 以及 AssumeRoleWithWebIdentity 的憑證。

解決方法

**注意:**如果您在執行 AWS CLI 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

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

**注意:**AssumeRoleWithSAMLAssumeRoleAssumeRoleWithWebIdentity 命令需要參數 role-arnrole-session-name

使用 SAML 驗證取得憑證

**需求:**您必須擁有來自身分提供者 (IdP) 的有效 SAML 2.0 回應,以及一個信任該 IdP 的 AWS Identity and Access Management (IAM) 角色。

請完成下列步驟:

  1. 取得 SAML 回應

  2. 找到日誌,然後打開 SAML 日誌檔案。

  3. 複製整個 SAML 回應。

  4. 將 SAML 回應貼到位於本機目錄中名為 samlresponse.log 的檔案中。

  5. 執行以下 assume-role-with-saml 命令以呼叫 AWS Security Token Service (AWS STS) 權杖:

    aws sts assume-role-with-saml --role-arn arn:aws:iam::444455556666:role/IAM_ROLE --principal-arn arn:aws:iam::444455556666: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
    

    **注意:**將 Principal ARN 替換為您的 SAML 提供者 Amazon Resource Name (ARN)。此範例使用 awk,與 Linux 型發行版相容。當您執行 assume-role-with-saml 命令時,這會將憑證儲存在 ~/.aws/credentials 檔案內的設定檔中。

  6. (選用) 執行以下命令以備份憑證:

    cp -a ~/.aws/credentials ~/.aws/credentials.bak.
  7. 執行以下 describe-instances 命令以呼叫使用者憑證:

    aws ec2 describe-instances --profile PROFILENAME

    **注意:**將 PROFILENAME 替換為您的設定檔名稱。
    未儲存至檔案的輸出範例:

    {            
        "SubjectType": "persistent",
        "AssumedRoleUser": {
           "AssumedRoleId": "111122223333:example@corp.example.com",
           "Arn": "arn:aws:sts::44445555666: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"
    }
    

    已儲存到憑證檔案的輸出範例:

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

使用 AssumeRole 取得憑證

**重要:**您的 IAM 憑證必須信任您所擔任的 IAM 角色。

請完成下列步驟:

  1. 執行以下 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. 從回應中,匯出 AccessKeyIdSecretAccessKeySessionToken 以建立 環境變數

    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. 執行以下 get-caller-identity 以驗證身分:

    aws sts get-caller-identity

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

使用 AssumeRoleWithWebIdentity 取得憑證

**需求:**您必須擁有有效的 OAuth 2.0 存取權杖、OpenID Connect 權杖,以及一個信任 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. AccessKeyIdSecretAccessKeySessionToken 儲存在 .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"
    }
    

相關資訊

如何授予我的 Active Directory 使用者透過 AD FS 存取 API 或 AWS CLI?

使用 AWS Tools for PowerShell 設定聯合身分

AWS CLI 中的組態與憑證檔案設定