【AWS】AWS CLIでMFAを行う

AWS CLIでMFAを行う

コンソールから仮想MFAデバイスの登録を行っておきます。このときに割当てたMFAデバイスのARNはAWS CLIからMFAを行う際に使用します。

また、アクセスキーの発行とaws configure コマンドによる設定を行い、使用するユーザのクレデンシャル情報を登録します。

AWS 仮想MFAデバイスのARN

「test-user」という名前でaws cliのプロファイルを作成していたとすると以下のようにして一時的な認証情報を取得することができます。

$ aws sts get-session-token --serial-number arn:aws:iam::{登録したMFAデバイスのARN} --token-code {MFAで発行したコード} --profile test-user

成功すると以下のような形式で一時的な認証情報が取得できます。

{
    "Credentials": {
        "AccessKeyId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxx",
        "SessionToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "Expiration": "2021-01-01T00:00:00+00:00"
    }
}

これらの情報を環境変数に保存するか、名前付きプロファイルとして/.aws/credentialsに書き込むことで認証情報を使用することができます。

[tes-user-mfa]
aws_access_key_id = 上記のAccessKeyId
aws_secret_access_key = 上記のSecretAccessKey
aws_session_token = 上記のSessionToken

参考情報

aws-mfaを使う

AWS CLI経由でMFAを行う場合、上記のように発行した一時認証情報を使うためにcredentialsを編集したりと面倒です。この手間を解消してくれるツールにaws-mfaがあります。

aws-mfanのインストール

pipを使ってインストールします。

$ pip install aws-mfa

# インストールできたか確認
$aws-mfa -h
usage: aws-mfa [-h] [--device arn:aws:iam::123456788990:mfa/dudeman] [--duration DURATION] [--profile PROFILE] [--long-term-suffix LONG_TERM_SUFFIX] [--short-term-suffix SHORT_TERM_SUFFIX]
               [--assume-role arn:aws:iam::123456788990:role/RoleName] [--role-session-name ROLE_SESSION_NAME] [--force] [--log-level {CRITICAL,ERROR,WARNING,INFO,DEBUG,NOTSET}] [--setup]

optional arguments:
  -h, --help            show this help message and exit
  --device arn:aws:iam::123456788990:mfa/dudeman
...

aws-mfaで使用するプロファイルの設定

AWS CLIで使用するユーザを作成し、仮想MFAデバイスの設定、アクセスキーの発行を行います。

まず、aws cli configure –プロファイル名 でaws-mfaで使用するプロファイルの設定を行います。ここでの注意点は、aws cli configureで登録するプロファイル名はプロファイル名の後ろに"-long-term"をつける必要があるということです。

例えば、"s3-cli-user" というプロファイル名を使用したい場合、"s3-cli-user-long-term"というプロファイル名でaws cli configureを実行します。

$ aws configure --profile s3-cli-user-long-term   # -long-termを付けたプロファイル名を指定する
AWS Access Key ID [None]: 発行したアクセスキー
AWS Secret Access Key [None]: 発行したシークレットアクセスキー
Default region name [None]: ap-northeast-1
Default output format [None]: json

aws-mfaを使いmfa認証する際には"-long-term"を除いたプロファイル名を指定します。

aws-mfa --device {仮想MFAデバイスのARN} --profile s3-cli-user  # -long-termを付けないプロファイル名

認証成功後に.aws/credentialsを確認すると"-long-term"を除いたプロファイル名(例ではs3-cli-user)がaws-mfaにより作成されます。

aws-mfaはこの記事の前半で書いたaws cliによる一時認証情報の発行を"-long-term"がついたプロファイで行います。そして、取得した一時認証情報を"-long-term"を付けないプロファイル名で.aws/credentialsへ書き込みます。

# aws cli configure --profile s3-cli-user-long-term で作成したプロファイル
[s3-cli-user-long-term]
aws_access_key_id = xxxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxx

# aws-mfaにより作成されたプロファイル
[s3-cli-user]
assumed_role = False
aws_access_key_id = xxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxx
aws_session_token = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
aws_security_token = xxxxxxxxxxxxxxxxxxxxxx
expiration = 2021-01-01 00:00:00