16.6. 暗号化オプション

PostgreSQLは、複数レベルの暗号化を備え、データベースサーバ自身、管理者の注意不足、安全ではないネットワークを原因とした漏洩からデータを柔軟に保護することができます。 また、診療記録や財務業務など高セキュリティが求められるデータを格納する場合に暗号化が必要な場合もあります。

パスワード格納に関する暗号化

デフォルトでは、データベースユーザのパスワードはMD5ハッシュとして格納されます。 ですので、ユーザに割り当てられているパスワードは管理者でも分かりません。 MD5暗号化がクライアント認証に使用されている場合、平文のパスワードはサーバ上に瞬間的にも存在することはありません。 ネットワーク上に流れる前にクライアントがMD5暗号化を行うからです。

特定の列に関する暗号化

/contrib関数ライブラリ pgcryptoにより、あるフィールドを暗号化して保存することができます。 データの一部が極秘データであるような場合に有用です。 クライアントが提供した復号化用のキーで、サーバ上のデータを復号化し、クライアントに返されます。

復号化されたデータと復号化用のキーは、復号処理中およびクライアントサーバ間の通信中サーバ上に存在します。 このため、データベースサーバへの全てのアクセス権限を持つユーザ(例えばシステム管理者)によって、データとキーが盗まれる瞬間があります。

データパーティションに関する暗号化

Linuxでは"loopback device"を使用してマウントされたファイルシステムの最上位で暗号化を行うことができます。 これにより、ファイルシステムパーティション全体をディスク上で暗号化することができます。 これはオペレーティングシステムにより復号化されます。 これと同等の機能は、FreeBSDではGEOMベースのディスク暗号化、gbdeと呼ばれます。

この機構により、ディスク装置やコンピュータ全体が盗まれた場合でも、ディスクから平文のデータが読み取られることを防止できます。 ファイルシステムがマウントされている時は、この機構による保護は働きません。 マウント時にはオペレーティングシステムが復号化したデータを提供するからです。 しかし、ファイルシステムをマウントするためになんらかの方法で暗号化キーをオペレーティングシステムに渡さなければなりません。 そのディスク装置をマウントするホストのどこかに暗号化キーを格納している場合もあります。

ネットワーク越しのパスワード暗号化

MD5認証方式は、サーバにパスワードを送信する前に、パスワードを二重に暗号化します。 まず、ユーザ名を元にパスワードをMD5で暗号化します。 そして、データベース接続が確立した時に、ランダムなソルトを使用して更に暗号化します。 この二重に暗号化された値が、ネットワーク越しにサーバへ渡されます。 二重の暗号化により、パスワードの盗聴を防ぐだけではなく、将来確立する別の接続で同じ暗号化値が使用されなくなります。

ネットワーク越しのデータ暗号化

SSL接続により、ネットワーク越しに送信されるデータ(パスワード、問い合わせ、結果のデータ)はすべて暗号化されます。 pg_hba.confファイルを使用して、管理者はどのホストは暗号化しない接続を使用し(host)、どのホストがSSLで暗号化された接続を必要とするか(hostssl)を指定することができます。 また、SSL経由のサーバとの接続のみを使用するようにクライアントで指定することもできます。 StunnelSSHを使用して暗号化転送を行うこともできます。

SSLホスト認証

クライアントとサーバの両方で、SSLキーや証明書を互いに提供することができます。 これには両方で追加の設定を行わなければなりませんが、これにより単なるパスワードの使用よりも強力な身元の検証を行うことができます。 クライアントから送信されたパスワードを盗聴する偽装したサーバからコンピュータを保護します。 また、 クライアントとサーバとの間にあるコンピュータがサーバになりすまし、クライアントとサーバ間で流れるデータを読み取り中継する、'man in the middle"攻撃から保護することもできます

クライアントサイドの暗号化

システム管理者を信頼できない場合、クライアント側でデータを暗号化する必要があります。 この場合、平文のデータはデータベースサーバ上に存在しません。 データはサーバに送信される前にクライアント上で暗号化されます。 また、使用する前にデータベースからの結果をクライアントで復号化しなければなりません。