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 を利用する際は、ログ出力などでパスワードが漏れることがないよう、お気をつけください。

参考