IAMユーザに多要素認証設定する時のIAMポリシー例

AWSにて、IAMユーザのログイン時に多要素認証をさせたい場合、当然、そのユーザ自身で自分のMFA設定も実施させたい訳で(そんなの管理者側でやってられない)、その際に利用するIAMポリシーとなります。AWSマニュアルにてズバリ紹介されているので、そのまんま利用しています。

チュートリアル: ユーザーが自分の認証情報および MFA を設定できるようにする - AWS Identity and Access Management

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAllUsersToListAccounts",
            "Effect": "Allow",
            "Action": [
                "iam:ListAccountAliases",
                "iam:ListUsers",
                "iam:ListVirtualMFADevices",
                "iam:GetAccountPasswordPolicy",
                "iam:GetAccountSummary"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowIndividualUserToSeeAndManageOnlyTheirOwnAccountInformation",
            "Effect": "Allow",
            "Action": [
                "iam:ChangePassword",
                "iam:CreateAccessKey",
                "iam:CreateLoginProfile",
                "iam:DeleteAccessKey",
                "iam:DeleteLoginProfile",
                "iam:GetLoginProfile",
                "iam:ListAccessKeys",
                "iam:UpdateAccessKey",
                "iam:UpdateLoginProfile",
                "iam:ListSigningCertificates",
                "iam:DeleteSigningCertificate",
                "iam:UpdateSigningCertificate",
                "iam:UploadSigningCertificate",
                "iam:ListSSHPublicKeys",
                "iam:GetSSHPublicKey",
                "iam:DeleteSSHPublicKey",
                "iam:UpdateSSHPublicKey",
                "iam:UploadSSHPublicKey"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowIndividualUserToListOnlyTheirOwnMFA",
            "Effect": "Allow",
            "Action": [
                "iam:ListMFADevices"
            ],
            "Resource": [
                "arn:aws:iam::*:mfa/*",
                "arn:aws:iam::*:user/${aws:username}"
            ]
        },
        {
            "Sid": "AllowIndividualUserToManageTheirOwnMFA",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice",
                "iam:DeleteVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice"
            ],
            "Resource": [
                "arn:aws:iam::*:mfa/${aws:username}",
                "arn:aws:iam::*:user/${aws:username}"
            ]
        },
        {
            "Sid": "AllowIndividualUserToDeactivateOnlyTheirOwnMFAOnlyWhenUsingMFA",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice"
            ],
            "Resource": [
                "arn:aws:iam::*:mfa/${aws:username}",
                "arn:aws:iam::*:user/${aws:username}"
            ],
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        },
        {
            "Sid": "BlockMostAccessUnlessSignedInWithMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:DeleteVirtualMFADevice",
                "iam:ListVirtualMFADevices",
                "iam:EnableMFADevice",
                "iam:ResyncMFADevice",
                "iam:ListAccountAliases",
                "iam:ListUsers",
                "iam:ListSSHPublicKeys",
                "iam:ListAccessKeys",
                "iam:ListServiceSpecificCredentials",
                "iam:ListMFADevices",
                "iam:GetAccountSummary",
                "sts:GetSessionToken",
                "iam:ChangePassword",
                "iam:CreateLoginProfile"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}

このポリシーを与えられたIAMユーザは、AWSコンソールにログインし自身のMFA設定は実施できますが、MFAの設定を実施しない限り、それ以外の操作ができなくなります。なので、多要素認証をさせたい全てのIAMユーザには、このポリシーを必ずつけて、その他必要なポリシーをつけてあげます。

同一のアクションに対して、複数のIAMポリシーが定義されている場合、 明示的なdeny -> 明示的なallow -> 暗黙的なdeny の順で強さが決まります。 (IAMユーザを作成し何のポリシーも与えない場合、全ての権限に 暗黙的なdeny が発生しています)左から、 明示的なdeny が一番強い権限です。

今回のポリシーでは、末尾のsid BlockMostAccessUnlessSignedInWithMFA にて、 NotAction で指定しているアクション一覧を Deny しているので(2重の否定)、このsidに記載されていないアクション以外は、MFAを設定するまで(conditionの BoolIfExists を満たすまで)、許可されないことになります。

追記 20181026

本IAMポリシーを付与されたユーザーは、 MFA設定を実施した後 および パスワードを変更した後 は、一度ログインし直す必要があります。

MFA設定の後はイメージできたのですが、パスワード変更後にも再ログイン必要であることが分からず、原因分かるまで大分はまってしまったので、メモしておきます。