この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
AWS IAMにはユーザーアカウントのパスワードをセキュアに管理するためにパスワードの複雑性や有効期限などを細かく制御するパスワードポリシーの機能が備わっています。
今回は、このパスワードポリシーをCLIから操作する方法を紹介します。
パスワードポリシーはAWSアカウントごとに設定するため、複数のAWSアカウントのパスワードポリシーをまとめて設定するようなケースでは、マネジメントコンソール経由よりは、SDK/CLI経由のほうが利便性が高いです。
AWS IAM のパスワードポリシーについて
AWS IAM パスワードポリシーの一般論については過去の次のブログを参照下さい。
ポリシーには大きく分けて、以下が存在します。
- パスワードの複雑さ
- パスワードの長さパスワードに利用可能な文字の種類(大文字・小文字・英数字・記号)などが該当します
- パスワードの有効期限
- パスワードの有効期間や再利用可能性などが該当します。
- パスワード変更権限
- ユーザー自身がパスワードを変更出来るのか、などが該当します。
マネジメントコンソールでは、IAM → アカウント設定 と遷移すると、 パスワードポリシーの画面に移動します。
実際の画面は次のようになっています。
マネジメントコンソールからは、チェックボックスを変更して「パスワードポリシーの適用」をクリックするだけで、特に悩む箇所はないかと思います。
IAM パスワードポリシーのAPIについて
このパスワードポリシーを操作する API は IAM サービス配下に以下の3種類が存在します。
- 取得
- 作成または変更
- 削除
これら API について順に解説します。
ポリシーとAPIパラメーターの対応
まずは各ポリシーについて、マネジメントコンソールでの表記とAPIでのパラメーターを整理します
マネジメントコンソール(日本語) | マネジメントコンソール(英語) | APIパラメーター | デフォルト値 | 備考 |
パスワードの最小長 | Minimum password length | MinimumPasswordLength | 6 | 6から128まで指定可能 |
少なくとも 1 つの大文字が必要 | Require at least one uppercase letter | RequireUppercaseCharacters | false | |
少なくとも 1 つの小文字が必要 | Require at least one lowercase letter | RequireLowercaseCharacters | false | |
少なくとも 1 つの数字が必要 | Require at least one number | RequireNumbers | false | |
少なくとも 1 つの英数字以外の文字が必要 | Require at least one nonalphanumeric character | RequireSymbols | false | 記号は「! @ # $ % ^ & * ( ) _ + - = [ ] { } | '」の中から利用可能 |
ユーザーにパスワードの変更を許可 | Allow users to change their own password | AllowUsersToChangePassword | false | |
パスワードの失効を許可 | Enable password expiration | N/A | N/A | |
パスワードの有効期間(日数) | Password expiration period (in days) | MaxPasswordAge | 0 | デフォルトの「0」の場合はパスワードは無効にならない。1から1095の間の数字外指定されると、指定日数後にパスワードが無効になる。 |
パスワードの再利用を禁止 | Prevent password reuse | N/A | N/A | |
記憶するパスワードの数 | Number of passwords to remember | PasswordReusePrevention | 0 | 1から24の間の数字が指定された場合のみ機能する |
パスワードの有効期限で管理者のリセットが必要 | Password expiration requires administrator reset | HardExpiry | false |
パスワードポリシーの設定
パスワードポリシーは一括更新だけに対応し、ポリシーの一部だけを変更することはできません。 指定しなかったポリシーはデフォルト値に戻ります。
API
- AWS API : http://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountPasswordPolicy.html
- AWS CLI : http://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html
使ってみる
パラメーター全部盛りでパスワードポリシーを作成してみます。 各パラメーターはオプショナルのため、抜き差し可能です。
$ aws iam update-account-password-policy \
--minimum-password-length 6 \
--require-symbols \
--require-numbers \
--require-uppercase-characters \
--require-lowercase-characters \
--allow-users-to-change-password \
--max-password-age 1000 \
--password-reuse-prevention 3 \
--hard-expiry
$ aws iam get-account-password-policy
{
"PasswordPolicy": {
"AllowUsersToChangePassword": true,
"RequireLowercaseCharacters": true,
"RequireUppercaseCharacters": true,
"MinimumPasswordLength": 6,
"RequireNumbers": true,
"PasswordReusePrevention": 3,
"HardExpiry": true,
"RequireSymbols": true,
"MaxPasswordAge": 1000,
"ExpirePasswords": true
}
}
使ってみる(デフォルト値)
この update API は部分更新はできず、指定しなかった値はデフォルト値に戻る仕様です。
This action does not support partial updates. No parameters are required, but if you do not specify a parameter, that parameter's value reverts to its default value. http://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html
実際に動作を確認してみましょう。
ユーザーにパスワードの変更を許可するポリシー(--allow-users-to-change-password)だけ渡します。
$ aws iam update-account-password-policy --allow-users-to-change-password
$ aws iam get-account-password-policy
{
"PasswordPolicy": {
"AllowUsersToChangePassword": true,
"RequireLowercaseCharacters": false,
"RequireUppercaseCharacters": false,
"MinimumPasswordLength": 6,
"RequireNumbers": false,
"RequireSymbols": false,
"ExpirePasswords": false
}
}
パラメーターで指定しなかったもろもろのポリシーがデフォルトに戻り、例えばパスワードの最小長(MinimumPasswordLength)は6に変更されているのがわかります。
使ってみる(CLIのskeleton機能)
AWS CLIにはAPIをJSON形式で渡す機能があります。
リクエスト時に利用するJSONを生成する --generate-cli-skeleton
と、リクエスト時にJSONデータを渡す --cli-input-json
で構成されます。ポリシーをJSONファイルでソースコード管理しておくと、差分を簡単に終えます。
この機能でパスワードポリシーを変更してみましょう。
まずはJSONのスケルトンを生成します。
$ aws iam update-account-password-policy --generate-cli-skeleton | tee policy.json
{
"MinimumPasswordLength": 0,
"RequireSymbols": true,
"RequireNumbers": true,
"RequireUppercaseCharacters": true,
"RequireLowercaseCharacters": true,
"AllowUsersToChangePassword": true,
"MaxPasswordAge": 0,
"PasswordReusePrevention": 0,
"HardExpiry": true
}
このJSONファイルを修正して実際に更新します。
$ cat policy.json
{
"MinimumPasswordLength": 16,
"AllowUsersToChangePassword": true,
"MaxPasswordAge": 1000,
"PasswordReusePrevention": 3
}
$ aws iam update-account-password-policy --cli-input-json file://policy.json
$ aws iam get-account-password-policy
{
"PasswordPolicy": {
"AllowUsersToChangePassword": true,
"RequireLowercaseCharacters": false,
"RequireUppercaseCharacters": false,
"MinimumPasswordLength": 16,
"RequireNumbers": false,
"PasswordReusePrevention": 3,
"RequireSymbols": false,
"MaxPasswordAge": 1000,
"ExpirePasswords": true
}
}
無事変更できました。
パスワードポリシーを取得
AWS アカウントのパスワードポリシーを取得します。
API
- AWS API : http://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountPasswordPolicy.html
- AWS CLI : http://docs.aws.amazon.com/cli/latest/reference/iam/get-account-password-policy.html
使ってみる
パラメーターなしに API を呼び出すだけです。
パスワードポリシーが設定されていない状態でこの API を叩くと 404:NoSuchEntity
エラーが発生します。
デフォルトではパスワードポリシーは設定されていないので注意しましょう。
$ aws iam get-account-password-policy
An error occurred (NoSuchEntity) when calling the GetAccountPasswordPolicy operation: The Password Policy with domain name 123456789012 cannot be found.
また、パスワードポリシー内容によって、レスポンスエレメントが変わります。
たとえば、パスワード最小長とユーザー自身によるパスワード変更を許可したシンプルなポリシーのレスポンスが以下です。
$ aws iam get-account-password-policy
{
"PasswordPolicy": {
"AllowUsersToChangePassword": true,
"RequireLowercaseCharacters": false,
"RequireUppercaseCharacters": false,
"MinimumPasswordLength": 8,
"RequireNumbers": false,
"RequireSymbols": false,
"ExpirePasswords": false
}
}
パスワードポリシーでパスワードの有効期限や再利用も設定すると、レスポンスエレメントが増えます。
$ aws iam get-account-password-policy
{
"PasswordPolicy": {
"AllowUsersToChangePassword": true,
"RequireLowercaseCharacters": false,
"RequireUppercaseCharacters": false,
"MinimumPasswordLength": 8,
"RequireNumbers": false,
"PasswordReusePrevention": 3, // 記憶するパスワードの数:
"HardExpiry": true, // パスワードの有効期限で管理者のリセットが必要
"RequireSymbols": false,
"MaxPasswordAge": 1000, // パスワードの有効期間(日数)
"ExpirePasswords": true // パスワードの失効を許可
}
}
削除
AWS アカウントのパスワードポリシーを取得します。
API
- AWS API : http://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountPasswordPolicy.html
- AWS CLI : http://docs.aws.amazon.com/cli/latest/reference/iam/get-account-password-policy.html
使ってみる
パラメーターなしに API を呼び出すだけです。
$ aws iam delete-account-password-policy
$ aws iam get-account-password-policy
An error occurred (NoSuchEntity) when calling the GetAccountPasswordPolicy operation: The Password Policy with domain name 205974338614 cannot be found.
パスワードポリシーが設定されていない場合は、404:NoSuchEntity
エラーが発生します。
$ aws iam delete-account-password-policy
An error occurred (NoSuchEntity) when calling the DeleteAccountPasswordPolicy operation: The account policy with name PasswordPolicy cannot be found.
既存パスワードへの影響
パスワードポリシーを変更すると、設定済みのパスワードはどのように影響を受けるのでしょうか?ドキュメントから引用します。
パスワードポリシーを作成または変更する場合、パスワードポリシーの設定の多くは、ユーザーが次回パスワードを変更するときに適用されます。ただし、一部の設定はすぐに適用されます。以下に例を示します。
・最小長と文字タイプの要件を設定すると、その設定はユーザーが次回パスワードを変更するときに適用されます。既存のパスワードが更新されたパスワードポリシーに従っていない場合でも、ユーザーは既存のパスワードの変更を強制されません。
・パスワードの有効期限を設定した場合、有効期限は直ちに適用されます。たとえば、パスワードの有効期限を 90 日に設定した場合、90 日以上前に設定したパスワードを現在使用しているすべての IAM ユーザーは、次回サインインするときにパスワードの変更を強制されます。
http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html
まとめ
AWS アカウントをセキュアに運用する上で非常に重要なIAMパスワードポリシーのCLIからの操作方法について紹介しました。
管理するAWSアカウント数が増えてくると、各AWSアカウントのマネジメントコンソールにログインして操作するのは非常に手間です。 SDK/CLI経由での操作手順も覚えておくと生産性が上がります。
なお、利用者のリテラシーによって、パスワードポリシーの複雑さは良い方向にも・悪い方向にも機能することが様々な研究で報告されています。ポリシーを策定する前に、たとえば次のペーパーを一読することをお勧めします。
Password Guidance - Microsoft Research