前置き
コンソールからログインする際、MFA認証をするよう設定しているのですが、
CLIからアクセスする際、コンソールに合わせてMFA認証を強制した場合、
スイッチロールする時のコマンド分からなかったので調べてみました。
前提条件
・IAMの多要素認証(MFA)でデバイスの割り当てが完了していること
・AWS CLIがローカルPCにインストール済みであること
(以下のコマンドで確認。バージョンが表示されればインストール済み。)
aws --version
設定方法
まずはスイッチロールの設定から。スイッチロール先(アカウントBとする)のIAMで
ロールを作成してアタッチします。許可ポリシーは任意で設定してください。
信頼関係タブをクリックし、信頼ポリシーを以下のように編集します。
スイッチロール元(アカウントAとする)のIAMでポリシーを作成してアタッチします。
~/.aws/configを以下のように編集します。
[profile アカウントA]
region = ap-northeast-1
output = json
[profile アカウントB]
source_profile = アカウントA
role_arn = arn:aws:iam::【アカウントBのアカウントID】:role/【作成したロール名】
mfa_serial = arn:aws:iam::【アカウントAのアカウントID】:mfa/【MFA認証デバイス名】
region = ap-northeast-1
output = json
~/.aws/credentialsを以下のように編集します。
[アカウントA]
aws_access_key_id = 【アクセスキー】
aws_secret_access_key = 【シークレットアクセスキー】
これでスイッチロールをするための権限の付与と、MFA認証の強制が設定できました。
次にCLIでアクセスしてみます。
コマンド
MFA認証をパスし、一時認証情報を取得します。
aws sts assume-role --role-arn arn:aws:iam::【アカウントBのアカウントID】:role/【アカウントBで作成したロール】 --role-session-name 【任意のセッション名】 --profile 【アカウントAのProfile名】 --serial-number arn:aws:iam::【アカウントAのアカウントID】:mfa/【アカウントAのMFAデバイス名】--token-code 【6桁のMFA認証コード】
※アカウントA = スイッチロール元のアカウント
※アカウントB = スイッチロール先のアカウント
出力結果
{
"Credentials": {
"AccessKeyId": "XXXXXXXX",
"SecretAccessKey": "XXXXXXXX",
"SessionToken": "XXXXXXXX",
"Expiration": "XXXX-XX-XXTXX:XX:XXZ"
},
"AssumedRoleUser": {
"AssumedRoleId": "XXXXXXXX:スイッチロール先のプロファイル名",
"Arn": "arn:aws:sts::アカウントBのアカウントID:assumed-role/アカウントBで作成したロール/XXXXXXXX"
}
}
環境変数に出力された情報を設定します。
export AWS_PROFILE=【スイッチロール先のプロファイル名】
export AWS_ACCESS_KEY_ID=【出力されたAccessKeyId】
export AWS_SECRET_ACCESS_KEY=【出力されたSecretAccessKey】
export AWS_SESSION_TOKEN=【出力されたSessionToken】
以下のコマンドでスイッチロールできたか確認します。
(Accountがスイッチロール先のアカウントIDになっており、
アカウントBのS3バケットが表示されればOK)
aws sts get-caller-identity
aws s3 ls --profile 【アカウントBのProfile名】
踏み台アカウント(アカウントA)を操作する場合
以下のコマンドで一時トークン発行し、アクセスできます。
aws sts get-session-token --serial-number arn:aws:iam::【アカウントAのアカウントID】:mfa/【MFA認証デバイス名】 --token-code 【6桁のMFA認証コード】 --profile 【アカウントAのProfile名】