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