AWS CLIでMFA認証するならアカウント内スイッチロールが便利
AWS CLIでもMFA認証したい場合は、アカウント内でのスイッチロールを活用すると便利です。
はじめに
AWS CLIでMFA認証を行う方法をググると、結構手間が掛かることに気付きます。
最も順当そうな方法は、aws sts get-session-token
コマンドを実行し、得られた結果(一時的な認証情報)を、AWS CLIが参照する環境変数等に設定することです[1]。毎回手作業ではつらいためシェルスクリプト化すると少し楽になりますが、それでも認証情報の有効期限が切れるたび、打ちたいコマンドを打つ前に自発的に認証情報を設定する必要があります。
本記事では、「普通にコマンドを実行して、もし必要ならMFAコードの入力が自動的に求められる」ような方法として、スイッチロールを活用したAWS CLIのMFA認証の方法を紹介します。
準備1:IAMユーザーにMFAを強制する
セキュリティ向上のため、IAMユーザーにMFAを必須化するポリシー[2][3]を設定しておくと良いでしょう。マネジメントコンソールと異なり、アクセスキーによるアクセスではMFA認証プロセスなしでIAMユーザーの権限を使用できてしまうためです。
以下のポリシーをIAMユーザーにアタッチすることにより、MFA認証を受けていない状態ではユーザーのほとんどの操作が拒否されるようになります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyAllExceptListedIfNoMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:GetMFADevice",
"iam:ListMFADevices",
"iam:ListVirtualMFADevices",
"iam:ResyncMFADevice",
"sts:GetSessionToken",
"iam:ChangePassword",
"iam:GetAccountPasswordPolicy"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
IAMユーザーに特段強い権限を与えないのであれば(認証情報の自己管理+スイッチ先ロールへのsts:AssumeRole
程度など)、ここまでしなくても大丈夫だと思います。
準備2:スイッチ先のIAMロールを作成する
スイッチ先のIAMロールを作成します。
信頼ポリシーは、以下のように、スイッチ元のIAMユーザーを信頼し、Condition
要素でMFA認証を必須としてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "123456789012"
},
"Action": "sts:AssumeRole",
"Condition": {
"Bool": {
"aws:MultiFactorAuthPresent": "true"
},
"StringLike": {
"sts:RoleSessionName": "${aws:username}"
}
}
}
]
}
権限側のポリシーは任意に設定してください。
なお、ここで作成したIAMロールARNは後で使用します。
準備3:AWS CLIのプロファイルを設定する
スイッチ元ユーザーの認証情報およびスイッチ先ロールのプロファイルを設定します。
スイッチ元ユーザーの認証情報は、以下のように~/.aws/credentials
に設定します。プロファイル名は何でも良いですが、スイッチロールをメインで使用するのであればdefault
以外にしておくことをおすすめします。以下の例ではsource-profile
としています。
[source-profile]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
スイッチ先ロールのプロファイルは、以下のように~/.aws/config
に設定します。以下の例では、プロファイル名をmfa-profile
としていますが、このプロファイルをメインで使用するのであれば、default
としておくとコマンド実行時に--profile
オプションが省略できるため便利だと思います。
[profile mfa-profile]
role_arn = arn:aws:iam::123456789012:role/destination-role-name
source_profile = source-profile
mfa_serial = arn:aws:iam::123456789012:mfa/source-users-device-name
role_session_name = source-user-name
以上で事前準備は完了です。
使い方
スイッチ先プロファイルで任意のAWS CLIコマンドを実行するだけです。すると、必要な場合に限りMFAコードの入力が求められます。入力すると、コマンドの実行結果が得られます。
$ aws sts get-caller-identity --profile mfa-profile
Enter MFA code for arn:aws:iam::123456789012:mfa/source-users-device-name: 123456
{
...
}
Discussion