PostgreSQL雑記―透過的なデータ暗号化 (案)

PostgreSQL雑記―透過的なデータ暗号化 (案)についてコメント。

少し長くなるので、別個にエントリーを作ってみた。

セキュリティ、監査、改竄防止、アクセス制御、情報漏洩防止、暗号化……この辺りはデータベースでどうすれば良いかを聞かれることは多いものの、「そもそも何を守りたいのか?」と突っ込むと、いまいち明確な答えが得られないので後回しになっていました。

この辺は、各々のセキュリティ機能が保護すべき対象、脅威、およびその前提条件を明確化して、それが以下のどの特性にマッピングされるかという事を考えるとクリアになるように思える。

  • 機密性
    • システムの保持する情報資産を参照できるとは、適切な権限を持った主体である事
  • 完全性
    • システムの保持する情報資産を更新できるのは、適切な権限を持った主体である事
  • 可用性
    • システム運用期間中において、システムが正しく稼動し、利用者がそれを利用できる事

では、PostgreSQLに暗号化タイプを導入するという事は、何を意味するのだろうか?

保護すべき対象は、明らかにDBに格納される情報資産であり、機密性を守ろうとしている。
(このプロポーザルでは完全性の保護は対象ではないようだ)

では、何からそれを守りたいのか?その前提条件は何なのか?

通常、利用者があるオブジェクトにアクセスするには、オブジェクトマネージャにリクエストを発行する。
オブジェクトがDB上のレコードである場合、利用者はPostgreSQL(オブジェクトマネージャ)にSQL(リクエスト)を発行するし、ファイル(OSの管理下)にアクセスする時はシステムコールを利用する。

一方、このような正当な手段を介さないアクセス方法も存在する。
例えば、PostgreSQLが作成したファイルはOSのファイルシステム経由で読み書きできるし、OSのファイルはHDDを抜いてバイナリダンプすれば誰にでも読むことができる。
暗号化を用いる場合、こういった非正規なアクセス方法であっても情報の機密性を守れるという特性がある。

その一方で、アクセス制御とは異なり、開示範囲を柔軟に定めるという用途には向いていない。
例えば、利用者Xは情報A,Bを参照可能であり、かつ、利用者Yは情報B,Cを参照可能であるといった用途には不向き。

したがって、暗号化の利用に関しては、オブジェクトマネージャの提供する正規の方法以外でのオブジェクトへの参照という事で位置付けを明確化すれば良いように思う。

単純にディスク(物理層)を攻撃された場合だけでなく、あるアプリが保持すべきデータの永続的ストレージとしてDBを利用している場合に、当該アプリを介さない参照を防ぐというような利用シーンまで広げると良いかと思う。
(ディスクの問題であれば、OSの暗号化ディスク機能を使えば済む話だし…。)