PostgreSQLは、複数レベルの暗号化を備え、データベースサーバ自身、管理者の注意不足、安全ではないネットワークを原因とした漏洩からデータを柔軟に保護することができます。 また、診療記録や財務業務など高セキュリティが求められるデータを格納する場合に暗号化が必要な場合もあります。
デフォルトでは、データベースユーザのパスワードはMD5ハッシュとして格納されます。 ですので、ユーザに割り当てられているパスワードは管理者でも分かりません。 MD5暗号化がクライアント認証に使用されている場合、平文のパスワードはサーバ上に瞬間的にも存在することはありません。 ネットワーク上に流れる前にクライアントがMD5暗号化を行うからです。
contrib関数ライブラリ pgcrypto
により、あるフィールドを暗号化して保存することができます。
データの一部が極秘データであるような場合に有用です。
クライアントが提供した復号化用のキーで、サーバ上のデータを復号化し、クライアントに返されます。
復号化されたデータと復号化用のキーは、復号処理中およびクライアントサーバ間の通信中サーバ上に存在します。 このため、データベースサーバへの全てのアクセス権限を持つユーザ(例えばシステム管理者)によって、データとキーが盗まれる瞬間があります。
Linuxでは"loopback device"を使用してマウントされたファイルシステムの最上位で暗号化を行うことができます。 これにより、ファイルシステムパーティション全体をディスク上で暗号化することができます。 これはオペレーティングシステムにより復号化されます。 これと同等の機能は、FreeBSDではGEOMベースのディスク暗号化、gbdeと呼ばれます。
この機構により、ディスク装置やコンピュータ全体が盗まれた場合でも、ディスクから平文のデータが読み取られることを防止できます。 ファイルシステムがマウントされている時は、この機構による保護は働きません。 マウント時にはオペレーティングシステムが復号化したデータを提供するからです。 しかし、ファイルシステムをマウントするためになんらかの方法で暗号化キーをオペレーティングシステムに渡さなければなりません。 そのディスク装置をマウントするホストのどこかに暗号化キーを格納している場合もあります。
MD5認証方式は、サーバにパスワードを送信する前に、パスワードを二重に暗号化します。 まず、ユーザ名を元にパスワードをMD5で暗号化します。 そして、データベース接続が確立した時に、ランダムなソルトを使用して更に暗号化します。 この二重に暗号化された値が、ネットワーク越しにサーバへ渡されます。 二重の暗号化により、パスワードの盗聴を防ぐだけではなく、将来確立する別の接続で同じ暗号化値が使用されなくなります。
SSL接続により、ネットワーク越しに送信されるデータ(パスワード、問い合わせ、結果のデータ)はすべて暗号化されます。 pg_hba.confファイルを使用して、管理者はどのホストは暗号化しない接続を使用し(host)、どのホストがSSLで暗号化された接続を必要とするか(hostssl)を指定することができます。 また、SSL経由のサーバとの接続のみを使用するようにクライアントで指定することもできます。 StunnelやSSHを使用して暗号化転送を行うこともできます。
クライアントとサーバの両方で、SSLキーや証明書を互いに提供することができます。 これには両方で追加の設定を行わなければなりませんが、これにより単なるパスワードの使用よりも強力な身元の検証を行うことができます。 クライアントから送信されたパスワードを盗聴する偽装したサーバからコンピュータを保護します。 また、 クライアントとサーバとの間にあるコンピュータがサーバになりすまし、クライアントとサーバ間で流れるデータを読み取り中継する、「中間者」攻撃から保護することもできます
システム管理者を信頼できない場合、クライアント側でデータを暗号化する必要があります。 この場合、平文のデータはデータベースサーバ上に存在しません。 データはサーバに送信される前にクライアント上で暗号化されます。 また、使用する前にデータベースからの結果をクライアントで復号化しなければなりません。