IAMユーザにパスワード変更を許可するアクション ~ChangePasswordとUpdateLoginProfileの違い~
はじめに
清水です。個々の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
の違いがハッキリしたのでスッキリしました!アドバイスをくれた同僚にも感謝です!!