MFA 強制ポリシーを適用した IAM ユーザーで初回ログイン時のパスワード変更(リセット)ができない時の対処法

明示的な Deny と iam:ChangePassword がキーワードです。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンバンハ、千葉(幸)です。

今回想定しているのは以下のようなケースです。

  • IAM グループに MFA 強制ポリシーをアタッチしている
  • 新規の IAM ユーザーを IAM グループに所属させる形で作成する
  • IAM ユーザーには初回サインイン時のパスワードリセットを求める設定とする
  • 当該ユーザーがパスワードリセットを試みた際にエラーが発生する

MFAForce

回避策をご紹介します。

先にまとめ

  • 初回ログイン時のパスワード変更はiam:ChangePasswordというアクションを呼び出している
  • 公式ドキュメントのポリシーを参考にする際は必要に応じてカスタマイズが必要
  • 最低限iam:ChangePasswordを禁止対象から除外することで対応する
  • iam:ChangePasswordを明示的に Allow する必要があるかどうかはアカウントのポリシーに依存する

MFA 強制ポリシーとは

公式にそういった名称のポリシーがあるわけではありません。ここでは特定の条件を持つポリシーを、便宜上そう呼んでいます。

社内のセキュリティ標準によって「MFAを設定していない状態では特定のアクション以外は禁止」という設定を求められるケースは多々あるかと思います。

その際に参考にするポリシーとして、以下のあたりを参照することが多いのではないでしょうか。

( 1番目のポリシーを簡略化したものを以下エントリで取り上げていますのであわせてご参照ください。)

いずれのポリシーでも共通するのは、以下のようなステートメントを持つ点です。

---略---
        {
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:ListMFADevices",
                "iam:ListUsers",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
---略---

上記のハイライト部によって、以下の制御が行われます。

  • 「MFAが設定されていなければ」(13-15行目)
  • 「特定のアクション以外は」(4行目)
  • 「禁止する」(3行目)

特定のアクション」はポリシー例によって微妙に異なりますが、MFAの設定を行う上で必要になるものが羅列されています。

iam:ChangePasswordがここに含まれていないことが事象の原因となります。

ユーザー自身によるパスワードのリセット

IAM ユーザーを新規作成する際に[ パスワードのリセットが必要 ] を有効化するかどうかを選択できます。

IAMPassword

ここを有効化したユーザーを作成し、使用者に引き渡したとします。

当該ユーザーが初回のサインインを試みた場合、パスワード認証後すぐに以下のページに遷移します。

IAMSignin

ここではパスワードの変更が求められます。新しいパスワードを指定して先に進もうとすると、以下のエラーが発生します。

ユーザーに iam:ChangePassword を実行する権限がないか、入力されたパスワードが管理者によって設定されたアカウントパスワードポリシーに準拠していません

IAMChangepassword

このパスワード変更を行うのはログイン直後のため、当然この時点では MFA は未設定です。 MFA 強制ポリシーでiam:ChangePasswordが Deny の NotAction に含まれていない場合に、上記の事象に直面するというわけです。

(ちなみに「ポリシー設定は適切だがアカウントのパスワードポリシーに則っていない」という場合にも同じエラーメッセージが出ます。メッセージからは切り分けできないのが少し辛いところです。)

iam:UpdateLoginProfile と iam:ChangePassword

余談ですが、 IAM ユーザーのパスワードを変更する際に呼び出されるアクションは2種類あります。

  • iam:UpdateLoginProfile
  • iam:ChangePassword

大まかには、前者は「IAM ユーザーの画面から対象ユーザーのパスワードを変更する」もの、後者は「専用画面から自分のパスワードを変更する」もの、と理解しておけばよいでしょう。

iam:UpdateLoginProfile

自分自身のパスワードを変更する場合でも、IAM ユーザーの画面から操作を行った場合には iam:UpdateLoginProfile が呼び出されます。

以下の画面が該当します。

IAMUPDATEPROFILE

IAMPROFILE

(新規ユーザー作成時だけでなくパスワード変更時にも「パスワードのリセットが必要」を指定できます。変更対象のユーザーが「MFA強制ポリシーがあたっている」「MFAが未設定」の場合、冒頭の事象と同じ事態に直面します。)

iam:ChangePassword

初回ログイン時に変更を行う場合に必要となるのは先述の通りですが、「マイセキュリティ資格情報」から変更を行う際にも iam:ChangePassword が呼び出されています。

IAMCREDENTIAL

IAMChangepassword-0710162

IAMChangePassword-0710193

この辺りの詳細は、以下エントリに詳しいです。

エラーの回避方法

最低限行わなけらばならないのは、Deny の対象からiam:ChangePasswordを除外することです。

先述のポリシーを例に取ると、以下のように NotAction のリストにiam:ChangePasswordを加えることで実現できます。

---略---
        {
            "Effect": "Deny",
            "NotAction": [
                "iam:CreateVirtualMFADevice",
                "iam:EnableMFADevice",
                "iam:ListMFADevices",
                "iam:ListUsers",
                "iam:ListVirtualMFADevices",
                "iam:ResyncMFADevice",
                "iam:ChangePassword"
            ],
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "aws:MultiFactorAuthPresent": "false"
                }
            }
---略---

IAM ユーザーにパスワードの変更を許可する

アカウントのパスワードポリシーによっては、追加で Allow のステートメントを定義する必要があります。

以下のパスワードポリシーで「ユーザーにパスワードの変更を許可する」が含まれていない場合、追加の設定が必要となります。

IAMPassword-1112978

以下のようなポリシーを追加でアタッチするか、 MFA 強制ポリシーの中にステートメントを追加する必要があります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iam:GetAccountPasswordPolicy",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "iam:ChangePassword",
      "Resource": "arn:aws:iam::<AWSアカウント番号>:user/${aws:username}"
    }
  ]
}

アカウントのパスワードポリシーを AWS CLI から確認する場合は以下のイメージです。

% aws iam get-account-password-policy
{
    "PasswordPolicy": {
        "MinimumPasswordLength": 8,
        "RequireSymbols": true,
        "RequireNumbers": true,
        "RequireUppercaseCharacters": true,
        "RequireLowercaseCharacters": true,
        "AllowUsersToChangePassword": true,
        "ExpirePasswords": false
    }
}

AllowUsersToChangePasswordが true になっていれば、明示的にiam:ChangePasswordの Allow を追加しなくとも、ユーザーはパスワードの変更を行えます。

終わりに

MFA 強制ポリシーを適用した際のハマりどころについてのご紹介でした。

私が普段検証に使用している環境は以下の構成となり、IAM ユーザー側に Deny を入れていないため、今回の事象が起こりうることをすっかり忘れていました。

  • IAM ユーザーには必要最小限の Allow を与える
    • MFA 設定や、パスワード変更、IAM の参照のみなど
  • 操作に必要な権限は IAM ロールに設定する
  • IAM ユーザーでログイン後、 IAM ロールを引き受けて(Assume Role)から操作する
  • IAM ロールの信頼ポリシーで「 MFA 設定がされていないと引き受け不可」という設定を入れておく

MFAForce2

どちらの構成が望ましいかは環境によるため一概に言えませんが、MFA 強制ポリシーを採用するケースは多々あるかと思います。

今回のような考慮事項が発生する、ことを頭の片隅に置いておきましょう。

以上、千葉(幸)がお送りしました。