MFA 必須環境でもセルフサービスでMFA を有効化するIAM ポリシー例

以前のエントリーで以下のようなCLI でMFA 認証が必須の構成方法を紹介しました。

上記のエントリーの中で、以下のようなMFA を記述してMFA 認証していない場合はすべてを拒否するという設定をしています。これによりMFA 認証を通っていないユーザは何もできないアクセス制御が可能です。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllDenyWithoutMFA",
"Effect": "Deny",
"Action": [
"*"
],
"Resource": [
"*"
],
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": false
}
}
}
]
}
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllDenyWithoutMFA", "Effect": "Deny", "Action": [ "*" ], "Resource": [ "*" ], "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": false } } } ] }
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllDenyWithoutMFA",
            "Effect": "Deny",
            "Action": [
                "*"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": false
                }
            }
        }
    ]
}

このIAM ポリシーの問題点は新しいIAM ユーザを作成したあとに、管理者がMFA を有効化してあげないとIAM ユーザはログインしても何もできないという点です。
IAM ユーザがMFA ログインしなくても、セルフサービスで自分のMFA設定やパスワードの変更ができるようなIAM ポリシーの設定であると便利です。

上記のIAM ポリシーを以下のポリシーに書き換えれば実現ができます。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllDenyWithoutMFA",
"Effect": "Deny",
"NotAction": [
"iam:ListMFADevices",
"iam:ListVirtualMFADevices",
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:ChangePassword"
],
"NotResource": [
"arn:aws:iam::*:mfa/",
"arn:aws:iam::*:mfa/${aws:username}",
"arn:aws:iam::*:user/${aws:username}"
],
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": false
}
}
}
]
}
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllDenyWithoutMFA", "Effect": "Deny", "NotAction": [ "iam:ListMFADevices", "iam:ListVirtualMFADevices", "iam:CreateVirtualMFADevice", "iam:EnableMFADevice", "iam:ChangePassword" ], "NotResource": [ "arn:aws:iam::*:mfa/", "arn:aws:iam::*:mfa/${aws:username}", "arn:aws:iam::*:user/${aws:username}" ], "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": false } } } ] }
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllDenyWithoutMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:ChangePassword"
            ],
            "NotResource": [
                "arn:aws:iam::*:mfa/",
                "arn:aws:iam::*:mfa/${aws:username}",
                "arn:aws:iam::*:user/${aws:username}"
            ],
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": false
                }
            }
        }
    ]
}

前回のIAM ポリシー設定では、MFA 認証していない場合、すべてのActionRosource を”Deny” していましたが、今回は NotAction/NotResource を利用して、ログインしたIAM ユーザ自身のMFA に対する操作以外を拒否する設定としました。

これで、新たなIAM ユーザを作成しても、上記のポリシーを割り当てておけばセルフサービスでMFA を有効化しない限り何も操作ができないアクセス制御が可能となります。

各IAM ユーザはログインしたあとに、”マイセキュリティ資格情報” から自身のMFA デバイスを登録できます。

是非試してみてください。