どうも、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生活を。
