AWSのパスワード生成APIを触ってみた
AWS REST API にパスワードを生成する API secretsmanager:GetRandomPassword がいつのまにやら追加されていました。
$ aws secretsmanager get-random-password { "RandomPassword": "h}';Ih+J46RLy&:{zH]0sHw7lU;}f<.>" }
本来は AWS Secrets Manager でパスワードを定期変更する処理のために存在する模様ですが、汎用的な「パスワード生成 as a Service」としても使えるかと思います。
さっそく触ってみました。
使い方
API は secretsmanager:GetRandomPassword
です。
- 長さ(
PasswordLength
) - 含める文字の種類(IncludeXXX/ExcludeXXX/
RequireEachIncludedType
) - 除外する文字(
ExcludeCharacters
)
をオプションで指定します。
タイプ一覧
パスワードには以下のタイプを含めることができます。
タイプ | 具体例 | デフォルト | 除外オプション | 包含オプション |
---|---|---|---|---|
小文字アルファベット | a-z | 取りうる | ExcludeLowercase | N.A. |
大文字アルファベット | A-Z | 取りうる | ExcludeUppercase | N.A. |
数字 | 0-9 | 取りうる | ExcludeNumbers | N.A. |
句読点 | ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ |
取りうる | ExcludePunctuation | N.A. |
スペース | 半角スペース | 取りえない | N.A. | IncludeSpace |
デフォルトでは半角スペースはパスワードに含まれないようになっています。
デフォルトのパスワード生成
$ aws secretsmanager get-random-password { "RandomPassword": "h}';Ih+J46RLy&:{zH]0sHw7lU;}f<.>" }
パスワードの長さはデフォルトで32文字です。
タイプ一覧の表の通り
- 小文字/大文字アルファベット
- 数字
- 句読点
から構成される 32 文字のパスワードが生成されます。
パスワードの長さを制御
パスワードの長さを変更したい場合、PasswordLength
オプションを渡します。
$ aws secretsmanager get-random-password \ --password-length 10 { "RandomPassword": "X)/G#4;kh|" }
デフォルトは 32 で、1から4096までの値を指定可能です。
パスワードに利用するタイプを制御
パスワードに特定のタイプを除外・包含したい場合、IncludeXXX/ExcludeXXX
オプションを渡します。
例えば、
- 句読点を除外(
--exclude-punctuation
) - スペースを包含(
--include-space
)
する場合、次の様になります。
$ aws secretsmanager get-random-password \ --exclude-punctuation \ --include-space { "RandomPassword": "TzWD8Wotqdy x1EKAhNQXhbjyZSnuf V" }
RandomPassword
から句読点が除外され、一方で、半角スペースが含まれています。
特定の文字を除外
特定の文字を除外したい場合 ExcludeCharacters
オプションで除外する文字を列挙します。
例えば、 SecretsManager の RDS 向けパスワードローテート用 Lambda 関数では
- / (スラッシュ)
- @ (アットマーク)
- ' (シングルクオート)
- " (ダブルクオート)
- \ (バックスラッシュ)
を除外していました。
$ aws secretsmanager get-random-password \ --exclude-characters /@\"\'\\ { "RandomPassword": "L&F!h&+-Lle6C%gl`^qeN|4+D(idtkct" }
大文字・小文字・数字を必ず含める
パスワードポリシーによっては「大文字・小文字・数字をそれぞれ1文字以上含めること」のようなパスワードが要求されることがあります。
このような仕様は RequireEachIncludedType
オプションで制御します。
デフォルトでこのプションは True です。
$ aws secretsmanager get-random-password \ --password-length 4 { "RandomPassword": "Oo[1" } $ aws secretsmanager get-random-password \ --password-length 4 \ --require-each-included-type # 明示的に True にする { "RandomPassword": "7@mU" }
デフォルトで有効な各タイプ
- 小文字アルファベット
- 大文字アルファベット
- 数字
- 句読点
が必ず1文字は含まれていることがわかります。
大文字・小文字・数字のみから構成され、それぞれが必ず1文字は含む16文字のパスワードの場合
$ aws secretsmanager get-random-password \ --exclude-punctuation \ --require-each-included-type \ --password-length 16 { "RandomPassword": "1A2cBpMTGuxyA25X" }
というようになります。
デフォルトで包含するようになっている句読点を除外(--exclude-punctuation
)しています。
RequireEachIncludedType
フラグを倒してみます。
$ aws secretsmanager get-random-password \ --password-length 4 \ --no-require-each-included-type { "RandomPassword": "3WPM" }
- 大文字アルファベット
- 数字
しか含まれていません。
最後に
AWS Secrets Manager にひっそりと存在するパスワード生成 API secretsmanager:GetRandomPassword
の使い方を紹介しました。
OS やプログラミング言語への依存を排除したい方には念願の API ではないでしょうか。
なお、この API を利用する際は、ログ出力などでパスワードが漏れることがないよう、お気をつけください。