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