AWS IAMのパスワードポリシーをAWS CLIから操作する

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

はじめに

AWS IAMにはユーザーアカウントのパスワードをセキュアに管理するためにパスワードの複雑性や有効期限などを細かく制御するパスワードポリシーの機能が備わっています。

今回は、このパスワードポリシーをCLIから操作する方法を紹介します。

パスワードポリシーはAWSアカウントごとに設定するため、複数のAWSアカウントのパスワードポリシーをまとめて設定するようなケースでは、マネジメントコンソール経由よりは、SDK/CLI経由のほうが利便性が高いです。

AWS IAM のパスワードポリシーについて

AWS IAM パスワードポリシーの一般論については過去の次のブログを参照下さい。

AWSアカウントのパスワードポリシー

ポリシーには大きく分けて、以下が存在します。

  • パスワードの複雑さ
    • パスワードの長さパスワードに利用可能な文字の種類(大文字・小文字・英数字・記号)などが該当します
  • パスワードの有効期限
    • パスワードの有効期間や再利用可能性などが該当します。
  • パスワード変更権限
    • ユーザー自身がパスワードを変更出来るのか、などが該当します。

マネジメントコンソールでは、IAM → アカウント設定 と遷移すると、 パスワードポリシーの画面に移動します。

実際の画面は次のようになっています。

amc-iam-password-policy

マネジメントコンソールからは、チェックボックスを変更して「パスワードポリシーの適用」をクリックするだけで、特に悩む箇所はないかと思います。

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 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

使ってみる

パラメーターなしに 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

使ってみる

パラメーターなしに 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

参考