MFA使用時のaws cli 認証方法について

概要

  • 今回は、MFA(多要素認証:Multi-Factor Authentication)を使用する環境において、aws cli を利用するための認証方法をご説明します。
  • AWSアカウントあるいはIAMユーザーのセキュリティを向上させるには、MFAを設定します。IAMユーザーに仮想MFA を有効にする方法は、以前記載したこちらの記事を参照ください。
  • MFAが設定された環境で、AWSコンソールにログインするときにはユーザー名、パスワードの他に、MFAコード(6桁の数字)が必要となりますが、aws cli を利用する時も同様にMFAコードを入力して認証する必要があります。
 

MFA使用時のaws cli 認証方法

MFAの認証をせずにaws cli を実行した場合

  • MFAの認証をせずにaws cli を実行すると、下記のエラーとなります。これは、MFAを使った一時的な認証情報を取得する必要があるためです。

niikawa@niikawa1:~$ aws route53 list-hosted-zones --output text
An error occurred (AccessDenied) when calling the ListHostedZones operation: User: arn:aws:iam::111111111111:user/username is not authorized to perform: route53:ListHostedZones with an explicit deny
 

MFAで一時認証をしてaws cli を実行する

  • MFAを使って、一時的セキュリティ認証情報を取得して、aws cli を実行します。
  • 先ず、aws configureあるいは下記の環境変数をセットして、aws cli を実行するための準備を行います。 (すでに設定済みの環境は省略)

niikawa@niikawa1:~$ export AWS_ACCESS_KEY_ID=AAAAAAAAAAAAAAAAAAAA
niikawa@niikawa1:~$ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
niikawa@niikawa1:~$ export AWS_DEFAULT_REGION=ap-northeast-1
 
  • 次にaws sts get-session-tokenコマンドを使用して、一時的セキュリティ認証情報を取得します。
    • –serial-numberにMFAで識別するためのid を入力します(仮想MFAの例:arn:aws:iam::111111111111:mfa/username)。
    • –token-codeに6桁のMFAコードを指定します(下記の例:123123)。

niikawa@niikawa1:~$ aws sts get-session-token --serial-number arn:aws:iam::111111111111:mfa/username --token-code 123123
   
  • 下記の様な一時的な認証情報と有効期限(デフォルトでは 12 時間)を含む出力を受け取ります。
  • aws sts get-session-tokenコマンドの–duration-seconds オプションを使用して、有効期限 (秒単位) を指定できます。ドキュメントによれば、IAMユーザーのセッションは、900秒(15分)から129,600秒(36時間)の範囲で指定でき、デフォルトは43,200秒(12時間)です。 AWSアカウント所有者のセッションは、最大3,600秒(1時間)に制限されます。

{
    "Credentials": {
        "AccessKeyId": "BBBBBBBBBBBBBBBBBBBB",
        "SecretAccessKey": "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
        "SessionToken": "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
        "Expiration": "2020-03-19T13:22:28Z"
    }
}
 
  • 下記コマンドを使用して、一時的な認証情報を環境変数にエクスポートします。

niikawa@niikawa1:~$ export AWS_ACCESS_KEY_ID=BBBBBBBBBBBBBBBBBBBB
niikawa@niikawa1:~$ export AWS_SECRET_ACCESS_KEY=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
niikawa@niikawa1:~$ export AWS_SESSION_TOKEN=zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
 

MFAで一時認証をしてaws cli を実行する(ワンライナー版)

  • ワンライナーで実行する場合は、下記コマンドとなります。

niikawa@niikawa1:~$ eval `aws sts get-session-token --serial-number arn:aws:iam::111111111111:mfa/username --token-code 123123 | awk ' $1 == "\"AccessKeyId\":" { gsub(/\"/,""); gsub(/,/,""); print "export AWS_ACCESS_KEY_ID="$2 } $1 == "\"SecretAccessKey\":" { gsub(/\"/,""); gsub(/,/,""); print "export AWS_SECRET_ACCESS_KEY="$2} $1 == "\"SessionToken\":" { gsub(/\"/,""); gsub(/,/,""); print "export AWS_SESSION_TOKEN="$2 } '`
   

参考資料