サイトアイコン 協栄情報ブログ

プログラムでMFA認証を使いたい


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

【問題点】

プロジェクトのセキュリティ上、IAMユーザにMFA(他要素認証)が必須です。MFA有効にするとAWSマネジメントコンソールでログイン時、MFAコードを入力してログインでき、リソースを操作することが可能です。
一方、プログラム(AWSCLI、Python、Java…)を用いてリソースにアクセスする場合、MFAコードが求められませんのでAWSのリソースにアクセスする権限がありません。と怒られます。

【解決方法】

stsのget_session_tokenメソッド(AWSCLIコマンド:aws sts get-session-token)はMFAコードをサポートしているため、このメソッドを使って一時クレデンシャルを発行してAWSリソースにアクセスできます。

【get_session_tokenの説明】:
AWSアカウントまたはIAMユーザーの一時的な認証情報のセットを返します。資格情報は、アクセスキーID、シークレットアクセスキー、およびセキュリティトークンで構成されます。
通常、MFAを使用してAmazon EC2StopInstancesなどの特定のAWSAPIオペレーションへのプログラムによる呼び出しを保護する場合は、GetSessionTokenを使用します。 MFA対応のIAMユーザーは、GetSessionTokenを呼び出して、MFAデバイスに関連付けられているMFAコードを送信する必要があります。 IAMユーザーは、呼び出しから返される一時的なセキュリティ認証情報を使用して、MFA認証を必要とするAPI操作をプログラムで呼び出すことができます。

一言で言うと永続なクレデンシャル(IAMユーザー)を所持してstsへMFA情報を渡して、sts側がMFAのある一時クレデンシャルを発行してくれる。

詳細はaws sts get-session-token
MFA トークンを使用して、AWS CLI 経由で AWS リソースへのアクセスを認証する方法
参照してください。

※上記のURLの記載のように取得した一時クレデンシャルは環境変数に設定したり、プロファイルへ設定したりすることで有効期限が切れるまで使えます。おすすめではない、スクリプトでそのまま使ったほうがいいです。

【サンプルpython】

mfa = 'arn:aws:iam::123456789:mfa/xxx'

####### 永続なクレデンシャルをもってstsでMFAの一時クレデンシャルを発行
session_sts = Session(profile_name=profile)
sts = session_sts.client('sts')
mfa_TOTP = input("Enter the MFA code: ")
tempCredentials = sts.get_session_token(
    DurationSeconds=3600,
    SerialNumber=mfa,
    TokenCode=mfa_TOTP
)

####### 取得したMFAの一時クレデンシャルでsessionを作成してAWSリソースを操作する
session = Session(
    aws_access_key_id=tempCredentials['Credentials']['AccessKeyId'],
    aws_secret_access_key=tempCredentials['Credentials']['SecretAccessKey'],
    aws_session_token=tempCredentials['Credentials']['SessionToken'])

client = session.client('ec2', region_name=xxx)
モバイルバージョンを終了