PostgreSQLは、複数レベルの暗号化を備え、データベースサーバ自身、管理者の注意不足、安全ではないネットワークを原因とした漏洩からデータを柔軟に保護することができます。 また、医療記録や金融取引など高セキュリティが求められるデータを格納する場合に暗号化が必要な場合もあります。
データベースユーザのパスワードは(password_encryptionによって決定される)ハッシュとして格納されます。ですので、ユーザに割り当てられているパスワードは管理者でも分かりません。 SCRAM又はMD5暗号化がクライアント認証に使用されている場合、平文のパスワードはサーバ上に一時的にも存在することはありません。ネットワーク上に流れる前にクライアントが暗号化を行うからです。 SCRAMは、インターネット標準で、PostgreSQL特有なMD5認証プロトコルよりセキュアであるため、より望ましいです。
pgcryptoモジュールにより、あるフィールドを暗号化して保存することができます。 データの一部が極秘データであるような場合に有用です。 クライアントが提供した復号化用のキーで、サーバ上のデータを復号化し、クライアントに返されます。
復号化されたデータと復号化用のキーは、復号処理中およびクライアントサーバ間の通信中サーバ上に存在している時間があります。 このため、データベースサーバへのすべてのアクセス権限を持つユーザ(例えばシステム管理者)によって、データとキーが盗まれるわずかな時間があります。
ストレージの暗号化は、ファイルシステムレベルまたはブロックレベルで行うことができます。 Linuxファイルシステムの暗号化オプションには、eCryptfsとEncFSがあります。一方、FreeBSDではPEFSを使用します。 ブロックレベルまたはフルディスクの暗号化オプションとして、Linuxにはdm-crypt + LUKS、FreeBSDにはGEOMモジュールのgeliとgbdeがあります。 これにより、ファイルシステムパーティション全体をディスク上で暗号化することができます。 他の多くのオペレーティングシステムは、Windowsを含め、この機能をサポートしています。
この機構により、ディスク装置やコンピュータ全体が盗まれた場合でも、ディスクから平文のデータが読み取られることを防止できます。 ファイルシステムがマウントされている時は、この機構による保護は働きません。 マウント時にはオペレーティングシステムが復号化したデータを提供するからです。 しかし、ファイルシステムをマウントするためになんらかの方法で暗号化キーをオペレーティングシステムに渡さなければなりません。 そのディスク装置をマウントするホストのどこかに暗号化キーを格納している場合もあります。
SSL接続により、ネットワーク越しに送信されるデータ(パスワード、問い合わせ、結果のデータ)はすべて暗号化されます。
pg_hba.conf
ファイルを使用して、管理者はどのホストは暗号化しない接続を使用し(host
)、どのホストがSSLで暗号化された接続を必要とするか(hostssl
)を指定することができます。
また、SSL経由のサーバとの接続のみを使用するようにクライアントで指定することもできます。
GSSAPI暗号化接続は、問い合わせ及び返却されるデータを含めてネットワーク上に転送されるすべてのデータを暗号化します。
(パスワードはネットワーク上に送信されません。)
管理者はpg_hba.conf
ファイルを使ってどのホストが非暗号化接続を使うか(host
)、どのホストがGSSAPI暗号化接続を要求するか(hostgssenc
)を指定できます。
クライアントはGSSAPI暗号化接続のみを使ってサーバに接続することも指定できます(gssencmode=require
)。
StunnelやSSHを使用して暗号化転送を行うこともできます。
クライアントとサーバの両方で証明書を互いに提供することができます。 これには両方で追加の設定を行わなければなりませんが、これにより単なるパスワードの使用よりも強力な身元の検証を行うことができます。 クライアントから送信されたパスワードを盗聴する偽装サーバからコンピュータを保護します。 また、クライアントとサーバとの間にあるコンピュータがサーバになりすまし、クライアントとサーバ間で流れるデータを読み取り中継する、「中間者」攻撃から保護することもできます。
サーバマシンのシステム管理者を信頼できない場合、クライアント側でデータを暗号化する必要があります。 この場合、平文のデータはデータベースサーバ上に存在しません。 データはサーバに送信される前にクライアント上で暗号化されます。 また、使用する前にデータベースからの結果をクライアントで復号化しなければなりません。