Using a passphrase#

opensslコマンドラインユーティリティを使用して、パスフレーズでデータキーを保護できます。次に、この保護を設定する例を示します。

initdb -D datadir -y --key-wrap-command=openssl enc -e -aes-128-cbc -pbkdf2 -out "%p" --key-unwrap-command=openssl enc -d -aes-128-cbc -pbkdf2 -in "%p"

この例では、ランダムに生成されたデータキーinitdbによって内部的に実行を、AES-128-CBC AESKWアルゴリズムで暗号化することによりラップします。暗号化には、PBKDF2キー導出ファンクションを使用してパスフレーズから導出されたキーと、ランダムに生成されたソルトが使用されます。ターミナルはパスフレーズの入力を求めます。これらのオプションの詳細については、openssl-encのマニュアルページを参照してください。使用可能なオプションはバージョンによって異なります。 initdbユーティリティは、 %p をラップしたキーを保存するファイルの名前に置き換えます。

unwrapコマンドは、逆の操作を実行します。 initdbは、 unwrap操作を必要としません。ただし、それは初期化されたクラスターのpostgresql.conf ファイルに保存され、起動時に使用されます。

key Wrapコマンドは、標準入力でプレーンテキストキーを受け取り、 %p プレースホルダーで指定されたファイルシステムの場所にラップされたキーを配置する必要があります。 key unwrapコマンドは、 %p プレースホルダーで指定されたファイルシステムの場所からラップされたキーを読み取り、ラップされていないキーを標準出力に書き込む必要があります。

pg_rewindやpg_upgradeなどのユーティリティプログラムは、データディレクトリまたはバックアップなどのコピーを直接動作します。状況に応じて、これらのプログラムにkey unwrapコマンドについて伝える必要があります。これらにはそれぞれ、この目的のためのコマンドラインオプションがあります。

操作を簡素化するために、環境変数にキーwrapおよびunwrapコマンドを設定することもできます。これらは、対応するコマンドラインオプションを提供しない場合、影響を受けるすべてのアプリケーションで受け入れられます。例

PGDATAKEYWRAPCMD=openssl enc -e -aes-128-cbc -pbkdf2 -out "%p"
PGDATAKEYUNWRAPCMD=openssl enc -d -aes-128-cbc -pbkdf2 -in "%p"
export PGDATAKEYWRAPCMD PGDATAKEYUNWRAPCMD

サーバーがpg_ctlまたはsystemdなどのサービスマネージャーを介して起動された場合、端末でパスワードの入力を求めるキーのラップ解除コマンドは機能しません。これらの環境では、サーバーはターミナルから切断されます。サーバー起動時に対話型パスワードプロンプトが必要な場合は、間接的なメカニズムを使用してパスワードを取得するより精巧な構成が必要です。

たとえば、systemdの場合、systemd-ask-password を使用できます。

PGDATAKEYWRAPCMD="bash -c openssl enc -e -aes-128-cbc -pbkdf2 -out %p -pass file:<(sudo systemd-ask-password --no-tty)"
PGDATAKEYUNWRAPCMD="bash -c openssl enc -d -aes-128-cbc -pbkdf2 -in %p -pass file:<(sudo systemd-ask-password --no-tty)"

/etc/sudoers のようなエントリーも必要です。

postgres ALL = NOPASSWD: /usr/bin/systemd-ask-password