IAM で MFA デバイスを複数登録が可能となった影響で MFA 強制の IAM ポリシーに修正が必要です

記事タイトルとURLをコピーする

カスタマーサクセス部 佐竹です。
本日は、以下のアップデートに関する運用上の注意点のお知らせです。IAM ポリシーで、IAM User に MFA デバイスの設定を強制されている場合に、本アップデートによる影響がありましたので周知のために記載しております。

aws.amazon.com

はじめに

AWS Identity and Access Management now supports multiple multi-factor authentication (MFA) devices

2022年11月16日に発表された上記のアップデートは、これまで1つしか登録できなかった IAM User もしくは root アカウントユーザへの MFA のデバイスを、最大8個まで登録が可能となる機能強化のアップデートとなっています。

security credentials

2台目以降の MFA の追加は、マネジメントコンソール画面右上にある「Security credentials (My security credentials)」から遷移することで設定が可能です。

アップデートの影響

このアップデートの影響で、これまでは MFA デバイス登録時には「各デバイスへの名付けが不要」であったものが「名付けが必須」に変更となりました

MFA デバイス に名前が必須となった

上記の画面は新しく MFA デバイスを1つ登録しようとした場合に表示される画面です。このように、今まで名前を記載するフィールドはなかったのですが、それが「必須」として表示されます。

IAM ポリシーへの影響

セキュリティの強化を目的に、サーバーワークスでは以下のブログでも紹介しております通り IAM ポリシーを利用して「MFA の設定を強制する」ようお客様に推奨してきております。

blog.serverworks.co.jp

これを実装することで、MFA デバイスを1つも設定していない IAM User は、ごく限られた動作 (MFA デバイスの設定追加) しかできないよう制限がかかるようになっています。

上記のブログにおいて「公式ドキュメント」を参考に、その json をより運用に適した形に修正した IAM ポリシーをご紹介しております。以下がその json です。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowViewAccountInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetAccountPasswordPolicy",
                "iam:GetAccountSummary",
                "iam:ListVirtualMFADevices"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowManageOwnPasswords",
            "Effect": "Allow",
            "Action": [
                "iam:ChangePassword",
                "iam:GetUser",
                "iam:CreateLoginProfile",
                "iam:DeleteLoginProfile",
                "iam:GetLoginProfile",
                "iam:UpdateLoginProfile"
            ],
            "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": "AllowManageOwnVirtualMFADevice",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice",
                "iam:DeleteVirtualMFADevice"
            ],
            "Resource": "arn:aws:iam::*:mfa/${aws:username}"
        },
        {
            "Sid": "AllowManageOwnUserMFA",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice",
                "iam:EnableMFADevice",
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "DenyAllExceptListedIfNoMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:ChangePassword",
                "iam:GetUser",
                "iam:CreateLoginProfile",
                "iam:DeleteLoginProfile",
                "iam:GetLoginProfile",
                "iam:UpdateLoginProfile",
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice",
                "iam:DeleteVirtualMFADevice",
                "sts:GetSessionToken"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}

修正が必要な個所 ${aws:username}

上記 json は多くのお客様でご利用いただいておりますが、今回のアップデートで影響を受けております。

その箇所は 80 行目の "Resource": "arn:aws:iam::*:mfa/${aws:username}" です。

arn の最後の ${aws:username} は「1台のみ MFA デバイスが設定可能であった時代」には、ここにユーザ名が強制的に入力されておりましたので、この arn は問題なくいままで動作しておりました。

しかし、複数の MFA デバイスが登録できるようになったことで、デバイス名にはユーザが自由に名前を入力できるようになっています。このため、本制御がエラーを発生させてしまいます。

発生するエラー

You need permissions

You need permissions
You do not have the permission required to perform this operation. Ask your administrator to add permissions.

User: arn:aws:iam::123456789012:user/satake@serverworks.co.jp is not authorized to perform: iam:CreateVirtualMFADevice on resource: arn:aws:iam::123456789012:mfa/2ndMFA because no identity-based policy allows the iam:CreateVirtualMFADevice action

本エラーは "Resource": "arn:aws:iam::*:mfa/${aws:username}" という arn の MFA デバイス以外の登録を許さない、という IAM ポリシーの制御の影響で発生しています。

このため、MFA デバイス名に自由な名称を入力可能とするためには "Resource": "arn:aws:iam::*:mfa/${aws:username}" の修正が必要です。

修正後の IAM ポリシー json

修正方法ですが、登録される MFA デバイスがどのような名称になるのかは自由であるため "Resource": "arn:aws:iam::*:mfa/*" として修正しました。

修正は 80 行目=1か所のみではありますが、json 全体を以下に記載します。

{
    "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": "AllowManageOwnVirtualMFADevice",
            "Effect": "Allow",
            "Action": [
                "iam:CreateVirtualMFADevice",
                "iam:DeleteVirtualMFADevice"
            ],
            "Resource": "arn:aws:iam::*:mfa/*"
        },
        {
            "Sid": "AllowManageOwnUserMFA",
            "Effect": "Allow",
            "Action": [
                "iam:DeactivateMFADevice",
                "iam:EnableMFADevice",
                "iam:ListMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "arn:aws:iam::*:user/${aws:username}"
        },
        {
            "Sid": "DenyAllExceptListedIfNoMFA",
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:GetUser",
                "iam:ListMFADevices",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice",
                "sts:GetSessionToken"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
        }
    ]
}

お手数ですが、これまで MFA 強制の IAM ポリシーをご利用されてきたお客様は、上記の通りの修正をお願い致します。

なお、社内で相談した結果 "Resource": "arn:aws:iam::*:mfa/${aws:username}*" という修正案も合わせて推奨する記載方法となりました。既存の記載内容の最後に「 * 」を追加する形です。このように設定することで、一意である IAM ユーザ名の表記が必須となり、MFA デバイス名の重複回避が可能となります。

ただし、この場合は「そのような入力制限が MFA デバイス名で行われている」という事実を適切に社内に展開を頂く必要がございます。これは、マネジメントコンソールのエラーメッセージからは推測ができないためとなります。

注意点やその他のご連絡事項

影響を受けないお客様

MFA 強制の IAM ポリシーを IAM エンティティ(ユーザ or グループ)に付与されている場合にのみ本アップデートが影響します。このため、このような IAM ポリシーを付与されていないお客様では同様のエラーは発生しません。

まだ全ての AWS アカウントが複数の MFA デバイス登録に対応していない

まだ AWS アカウント全てに本アップデートが適用されていない状態のため、ご利用されている AWS アカウントの状況によっては1つしか MFA デバイスを登録できない場合が確認できています。

このような場合は、先に紹介したパーミッションに関するエラーは発生しません。しかし、順にアップデートが反映されていきますため、予め修正の反映を推奨いたします。

2台目の MFA デバイス登録からエラーが発生する場合

既に MFA デバイスが登録されている場合、1つ目のデバイス名称は IAM User 名で登録されていることになるため、影響は2台目から発生します。

2台目の MFA デバイスが先にご紹介したものと同様のエラーで登録ができない場合、IAM ポリシーの影響があるかどうかご確認ください。

1台目の MFA デバイス登録からエラーが発生する場合

新規に払い出されました AWS アカウントで既存のポリシーを流用して MFA を強制する場合や、本アップデート後に既存の AWS アカウントで IAM User が新たに払い出される場合には、1台目の MFA デバイスから名付けが必須となるためエラーが発生する可能性があります。

この場合、IAM User と同じ名前のデバイス名を設定することで1台目の登録が可能となります。

しかし、利用者側はそのような制約があることがわからず、エラーを発生させてしまう可能性が高いでしょう。既存のポリシーのまま(1台しか登録を行わない)運用を継続する場合は「IAM User と同じ名前の MFA デバイス名を入力する必要がある」という制限が行われている事実を正しく利用者にご展開ください。

MFA デバイス名は AWS アカウント内で一意でなければならない

少々本題とズレますが、運用上厳しい制約が判明しておりますので合わせて記載します。

エンティティは既に存在しています エラー

エンティティは既に存在しています
このエンティティは既に存在しています。

MFA device already exists. Before you can add a new virtual MFA device, ask your administrator to delete the existing device using the CLI or API.

現時点で、登録される MFA デバイスの名称は AWS アカウント内で一意でなければならないという制約が存在しております。違反した場合は、上記のエラーが発生し、登録ができません。 これは、AWS の ARN (Amazon Resource Name) が常に一意なければならないという仕様の影響によるものです。

これまでは自動的に IAM User 名がデバイス名として入力されていたため、AWS アカウント内で一意であっても支障はなかったのですが、自由に名前が入力できるようになったことから今後重複することが懸念されます。

この MFA デバイス名の重複を排除するためには、予め命名規則を定めるなどの運用回避が必要となりそうです。例えば、デバイス名の前には IAM User 名を必ず記載する、などです。

修正後はアスタリスク (*) で問題はないのか

"Resource": "arn:aws:iam::*:mfa/*" と、最後にアスタリスク=ワイルドカードを記載することでどのような名前の MFA デバイスでも許可するとしていますが、この修正で運用上懸念がないかどうかというのも少々気がかりです。

今回の json の通り記載することで、どのような名前であっても MFA デバイスを作成できる反面、どのような名前の MFA デバイスをも削除できてしまいます。AWS マネジメントコンソールからでは他人の MFA デバイスを操作することはできませんが、AWS CLI や CloudShell 等を利用した API の操作ではそれが可能です。

例えば、MFA デバイスの名前が重複した旨のエラーが発生した場合に、既に登録済の他人の MFA デバイスを CLI で削除されてしまうような懸念があります。この点を踏まえると、やはり "Resource": "arn:aws:iam::*:mfa/${aws:username}*" と記載するほうが(もしくは json の修正を行わず ${aws:username} のままとするほうが)、よりセキュアであると言えるでしょう。

SCP の修正は不要

以下のブログでご紹介している SCP の json では本アップデートの影響を受けませんため、修正は不要となります。

blog.serverworks.co.jp

まとめ

本日は、IAM User に MFA デバイスを複数登録が可能となった影響で MFA 強制の IAM ポリシーに修正が必要な理由と、修正点と影響について記載しました。

記載内容を抜粋してまとめると以下の通りになります。

  • MFA デバイスを1台しか許可したくない場合:既存のまま json の修正を行わない。ただし IAM ユーザ名以外の登録ができない点を周知する*1
  • MFA デバイスを重複しないよう複数台許可したい場合:${aws:username}* と修正を行う。ただし IAM ユーザ名が prefix として必須になる旨を周知する
  • MFA デバイス名の自由入力を許可し、重複を許容する場合:* と修正を行う

同様のエラーが発生して困っているお客様の何らかの参考になれば幸いです。

合わせて読んで頂きたい記事

「MFA デバイスを1台しか許可したくない場合」には、以下のブログも合わせてご確認ください。場合によっては、Deny による制限が必要となります。

blog.serverworks.co.jp

では、またお会いしましょう。

*1:IAM ユーザ名は大文字小文字を区別するため、メールアドレス等を IAM ユーザ名として登録されている際には大文字小文字の組み合わせにもご注意ください

佐竹 陽一 (Yoichi Satake) エンジニアブログの記事一覧はコチラ

マネージドサービス部所属。AWS資格全冠。2010年1月からAWSを利用してきています。2021-2022 AWS Ambassadors/2023 Japan AWS Top Engineers/2020-2023 All Certifications Engineers。AWSのコスト削減、最適化を得意としています。