09

データベースに格納される情報の保護

今作っているシステムのセキュリティについて考えている。

個人情報を取り扱っていて、なにかしらのセキュリティ事故とかセキュリティホールがあっても極力漏洩を回避したい。

セッションハイジャックとかWebアカウントを乗っ取られる系(アカウントのセッションを乗っ取られる)を食らうとどうにもならない気がしているのだけど、パスワードが漏洩していなければ再認証である程度は保護できるのかな。本格的にやるにしても再認証の頻度を上げるとかしかないような気がする。そもそもセッションハイジャックを起こすなっていうのはあるんだけど、そこはとりあえず問わないのが今回の趣旨。以降の話も同様。

アカウントのパスワードが漏洩した場合・・・コレに対する対策はあまり思いつかない。いかに発見を速くするか、が重要なのでユーザへのコールバックを充実させ、なるべく早く不正ログインに気づいてもらう以外には思いつかない。

とくに乗っ取りなどを行わなくてもSQLインジェクションで他人の情報を取得する危険性がある。一般的なSQLインジェクション対策を行った上で、(セッッションが安全であることを前提に)セッションに保存されたユーザIDを必ず条件に指定してSQLを発行することで 防止できる?かと思ったけど、インジェクションの場合、大概実装されているSQLをぶった切るパターンが多そうなので意味ないかな。

インジェクションに限らず、SQL経由でくる脆弱性に関しては多分ユーザ毎に異なるキーで暗号化してあって、キーがユーザ側で管理できればいいだろう。けどこれは運用が難しそう。うちのシステムは規定で2ヶ月ごとにパスワードを変更すること、となっているんだけど、そうするとパスワードを変更するたびに保存している全情報を更新しないといけない。

ユーザパスワード+年月とかをキーにで暗号化しておけばパスワードが漏れない限りは安全にデータを保管できるのだろうが、上記の問題は解決しない。

これを解決しようと思えば例えば、システム側で恒久的なユーザパスワードを生成し、それはユーザパスワード(これは定期的に変更される)で暗号化して保存。「恒久的なユーザパスワード」はユーザIDと何らかの SALTをもとに生成されるハッシュ文字列のような物を想定する。個人情報は、この文字列を使用して暗号化・保管する。ユーザがパスワードを変更した場合にはこの「恒久的なユーザパスワード」も再暗号化する。

またこの「恒久的なユーザパスワード」を複合化する場合にはユーザのパスワード入力を求める。恒久的なユーザパスワードのデータベースが漏洩した場合、これをもとにユーザパスワードと恒久的なユーザパスワードが破られる可能性がある。この場合、ユーザパスワードとSALTを変更して恒久的なユーザパスワードを再発行する。だがこの場合、全データを再暗号化しなければならない。

メリット:

・ユーザがパスワード変更しても全データを再暗号化しなくてよい

・恒久的なユーザパスワードの漏洩は通常のユーザパスワード漏洩と同等の危険性:でもWeb側からの攻撃で漏洩する可能性はとても低くなるような

デメリット:

・面倒

・再暗号化はどのみち必要

・ストレージやDBが漏洩する程度の攻撃に対してはユーザパスワードによる暗号化と同程度の強度のはず

そのほか:

・ユーザパスワードのみ漏洩してもデータは保護できる?:できない。Webからはいればデータは複合化されるはず。

ストレージやデータベースごと漏洩した場合。

ハードドライブごと盗難にあったとかの場合、基本的にファイルシステムやDBでサポートする暗号化に頼るのが最も簡単なような気がする。とはいえ、これで万全と言っていいのかどうか知らないが。ローカルアカウントやDB管理者のアカウントが漏洩した、と言った場合、基本的にデータにユーザごとの暗号化がかかっていれば、そのままでは利用できない。が、上記同様専門の機械を持っているのであれば破られてしまうだろうと思われるのでどの程度安全と言えるのかわからない。

このレベルではあまりセキュリティを論じる意味は無いのかな?とりあえずできそうなこと(上記に上げたような)をやっておくだけしかできないか。