MFA を有効化しないと、自身の認証設定以外は何もできなくなる IAM ポリシーサンプル


いつもよく使うのでまとめです。

IAM ユーザーに、MFA (Multifactor Authentification 多要素認証) 設定を強制させてしまおうという IAM ポリシーサンプルです。


以下のポリシーは、MFA　を設定していないと、 **以下の操作以外一切できない (Deny)** するようにしています。

- 自身のパスワードの変更
- 自身の MFA デバイスの登録
- 自身のプロフィール


パスワードの変更を許可しているのは、新規ユーザー作成時に強制的にパスワード変更を必須としている場合に、パスワード変更ができずにログインすらできなくなってしまうためです。

またついでに、自分の認証関係の設定は自分でできるようにするポリシーも付けています。MFA を設定すれば、追加で以下の作業ができるようになります。

- アクセスキーの管理
- デジタル署名用証明書(X.509)の管理
- CodeCommit の SSH パブリックキーの管理
- CodeCommit の HTTPS Git 認証情報の管理

この IAM ポリシーに加えて、各々の IAM 権限を追加して下さい。


## ハマりポイント

MFA を設定してから **一度、ログアウトして・再ログイン (MFA を使ってログイン)** しないと、他に付与している IAM 権限を使うことができません。

あと、ポリシーシュミレーターでも、うまく検証できません。自分で、そう設定したのに検証でポリシーシュミレーターで1時間ぐらいどハマりしてしまった😅 シュミレータに `MultiFactorAuthPresent` 渡せたらな・・・


## IAM ポリシーサンプル


```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowViewAccountInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetAccountPasswordPolicy",
                "iam:ListVirtualMFADevices"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowManageOwnPasswords",
            "Effect": "Allow",
            "Action": [
                "iam:ChangePassword",
                "iam:GetUser"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnAccessKeys",
            "Effect": "Allow",
            "Action": [
                "iam:CreateAccessKey",
                "iam:DeleteAccessKey",
                "iam:ListAccessKeys",
                "iam:UpdateAccessKey"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnSigningCertificates",
            "Effect": "Allow",
            "Action": [
                "iam:DeleteSigningCertificate",
                "iam:ListSigningCertificates",
                "iam:UpdateSigningCertificate",
                "iam:UploadSigningCertificate"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnSSHPublicKeys",
            "Effect": "Allow",
            "Action": [
                "iam:DeleteSSHPublicKey",
                "iam:GetSSHPublicKey",
                "iam:ListSSHPublicKeys",
                "iam:UpdateSSHPublicKey",
                "iam:UploadSSHPublicKey"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnGitCredentials",
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceSpecificCredential",
                "iam:DeleteServiceSpecificCredential",
                "iam:ListServiceSpecificCredentials",
                "iam:ResetServiceSpecificCredential",
                "iam:UpdateServiceSpecificCredential"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowUserToCreateVirtualMFADevice",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice"
            ],
            "Resource": "arn:aws:iam::*:mfa/*"
        },
        {
            "Sid": "AllowUserToManageTheirOwnMFA",
            "Effect": "Allow",
            "Action": [
                "iam:EnableMFADevice",
                "iam:GetMFADevice",
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "AllowUserToDeactivateTheirOwnMFAOnlyWhenUsingMFA",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice"
            ],
            "Resource": [
                "arn:aws:iam::*:user/${aws:username}"
            ],
            "Condition": {
                "Bool": {
                    "aws:MultiFactorAuthPresent": "true"
                }
            }
        }
    ]
}
```


いろいろ参考（感謝）
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_iam_mfa-selfmanage.html
https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_aws_my-sec-creds-self-manage-mfa-only.html
https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_iam_mfa-selfmanage.html
https://aws.amazon.com/jp/premiumsupport/knowledge-center/mfa-iam-user-aws-cli/
https://dev.classmethod.jp/articles/iam-assume-role-policy-condition-using-boolifexists/
https://jousys-force.deepapex.com/blogs/force-mfa-login

以上