🔑

AWS CLIでMFA認証するならアカウント内スイッチロールが便利

2024/04/01に公開

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としています。

~/.aws/credentials
[source-profile]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

スイッチ先ロールのプロファイルは、以下のように~/.aws/configに設定します。以下の例では、プロファイル名をmfa-profileとしていますが、このプロファイルをメインで使用するのであれば、defaultとしておくとコマンド実行時に--profileオプションが省略できるため便利だと思います。

~/.aws/config
[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
{
    ...
}
脚注
  1. AWS CLI 経由で MFA を使用してアクセスを認証する | AWS re:Post ↩︎

  2. IAM チュートリアル: ユーザーに自分の認証情報および MFA 設定を許可する - AWS Identity and Access Management ↩︎

  3. 【IAM】MFA 強制ポリシーの注意点【多要素認証】 - サーバーワークスエンジニアブログ ↩︎

Discussion