PostgreSQL データベースの暗号化

Bilal Shahid 2023年6月20日
  1. 暗号化の概要
  2. PostgreSQL データベースの暗号化
PostgreSQL データベースの暗号化

このチュートリアルでは、PostgreSQL でデータを暗号化するために選択できるさまざまな方法について説明します。

暗号化の概要

簡単に言えば、暗号化はデータを保護する方法です。 内容を隠蔽し、意図したユーザー以外が読めないようにするために体系的に変更されています。

意図した受信者だけがデータを解読して読み取るためのを持っている可能性があります。 その結果、機密情報は常に隠されます。

すべての場合にデータを暗号化することをお勧めします。 ただし、セキュリティで保護されていないサーバーで機密情報が送受信されている場合、またはデータが脅かされているその他の状況では重要です。

PostgreSQL データベースの暗号化

データベースは、要件に応じて 3つの異なるレイヤーで暗号化できます。 以下が含まれます。

  • クライアント アプリケーション
  • ストレージデバイス
  • データベース自体

自己データベース暗号化は、ほとんどの脅威モデルをカバーすることが知られているため、多くの場合、暗号化の最良の形式であることに注意してください。

他の方法を適用することもできますが、主な目標はクライアント アプリケーションを保護することです。 そこで、PostgreSQL でデータを暗号化するために選択できるいくつかのアプローチを以下に示します。

システムディスクの暗号化

名前が示すように、システム ディスク暗号化は、ディスク暗号化ソフトウェア/ハードウェアがディスクに保存されるデータのすべてのビットを暗号化するプロセスです。

これは、ソフトウェアまたはハードウェアが同時に暗号化するようにプログラムされている場合、ユーザーのデータが作成されるとすぐに暗号化できることを意味します。

ディスクが暗号化されているため、PostgreSQL の設定を変更する必要はありません。 システム ディスクの暗号化を実行する簡単な方法は、Linux で VM を使用することです。

必要な作業は次のとおりです。

まず、ターゲット マシンの複製となる一時的な VM を作成します。 ターゲット ディスクは既存のものでもかまいませんが、新しいディスクを作成して後でデータベースを追加することをお勧めします。

決定に関係なく、ターゲット ディスクはソース ディスクよりも少なくとも 256MB 大きい必要があります。 次に、以下の指示に従うことができます。

  1. ターゲット ディスクとソース ディスクを一時的な VM にマウントする必要があります。

  2. VM をシリアルポート経由で接続します。 この手順を実行するには、シリアル ポート接続を有効にする必要があります。 メタデータの下に値 TRUE を指定して serial-port-enable を追加すると、シリアル ポート接続を許可できます。

  3. 次に、grub をアクセス可能にする必要があります。 これを行うには、次のコマンドを使用します。

    grub2-mkconfig -o/boot/grub2/grub.cfg
    

    この後、システムを再起動すると、シリアル コンソールで grub にアクセスできるようになります。

  4. ディスクをフォーマットして、暗号化されていない (ブート) および暗号化されたシステムを作成します。 システムがgrubを起動できるようにするため、ユーザーはキーを入力してデータを復号化できます。

    fdisk /dev/sdb コマンドを使用して実行できます。

  5. cryptsetup を使用してディスクを暗号化します。 暗号化するディスクの特定の部分をマップすることもできます。 次に、データベースがこのディスク上に存在する限り、データベースを暗号化できます。

この後、ディスクのサイズ変更やバックアップの作成などの追加の手順を実行できます。

透過的なデータ暗号化

PostgreSQL TDE は、ユーザーがクラスター暗号化を使用してデータベース全体に対して PostgreSQL 暗号化を実行できるようにする機能です。 ディスクへの書き込み中に暗号化し、ディスクからの読み取り中に復号化します。

これをデフォルトで適用するには、PostgreSQL のインストール中に次の手順を実行できます。

  • PostgreSQL 用のディレクトリを作成します。 多くの場合、デフォルトの場所が使用されます。
  • bisonreadlineflexzlibopenssl、および crypto のライブラリをインストールする必要があります。 必要に応じて、追加のライブラリをインストールできます。
  • システムに PostgreSQL をインストールします。
  • su - postgres を使用して postgres ユーザーに切り替えます。
  • -K を使用して暗号化されたクラスターを作成します。

    たとえば、 initdb -D /user/pgsql/xyz -K/user/pgsql/key. ここで、 user/pgsql/key は暗号化キーを返します。

  • initdbpostgresql.conf に暗号化の key コマンドを格納します。

クラスターが正常に作成され、データが暗号化されます。 ユーザーが Postgres を実行すると、これらの暗号化されたクラスターは暗号化されていないクラスターと同じになります。

唯一の違いは、データ暗号化変数が設定されることです。

データベースの特定のセクションの暗号化

上記の方法で、データベース全体または PostgreSQL 上のすべてのデータベースが暗号化されます。 ただし、個々のデータベースやデータベースの特定の部分を暗号化することもできます。

これを実現するには、pgcrypto などの拡張機能を使用することをお勧めします。 pgcrypto を使用した選択的な Postgres 暗号化の仕組みは次のとおりです。

  1. CREATE EXTENSION IF NOT EXISTS pgcrypto を使用して pgcrypto 拡張機能を有効にします。
  2. 通常、PGP_SYM_ENCRYPT コマンドはデータを暗号化し、PGP_SYM_DECRYPT はデータを復号化します。

PostgreSQL で列を暗号化および復号化する方法は次のとおりです。

暗号化されたデータを列に挿入する

INSERT INTO temp (x, y)
VALUES
('xx', PGP_SYM_ENCRYPT('yy', 'key')::text);

すでに暗号化されているデータを更新する

UPDATE temp
SET y= PGP_SYM_ENCRYPT('content', 'key')::text
WHERE x= 'xx';

読み取るデータを復号化する

SELECT x, PGP_SYM_DECRYPT(y::bytea, 'key') as data
FROM temp WHERE x= 'xx';

これは、要件に応じてデータベースを暗号化するさまざまな方法のいくつかをまとめたものです。 PostgreSQL の暗号化は一見難しそうに見えますが、実行するのは非常に簡単です。

データが常に保護されるように、最適な暗号化サービスの種類を特定するお手伝いができれば幸いです。

著者: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub