STS一時認証情報を1コマンドでcredentialsファイルに保存する

どうも、AWS CLIは好きなわりに使いこなせていない寺内です。

AWSアカウントのポリシーで多要素認証が強制される場合、IAMユーザで作成したアクセスキーとシークレットキーのみではAWS CLIを使用することができません。AWS CLIを使うためにはMFAによる認証を経て、一時的なセッショントークンを取得します。そのアクセスキーとシークレットキー、セッショントークンをCredentialsファイルに保存し、そのプロファイルを指定してAWS CLIコマンドを発行します。

AWS CLIでセッショントークンを得るには、 aws sts get-session-token コマンドを使い、そこで出力された値を、credentialsファイルに保存するという手間が必要です。
一時的なセッショントークンは、有効期間が最大36 時間なので、ほぼ毎日この作業を行うのは面倒です。
この手間を惜しんでMFAを使わないIAMユーザを作ったりするとセキュリティホールになりかねません。

そこで、ひと手間で上記を実施するスクリプトを作成しました。
AWS CLI利用の方は是非ご活用ください。

利用方法

AWS CLIを実行する端末(ここではWindows)で、Terminal(PowerShellなど)を起動します。
後述するスクリプト(sts_save.py)をpythonコマンドで実行するだけです。引数にMFAで表示されている6桁の認証コードを入力します。

PS > python c:\users\terauchi\python\sts_save.py 123456
source key: [default] aws_access_key_id = AKIAAAAAAAAAAAAAAAAA
STS key: [sts] aws_access_key_id = ASIBBBBBBBBBBBBBBB

Config file(C:\Users\terauchi\.aws\credentials) was successfully written.

これで、credentialsファイルにSTSで得た認証情報が保存されました。続けて、通常のAWSコマンドをプロファイル sts を指定して実行することができます。
以下のような感じです。

PS > aws s3 ls --profile sts

インストール

前提

このスクリプトは以下の前提で動作します。

  • python実行環境があること
  • ライブラリboto3がインストールされていること
  • AWS CLIがセットアップされ、ホームディレクトリに .aws/config.aws/credentials のファイルがあること

ソースファイルの保存

以下のソースコードを、任意の場所に保存してください。上記の例では c:\users\terauchi\python\ に保存しています。
ファイル名は sts_save.py としています。好きな名前で保存してください。

import sys
import os
import boto3
import configparser

# パラメータ設定
#   serial_number: MFAのARNを記載ください。
#   config_file: AWS CLIのconfigファイルのパスを記載ください。
#   source_profile: 一時認証を行う元となるプロファイルを指定します。
#   profile_name: 一時認証をしたプロファイルの名前を決めてください。

serial_number  = 'arn:aws:iam::123456789012:mfa/hogehoge'
config_file    = 'C:\\Users\\terauchi\\.aws\\credentials'
source_profile = 'default'
profile_name   = 'sts'

# 引数チェックとトークンコード取得
if len(sys.argv) == 2:
    token_code = sys.argv[1]
else:
    print('Usage: '+sys.argv[0]+' MFA_CODE(6 digit)')
    exit(1)

# configファイルの存在チェック
if not os.path.isfile(config_file):
    print( config_file+' not found.')
    exit(1)

# configファイル読み込み
config = configparser.ConfigParser()
config.read( config_file, encoding='utf-8' )

source_user_access_key = config[source_profile]['aws_access_key_id']
source_user_secret_access_key = config[source_profile]['aws_secret_access_key']

print('source key: ['+source_profile+'] aws_access_key_id = '+source_user_access_key)

# 認証処理
sts = boto3.client(
    'sts',
    aws_access_key_id =source_user_access_key,
    aws_secret_access_key = source_user_secret_access_key
    )
try:
    response = sts.get_session_token(
        DurationSeconds = 43200 , # 12 hours
        SerialNumber    = serial_number,
        TokenCode       = token_code
    )
except Exception as e:
    print(e)
    exit(1)

# 認証済情報表示
aws_access_key_id     = response['Credentials']['AccessKeyId']
aws_secret_access_key = response['Credentials']['SecretAccessKey']
aws_session_token     = response['Credentials']['SessionToken']

print('STS key: ['+profile_name+'] aws_access_key_id = '+aws_access_key_id)
print('')

# config情報変更
if not profile_name in config.keys():
    config[profile_name]={}

config[profile_name]['aws_access_key_id']     = aws_access_key_id
config[profile_name]['aws_secret_access_key'] = aws_secret_access_key
config[profile_name]['aws_session_token']     = aws_session_token

# configファイル書き込み
f = open( config_file, 'w' )
config.write( f )
f.close()
print('Config file('+config_file+') was successfully written.')

exit(0)

パラメータの変更

ソース内のコメントにも記載していますが、以下のパラメータを設定してください。

serial_number MFAのARNを記載してください。
config_file credentialsファイルのパスを指定してください。Windowsの場合は、区切り文字を \\ とします。ここで指定したファイルに保存します。
source_profile config_file に記載してあるアクセスキーとシークレットキーを使用するプロファイルを指定します。この権限を使い一時認証を取得します。
profile_name 取得した一時認証を保存するプロファイル名を指定します。

動作確認

エラーなく実行されたら、config_file で指定したファイルを見ると profile_name で指定したプロファイルが追加もしくは更新されています。そのプロファイルのaws_access_key_id が、コマンドで表示されたIDに更新されていることを確認してください。

これで簡単にSTS認証情報を利用することができます。

では、よいAWS CLI生活を。

タイトルとURLをコピーしました