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