How does TDE encrypt data?
==========================

TDEは、データベースサーバーおよびバックアップストレージ上のオペレーティングシステムファイルのデータの不正な表示を防ぎます。データは、盗難または置き忘れられた場合、未承認のユーザーが理解できなくなります。

データの暗号化と復号化はデータベースによって管理され、アプリケーションの変更やクライアントドライバーの更新は必要ありません。

EDB Postgres Advanced ServerおよびEDB Postgres Extended
Serverは、データベースの外部のキー管理へのフックを提供します。これらのフックにより、単純なパスフレーズの暗号化/復号化、またはエンタープライズキー管理ソリューションとの統合が可能になります。詳細については、
:ref:`Securing the data encryption key <Securing the data encryption key>` を参照してください。

TDEはパフォーマンスにどのような影響を与えますか?
------------------------------------------------

TDEのパフォーマンスへのインパクトは低いです。詳細については、
`Transparent Data Encryption Impacts on EDB Postgres Advanced Server 15 <https://www.enterprisedb.com/blog/TDE-Postgres-Advanced-Server-15-Launch>`_ ブログを参照してください。

TDEはどのようにデータを暗号化しますか?
--------------------------------------

EDB
TDEは `OpenSSL <https://openssl-library.org/>`_ を使用して、AES暗号化アルゴリズムでデータファイルを暗号化します。
Windowsシステムでは、TDEは `OpenSSL 3 <https://docs.openssl.org/3.0/>`_  を使用します。
Linuxシステムでは、TDEはホストオペレーティングシステムにインストールされているOpenSSLバージョンを使用します。インストールされたバージョンを確認するには、\ ``openssl version``
を実行します。詳細については、 `OpenSSL documentation <https://docs.openssl.org/master/>`_ を参照してください。
OpenSSLコミュニティが提供していないカスタムビルドを使用している場合は、ベンダーのドキュメントを参照してください。

バージョン16以降、EDB
TDEは、Postgresクラスターの初期化中にAES-128およびAES-256暗号化アルゴリズムを選択するオプションを導入します。
AES-128とAES-256の選択は、パフォーマンスとセキュリティ要件のバランス次第です。
AES-128は、一般的にパフォーマンス効率と低消費電力が重要な環境に推奨され、ほとんどのアプリケーションに適しています。逆に、AES-256は、最高レベルのセキュリティが必要なシナリオ、多くの場合規制上の義務によって駆動される場合にお勧めします。

TDEは、データファイルの暗号化にAES-128-XTSまたはAES-256-XTSアルゴリズムを使用します。
XTSは、 *調整値* と呼ばれる2番目の値を使用して、暗号化を強化します。
TDEを使用したXTS調整値は、データベースOID、relfileノード、およびブロック番号を使用します。

ログ先行書き込みWALファイルの場合、TDEはAES-128-CTRまたはAES-256-CTRを使用し、WALのログシーケンス番号LSNをカウンタコンポーネントとして組み込みます。

ブロックによってアクセスされる一時ファイルも、AES-128-XTSまたはAES-256-XTSを使用して暗号化されます。他の一時ファイルは、AES-128-CBCまたはAES-256-CBCを使用して暗号化されます。

TDEではデータはどのようにディスクに保存されますか?
--------------------------------------------------

この例では、 ``tbfoo`` テーブルのデータが暗号化されます。
``pg_relation_filepath`` ファンクションは、\ ``tbfoo``
テーブルに対応するデータファイルを見つけます。

.. code:: sql

   insert into tbfoo values (abc,123);
   INSERT 0 1

   select pg_relation_filepath(tbfoo);

    pg_relation_filepath
   - ---------------------
    base/5/16416

データをgrepして文字を検索しても、何も返されません。最後の5行を表示すると、暗号化されたデータが返されます。

.. code:: shell

   $ hexdump -C 16416 | grep abc
   $

   $ hexdump -C 16416 | tail -5
   00001fc0  c8 0f 1d c8 9a 63 3d dc  7d 4e 68 98 b8 f2 5e 0a  |.....c=.}Nh...^.|
   00001fd0  9a eb 20 1d 59 ad be 94  6e fd d5 6e ed 0a 72 8c  |.. .Y...n..n..r.|
   00001fe0  7b 14 7f de 5b 63 e3 84  ba 6c e7 b0 a3 86 aa b9  |{...[c...l......|
   00001ff0  fe 4f 07 50 06 b7 ef 6a  cd f9 84 96 b2 4b 25 12  |.O.P...j.....K%.|
   00002000
