Using a passphrase
==================

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

.. code:: shell

   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コマンドを設定することもできます。これらは、対応するコマンドラインオプションを提供しない場合、影響を受けるすべてのアプリケーションで受け入れられます。例

.. code:: shell

   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
