Creating a database cluster with TDE enabled
============================================

 `initdb <https://www.postgresql.org/docs/15/app-initdb.html>`_ を使用してデータベースクラスターを初期化するときに、透過的データの暗号化を有効にします。

initdb TDEオプションを使用する
------------------------------

暗号化を有効にするには、 ``initdb``
コマンドまたはそのフォールバック環境変数で次のオプションを使用します。

``-y, --data-encryption``

透過的なデータ暗号化を使用して新しいデータベースクラスターを初期化します。詳細については、
を参照してください。オプションでAESキー長を指定します。有効な値は128および256です。デフォルトは128です。

``--copy-key-from=<file>``

指定された場所からデータ暗号化キーをコピーします。
pg_upgradeのターゲットとして新しいクラスターを準備するときに、このオプションを使用して既存のクラスターからキーをコピーできます。
``--key-wrap-command=<command>``
生成されたデータの暗号化キーをラップする(暗号化する)コマンドを指定します。コマンドには、ラップされたキーを書き込むファイルを指定するプレースホルダー
``%p``
を含める必要があります。ラップ解除されたキーは、標準入力でコマンドに提供されます。このオプションを指定しない場合、環境変数\ ``PGDATAKEYWRAPCMD``
が使用されます。
キーラッピングコマンドを適用したくない場合は、特別な値\ ``-``
を使用します。
データ暗号化を使用している場合、このオプションまたは環境変数フォールバックを指定する必要があります。詳細については、
:ref:`Securing the data encryption key <Securing the data encryption key>` を参照してください。

``--key-unwrap-command=<command>``

データ暗号化キーのラップを解除するコマンドを指定します。コマンドには、ラップされたキーを読み取るファイルを指定するプレースホルダー
``%p``
を含める必要があります。コマンドは、ラップされていないキーを標準出力に書き込む必要があります。このオプションを指定しない場合、環境変数\ ``PGDATAKEYUNWRAPCMD``
が使用されます。
キーのラップ解除コマンドを適用したくない場合は、特別な値 ``-``
を使用します。
データ暗号化を使用している場合、このオプションまたは環境変数フォールバックを指定する必要があります。詳細については、
:ref:`Securing the data encryption key <Securing the data encryption key>` を参照してください。 ``--no-key-wrap``

キーラッピングを無効にします。データ暗号化キーは、代わりにデータディレクトリに平文で保存されます。
このオプションは、wrapコマンドとunwrapコマンドの両方を特別な値\ ``-``
に設定するためのショートカットです。

..  Note::
   このオプションの使用は安全ではありません。テスト目的でのみ使用してください。  データの暗号化を選択し、このオプションを指定しない場合、key Wrapおよびunwrapコマンドを提供する必要があります。それ以外の場合、`initdb` はエラーで終了します。

環境変数を使用する
------------------

操作を簡素化するために、環境変数にキーwrapおよびunwrapコマンドを設定できます。

例

.. code:: shell

   PGDATAKEYWRAPCMD=openssl enc -e -aes128-wrap -pbkdf2 -out "%p"
   PGDATAKEYUNWRAPCMD=openssl enc -d -aes128-wrap -pbkdf2 -in "%p"
   export PGDATAKEYWRAPCMD PGDATAKEYUNWRAPCMD

postgresql.confのkeyパラメーターの設定
--------------------------------------

クラスターでTDEを有効にすると、 ``initdb``
コマンドは\ ``postgresql.conf``
構成ファイルの\ ``data_encryption_key_unwrap_command``
パラメーターを初期化します。 ``data_encryption_key_unwrap_command``
で指定された文字列は、データ暗号化キーをラップ解除します復号化します。

コマンドには、プレースホルダー ``%p``
が含まれる必要があります。これは、ラップ解除するキーを含むファイルの名前に置き換えられます。コマンドは、ラップされていない復号化されたキーを標準出力に出力する必要があります。

このパラメーターを指定しない場合、環境変数\ ``PGDATAKEYUNWRAPCMD``
が使用されます。

キーのラップ解除コマンドを適用したくない場合は、特別な値 ``-``
を使用します。

データ暗号化を使用している場合、このパラメーターまたは環境変数フォールバックを指定する必要があります。詳細については、
:ref:`Securing the data encryption key <Securing the data encryption key>` を参照してください。

このパラメーターは、サーバーの起動時にのみ設定できます。

このパラメーターは、通常、\ ``initdb``
によって初期化されます。キーラップ方法を変更する場合にのみ変更します。

構成ファイルの詳細については、 `PostgreSQL File Locations documentation <https://www.postgresql.org/docs/15/runtime-config-file-locations.html>`_ を参照してください。

例
--

この例では、Linuxプラットフォームで実行されているEDB Postgres Advanced
Server 15を使用します。
opensslを使用してパスキーを定義し、生成されたデータ暗号化キーをラップおよびラップ解除します。

1. データ暗号化キーwrapと復号化unwrap環境変数を設定します。

edb_notranlate_1 ..  Note::
   Windowsを使用している場合、変数値を一重引用符で囲む必要はありません。

1. 暗号化を有効にした\ ``initdb``
   を使用してクラスターを初期化します。このコマンドは、
   postgresql.confファイルの\ ``data_encryption_key_unwrap_command``
   パラメーターを設定します。

.. code:: shell

      /usr/edb/as15/bin/initdb --data-encryption -D /var/lib/edb/as15/data 

1. クラスターを起動します。

.. code:: shell

      /usr/edb/as15/bin/pg_ctl -D /var/lib/edb/as15/data start

1. postgresql.confでgrepを実行して、\ ``data_encryption_key_unwrap_command``
   の設定を確認します。

.. code:: shell

      grep data_encryption_key_unwrap_command /var/lib/edb/as15/data/postgresql.conf
      __OUTPUT__
      data_encryption_key_unwrap_command = openssl enc -d -aes-128-cbc -pass pass:ok -in %p

SQLを使用したTDEの存在のチェック
--------------------------------

``pg_control_init`` テーブルの\ ``data_encryption_version``
列を照会することにより、サーバーにTDEが存在するかどうかを知ることができます。

値0は、TDEが有効になっていないことを意味します。ゼロ以外の値は、使用中のTDEのバージョンを反映しています。現在、TDEが有効になっている場合、この値は1です。

.. code:: sql

   select data_encryption_version from pg_control_init();
   __OUTPUT__
    data_encryption_version
   - ------------------------
                          1
   (1 row)
