AWS CLI利用時のMFA認証で少しだけ楽をする

MFA保護下のIAMユーザーでAWS CLIを使用する際にPythonのスクリプトを用いて認証を少し楽にします。
2019.09.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWSを愛する皆さま、こんにちは。 FF14のログイン時間がめっきり減ってしまったコンサルティング部の西野(@xiye_gen)です。

MFA保護下でもAWS CLIを使える。しかし……

MFAによる保護を受けたIAMユーザーのクレデンシャルでAWS CLIを使用するためには、下記の手順に従い一時的なクレデンシャルを取得する必要があります。

AWS CLI 経由でAWSリソースへのアクセスを認証するには、どのようにMFAトークンを使用したらよいですか?

しかしながら、当該手順に従って出力されたクレデンシャルから必要な部分をコピーし環境変数にexportする作業は めんどくさい です。 MFAによる保護の恩恵を受けつつ少し楽をしましょう。

私の方法

下記の一連の作業を実行してくれるスクリプトを使用します。

  1. MFAトークンコードの入力を受け付ける
  2. MFAトークンコードをもとにGetSessionToken APIから一時クレデンシャルを取得する
  3. 一時クレデンシャルを含んだexportコマンド文字列を生成する

前提条件

  • 実行環境がMacもしくはLinuxであること *1
  • Python3およびAWS SDK for Python(Boto3)の実行環境があること
  • ~/.aws/credentialsのデフォルトプロファイルにIAMユーザーのクレデンシャル(アクセスキーおよびシークレットアクセスキー)が設定されていること *2

スクリプト

本体

generate_export_commands.py

import textwrap
import boto3

DURATION_SECONDS = 43200
SERIAL_NUMBER = '<MFA ARN>'

def generate_export_commands(token_code):
    client = boto3.client('sts')
    response = client.get_session_token(
        DurationSeconds=DURATION_SECONDS,
        SerialNumber=SERIAL_NUMBER,
        TokenCode=token_code
    )

    access_key = response['Credentials']['AccessKeyId']
    secret_access_key = response['Credentials']['SecretAccessKey']
    session_token = response['Credentials']['SessionToken']

    export_commands = textwrap.dedent('''\
        export AWS_ACCESS_KEY_ID={}
        export AWS_SECRET_ACCESS_KEY={}
        export AWS_SESSION_TOKEN={}
    ''').format(access_key, secret_access_key, session_token)
    return export_commands

token_code = input('Enter your token code: ')
export_commands = generate_export_commands(token_code)
print(export_commands)

使用する際は下記の変数の値をあらかじめ書き換えてください。

変数 説明
DURATION_SECONDS 一時クレデンシャルの有効期間を指定します。900秒から129,600秒の間で設定可能です。
SERIAL_NUMBER MFAデバイスのARNを指定します。

MFA ARNの確認方法

Management Console上のIAM→ユーザー→認証情報タブで確認できます。

実行してみる

$ python generate_export_commands.py
Enter your token code: 123456 #6桁のトークンコードを入力する
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
export AWS_SESSION_TOKEN=FQoGZXIvYXdz(長いので中略)+InEhDhKL3w4usF

無事exportコマンドが生成されました。

環境変数へエクスポートしてみる

スクリプトにより出力された3行のexportコマンドをコピー&ペースト&実行します。

$ export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
$ export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
$ export AWS_SESSION_TOKEN=FQoGZXIvYXdz(長いので中略)+InEhDhKL3w4usF

テストもしてみる

AWS CLIで任意のコマンドを実行します。

$ aws s3 ls
2019-09-03 15:45:47 XXXXXXXXXXXXXXXX #S3バケットの名称

一時クレデンシャルがしっかり働いてくれているようです。

※認証されていない場合下記のように出力されます。

$ aws s3 ls

An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

終わりに

今回は前職時代によく使っていたスクリプトを書き直してみました。 スクリプトを使った自動化はとても楽しいですね。(いまだ闇を見ていない者の感想)

このブログがほんの少しでも世界を良くできれば嬉しいです。 コンサルティング部の西野(@xiye_gen)がお送りしました。

脚注

  1. exportコマンドの部分等をいじればWindows環境でも使えるはずです。
  2. aws configureコマンドを実行しアクセスキー・シークレットアクセスキーを入力すればOKです。