IAMユーザにパスワード変更を許可するアクション ~ChangePasswordとUpdateLoginProfileの違い~

個々のIAMユーザに自分のパスワードのみを変更させるIAMポリシーを設定しようとしました。その過程でiam:ChangePasswordのアクションとiam:UpdateLoginProfileのアクションで混乱してしまったので、その違いをまとめてみたいと思います。
2019.08.31

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

はじめに

清水です。個々のIAMユーザに自分のパスワードのみを変更させるIAMポリシーを設定しようとしました。その過程で、iam:ChangePasswordのアクションとiam:UpdateLoginProfileのアクションで混乱してしまったので、その違いをまとめてみたいと思います。

ChangePasswordとUpdateLoginProfile

IAMに対する操作権限を持たせないIAMユーザ(例えばPowerUserAccessや、ReadOnlyAccess相当など)に対して、自分の認証情報を管理させる、というパターンがあるかと思います。IAMのパスワードだったり、アクセスキーだったり、MFAも自分で管理してもらうと良さそうですね。今回この設定を行うために、IAMポリシー内容について確認していました。確認したAWSのドキュメントは下記です。

特にIAMユーザが自身のパスワードを変更する場合には、iam:ChangePasswordを使えば良さそうです。そういえばAWSマネジメントコンソールから確認できるAWS管理ポリシーにも、IAMUserChangePasswordというものがありました。

あわせて、以前iam:UpdateLoginProfileというアクションを設定したことがあったことを思い出しました。先のAWSドキュメントのページにも、以下の一文が記載されています。

また、ユーザーが自分のユーザーページで自分のパスワードを変更することはできません。これを許可するには、iam:CreateLoginProfile、iam:DeleteLoginProfile、iam:GetLoginProfile、および iam:UpdateLoginProfile アクションを AllowManageOwnPasswords ステートメントに追加します。 https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_aws_my-sec-creds-self-manage.html

……、パスワードを変更するためのアクション、iam:ChangePasswordiam:UpdateLoginProfileで、どのような違いがあるのかで混乱していしまいました。ざっと本Dev.IOを調べてみて、両方のキーワードを確認できたのは以下のエントリです。

こちらのエントリでも、ReadOnlyの(つまりIAMに対する操作権限を持っていない)ユーザにパスワード変更を許可する設定をしているのですが、iam:ChagePasswordiam:UpdateLoginProfileは両方有効または両方無効の状態で確認しており、私の2つのアクションを区別したい、という願望は叶いませんでした……。

ということで、ここは深追いして調べていくしかありません!

APIを確認してみる

iam:ChagePasswrodiam:UpdateLoginProfileの違いを確認するために、まずはAPIまわりの情報を参照してみました。あわせてAWS CLIの該当するコマンド(API名と概ね一致)についても確認しています。以下、それぞれ参照したページです。

IAMユーザが自分のパスワードを変更する場合にはChangePassword、異なるユーザのパスワードを変更する場合にはUpdateLoginProfileというような使い分けのようです……(とはいえ、先ほどのAWSドキュメントの一文も踏まえると、正直スッキリしていません……)

APIの使い方としての違いは、ChangePasswordNewPasswordOldPasswordがパラメータとして必要。対してUpdateLoginProfileについては、PasswordUserNameが必要とのことでした。ここは明確な違いですね。

AWSマネジメントコンソールでどうやってパスワードを変更する?

APIを確認しつつ、AWSマネジメントコンソールでのパスワード変更方法についても確認してみました。まず1つ目、私は先にこちらを思い浮かべました。IAMのマネジメントコンソールの画面、ユーザの一覧から自分のページを開き、認証情報タブのコンソールのパスワードから変更するものです。

URLだと下記になります。

https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/users/IAM-USER-NAME?section=security_credentials

そしてもう一つは、AWSマネジメントコンソールの右上のヘッダー部分、IAMユーザ情報(リージョン選択部分の左)をクリックして選択できるメニューの「マイセキュリティ資格情報」から変更する方法です。

URLとしては以下に遷移します。

https://console.aws.amazon.com/iam/home?region=ap-northeast-1#/security_credentials

AWS IAM 認証情報のタブの「パスワード変更」ボタンからパスワード変更ができます。

便宜上、前者を「IAMの画面からのパスワード変更」、後者を「メニューの右上からのパスワード変更」と呼ぶことにします。IAMの画面からのパスワード変更では設定するパスワードのみを入力したのに対して、メニューの右上からのパスワード変更では現在のパスワード(変更前の古いパスワード)と新しいパスワードを入力する必要がありました。これは何やらAPIの使い方と一致してそうですね、IAMの画面からのパスワード変更はUpdateLoginProfile、メニューの右上からのパスワード変更はChagePasswordを呼び出しているのではないかという推測ができました。

それぞれの権限を持たせたユーザでの検証

AWSマネジメントコンソールのパスワード変更画面の違いによって、呼び出しているAPIも異なるのでは、という仮説ができました。これが実際のところどうなのか、確認してみたいと思います。

検証方法

  • 以下のuser-cuser-uをそれぞれ準備
  • IAMの画面から、メニューの右上の画面から、それぞれパスワード変更を試行
  • AllowUsersToChangePasswordの値についてもfalse/trueのそれぞれを試行

ユーザについて

user-c

AWS 管理ポリシーの「ReadOnlyAccess」に加え、以下の内容のインラインポリシーをアタッチ。(自分自身に対してiam:ChangePasswordを許可)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:ChangePassword"
            ],
            "Resource": [
                "arn:aws:iam::123456789012:user/${aws:username}"
            ]
        }
    ]
}
user-u

AWS 管理ポリシーの「ReadOnlyAccess」に加え、以下の内容のインラインポリシーをアタッチ。(自分自身に対してiam:UpdateLoginProfileを許可)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:UpdateLoginProfile"
            ],
            "Resource": [
                "arn:aws:iam::123456789012:user/${aws:username}"
            ]
        }
    ]
}

AllowUsersToChangePasswordについて

いきなり登場しましたこのAllowUsersToChangePasswordですが、AWSマネジメントコンソールのIAM画面、アカウント設定のパスワードポリシーの項目で設定できる「ユーザにパスワードの変更を許可」の項目となります。チェックが付いている(つまりユーザにパスワードの変更を許可している)状態であればtrue、チェックがついてなければfalseとなります。

これはAWS CLIのaws iam get-account-password-policyで確認もできますね。

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

なぜこのAllowUsersToChangePasswordがいきなり出てきたかは……、次の検証結果の欄にまとめます!

検証結果

ユーザー 変更画面 AllowUsersToChangePassword
false true
user-c IAMの画面から パスワード変更できない パスワード変更できない
メニュー右上の画面から パスワード変更できる パスワード変更できる
user-u IAMの画面から パスワード変更できる パスワード変更できる
メニュー右上の画面から パスワード変更できない パスワード変更できる

IAMの画面からのパスワード変更はUpdateLoginProfile、メニューの右上からのパスワード変更はChagePassword、それぞれのAPIを呼び出しているのではないか、という仮説でした。そのため、ChangePasswordの権限を持つuser-cではメニューの右上からパスワード変更が可能、IAMの画面ではパスワード変更が不可能、と検証前に考えていましたが、これは結果と合致しました。

続いてUpdateLoginProfileの権限を持つuse-uについて、use-cとは反対にメニューの右上からパスワード変更は不可能、IAMの画面ではパスワード変更が可能、と検証前に考えました。結果は表の通りで、IAMの画面からは変更可能、メニューの右上からのパスワード変更を行う場合、AllowUsersToChangePasswordの設定が影響することとなりました。AllowUserToChagePasswordtrueであれば、user-uつまりChangePasswordの権限を持たないユーザでもメニュー右上の画面からパスワード変更が可能、という具合ですね。

また合わせて、それぞれのユーザでIAMの画面、メニュー右上の画面からパスワード変更した際の、CloudTrailのAPI呼び出しについても確認しました。以下は抜粋となりますが、まずはuse-cでIAMの画面からパスワード変更を試行した場合です。以下のようにUpdateLoginProfileが呼び出され、AccessDeniedが記録されていました。(そして、パスワード変更もできませんでした。)

続いて同様のことをuser-uで行った場合です。こちらはAPI呼び出しが成功しています。(パスワードも変更できました。)

こちらはuser-uでメニュー右上の画面からパスワード変更を試行した場合の、AllowUsersToChagePasswordfalseの場合の結果です。ChagePasswordのAPIに対してAccessDeniedが記録されていました。(パスワード変更もできませんでした。)

まとめ

検証結果ならびにCloudTrailのAPI呼び出しも踏まえまして、IAMの画面からパスワードを変更する場合はUpdateLoginProfileを呼び出している、またメニュー右上の画面からパスワードを変更する場合はChangePasswordを呼び出していことが確認できました。

この各パスワード変更画面を確認すると、IAMの画面についてはパスワードを変更するよりも再設定している、といえます。またこの再設定にUpdateLoginProfileを使用しており、APIとしてUserNameと(新しい)Passwordを必要としています。対してメニューの右上からのパスワード変更は、まさに変更を行っておりChagePasswordを用いています。APIとしてOldPasswordNewPasswordを必要な点、画面のUIとも一致しますね。

またパスワードポリシーで「ユーザにパスワードの変更を許可」つまりAllowUserToChagePasswordが有効になっていれば、IAMポリシーとしてChagePasswordが明示的に許可されていなくてもChagePasswordを実行することができました。

いろいろと長くなりましたが、私なりの解釈としては、IAMユーザにパスワードを更新させる操作と再設定させる操作があり、更新についてはChagePasswrod再設定についてはUpdateLoginProfileを使う、と捉えています。さらに言えば、場合によっては個々のIAMユーザにはChangePasswordの権限のみで十分であり、自分に対してもUpdateLoginProfileをしなくてもよいのかな、とも考えられました。もちろんUpdateLoginProfileの権限を持っておりかつアクセスキーを有していれば、パスワードを忘れてしまった、などの場合にCLIやSDKベースで自分で再設定が可能になるかと思います。ただ、開きっぱなしのAWSマネジメントコンソールから、現パスワードを知らない誰かが新パスワードを設定してしまう、というケースも起こりうるのかな、などと思いました。

いずれにせよ、混乱してしまっていたiam:ChagePasswordiam:UpdateLoginProfileの違いがハッキリしたのでスッキリしました!アドバイスをくれた同僚にも感謝です!!