
IAMユーザにパスワード変更を許可するアクション ~ChangePasswordとUpdateLoginProfileの違い~
この記事は公開されてから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:ChangePasswordとiam:UpdateLoginProfileで、どのような違いがあるのかで混乱していしまいました。ざっと本Dev.IOを調べてみて、両方のキーワードを確認できたのは以下のエントリです。
こちらのエントリでも、ReadOnlyの(つまりIAMに対する操作権限を持っていない)ユーザにパスワード変更を許可する設定をしているのですが、iam:ChagePasswordとiam:UpdateLoginProfileは両方有効または両方無効の状態で確認しており、私の2つのアクションを区別したい、という願望は叶いませんでした……。
ということで、ここは深追いして調べていくしかありません!
APIを確認してみる
iam:ChagePasswrodとiam:UpdateLoginProfileの違いを確認するために、まずはAPIまわりの情報を参照してみました。あわせてAWS CLIの該当するコマンド(API名と概ね一致)についても確認しています。以下、それぞれ参照したページです。
- ChangePassword
- ChangePassword - AWS Identity and Access Management
- change-password — AWS CLI 1.16.228 Command Reference
- UpdateLoginProfile
- UpdateLoginProfile - AWS Identity and Access Management
- update-login-profile — AWS CLI 1.16.228 Command Reference
IAMユーザが自分のパスワードを変更する場合にはChangePassword、異なるユーザのパスワードを変更する場合にはUpdateLoginProfileというような使い分けのようです……(とはいえ、先ほどのAWSドキュメントの一文も踏まえると、正直スッキリしていません……)
APIの使い方としての違いは、ChangePasswordはNewPasswordとOldPasswordがパラメータとして必要。対してUpdateLoginProfileについては、PasswordとUserNameが必要とのことでした。ここは明確な違いですね。
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-cとuser-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の設定が影響することとなりました。AllowUserToChagePasswordがtrueであれば、user-uつまりChangePasswordの権限を持たないユーザでもメニュー右上の画面からパスワード変更が可能、という具合ですね。
また合わせて、それぞれのユーザでIAMの画面、メニュー右上の画面からパスワード変更した際の、CloudTrailのAPI呼び出しについても確認しました。以下は抜粋となりますが、まずはuse-cでIAMの画面からパスワード変更を試行した場合です。以下のようにUpdateLoginProfileが呼び出され、AccessDeniedが記録されていました。(そして、パスワード変更もできませんでした。)

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

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

まとめ
検証結果ならびにCloudTrailのAPI呼び出しも踏まえまして、IAMの画面からパスワードを変更する場合はUpdateLoginProfileを呼び出している、またメニュー右上の画面からパスワードを変更する場合はChangePasswordを呼び出していことが確認できました。
この各パスワード変更画面を確認すると、IAMの画面についてはパスワードを変更するよりも再設定している、といえます。またこの再設定にUpdateLoginProfileを使用しており、APIとしてUserNameと(新しい)Passwordを必要としています。対してメニューの右上からのパスワード変更は、まさに変更を行っておりChagePasswordを用いています。APIとしてOldPasswordとNewPasswordを必要な点、画面のUIとも一致しますね。
またパスワードポリシーで「ユーザにパスワードの変更を許可」つまりAllowUserToChagePasswordが有効になっていれば、IAMポリシーとしてChagePasswordが明示的に許可されていなくてもChagePasswordを実行することができました。
いろいろと長くなりましたが、私なりの解釈としては、IAMユーザにパスワードを更新させる操作と再設定させる操作があり、更新についてはChagePasswrod、再設定についてはUpdateLoginProfileを使う、と捉えています。さらに言えば、場合によっては個々のIAMユーザにはChangePasswordの権限のみで十分であり、自分に対してもUpdateLoginProfileをしなくてもよいのかな、とも考えられました。もちろんUpdateLoginProfileの権限を持っておりかつアクセスキーを有していれば、パスワードを忘れてしまった、などの場合にCLIやSDKベースで自分で再設定が可能になるかと思います。ただ、開きっぱなしのAWSマネジメントコンソールから、現パスワードを知らない誰かが新パスワードを設定してしまう、というケースも起こりうるのかな、などと思いました。
いずれにせよ、混乱してしまっていたiam:ChagePasswordとiam:UpdateLoginProfileの違いがハッキリしたのでスッキリしました!アドバイスをくれた同僚にも感謝です!!






