AWS CLI を使用して SAML 認証情報の呼び出しと保存をする方法を教えてください。

最終更新日: 2019 年 1 月 25 日

SAML 2.0 のフェデレーションとコマンドを AWS コマンドラインインターフェイス (AWS CLI) から実行し、テストと API 呼び出しの検証を行いたいと考えています。どうしたらよいですか?

簡単な説明

作業を開始する前に、以下を使用していることを確認します。

  • インスタンスにインストール済み、またはローカルシステムにインストール済みの AWS CLI。
  • SAML フェデレーションサーバー。
  • ロールの Amazon リソースネーム (ARN)、ID プロバイダー (IdP) ARN、SAML レスポンス。

解決方法

以下の手順に従って、API 呼び出しを行い、出力をテキストファイルに保存し、それを使用して AWS CLI で API コマンドを呼び出します。

注意: IdP からの SAML レスポンスが必要です。この例では、レスポンスを取得するための API 呼び出しが設定されていない AD FS 2.0 を使用します。

開発者ツールから SAML レスポンスを取得します。

1.    「トラブルシューティングのためにブラウザで SAML レスポンスを表示する方法」の手順を実行します。

2.    ログの表示覧までスクロールし、SAML ログファイルを開きます。

3.    SAML レスポンス全体をコピーします。

インスタンスから AWS CLI を使用してこのコマンドを実行し、認証情報を保存します。

1.    このコマンドの最後に SAML レスポンスを貼り付けて実行し、STS トークンを呼び出します。

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 BASE64_ENCODED_RESPONSE | \\

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 ファイル内のプロファイルに保存されます。バックアップを作成するには、次のコマンドを使用します。

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

注意: ~/.aws/config に、適切な出力とリージョンが設定されたプロファイルが存在していることを確認してください。正しく設定されている場合は、入力が繰り返し求められることはありません。

保存された認証情報を使用して、テスト用の AWS CLI コマンドを実行します。

ここまでで認証情報の保存が完了したので、AWS CLI 呼び出しに -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]