ikepyonのだめ人間日記

セキュリティに関することを書いていく予定。

ほんとに安全なアプリ開発に高いコストが必要か? そのに

開発側でやるべきことを書く前に、アプリケーションの脆弱性についてどこの工程が原因で脆弱性が発生するのかちょっと分類してみる。
あらゆる脆弱性は、以下のどれかといっていいと思う。

  1. 仕様の問題による脆弱性
  2. 設計の問題による脆弱性
  3. コードの問題による脆弱性
  4. 運用の問題による脆弱性

現状これらがすべてごっちゃになって論じられているのではないだろうか?

仕様の問題による脆弱性

仕様の問題による脆弱性を実装段階で何とかしようとすると確かに非常に莫大なコストがかかる。しかし、仕様策定の段階でこれを対策しておけばそれに比べるとコストはかからない。もちろん、そういったことを洗い出さずに仕様策定するよりはコストがかかる。ただしこの仕様策定段階でのセキュリティ対策というのは発注側が本来コストを払うべきものではないだろうか?
開発側からすれば、発注側の会社がどのようなセキュリティポリシーを持っていて、どういう脅威を問題視するか?というのはわからないと思う。これは通常の機能についても同様だ。発注側は思いつく限り自分たちがほしいと思う機能を上げて、それが実現可能かどうかも考えずに、全部作れという。その結果莫大なコストがかかるというのはよく聞く話だ。発注側は想定したコスト内で実現するために、どの機能が必要で、どの機能はいらないといった重要度を考えなければならないが、同じことをセキュリティ面でも考えなければいけないと思う。
こういったことをやらずに何でもかんでも機能を追加しているのではないか?

設計による脆弱性

仕様の問題による脆弱性と同様の議論が成り立つと思われる。加えて、この段階でコードによる脆弱性が発生するのを少なくする仕組みを作ることで、コードによる脆弱性を減らすことができる。例えば、SQLインジェクションが発生しやすいというのであれば、SQL文を一切書かなくてもいいフレームワークなり、デザインパターンを使用するようにすればいい。また、安全なコーディング規約を決めて、それにしたがってコードを書くように教育しておくということも有用だと思う。もちろん、アプリケーションの仕様によってはフレームワークなどが使えない場合もあるだろう。その場合は、黙っていても安全なコードを書ける技術者にその部分の実装をお願いすることになるかもしれない。
設計でつぶせる脆弱性というのをまったく考えずに設計していることで、余計なコストがコーディング時に増えてないだろうか?

コードによる脆弱性

よく聞くSQLインジェクションXSSはこの部類になる。これらの脆弱性は当たり前のことをしていればほぼ防ぐことができる。しかし、現状その当たり前のことがなされていないことが多い。これはプログラミングの教育においてセキュリティは難しいからということや、当たり前にしなければならないことを説明が難しいからという理由できちんと教えていないことが原因ではないだろうか?教育には確かにコストがかかるが、それは安全なアプリを作るには必要なことだろう。この部分をケチって余計なコストをかけているということはないだろうか?
安全なコードを書くためのコーディング規約をつくり、それを遵守させるというのも対策としてはいいだろう。
また、脆弱性を発見するためにセキュリティテストをする工数がかかるというのもあるだろう。しかしこのテスト工数は自動化ツールを使うことで削減できるだろう。もちろん、自動化ツールで検出できる脆弱性は限られているが、多くの攻撃というのは自動化ツールで見つけられるものだったりするので、ある程度役には立つ。
もっとも、テストというのは実装したものが、仕様どおりに動いているかどうかを確認するためのものと思うので、テストで脆弱性を発見するというのはちょっと違う気もするけど・・・
確かにテスト工数は大きくかかるが、現状の開発ではテストがおざなりになっていることは否めない。設計が終わった段階で、自動テストツールを並行して作るチームというのもあってもいいかもしれない。そうすることで、納期が短くてもテストが十分できるようになるのではないか?もっとも、テストチーム事態がコスト増加の原因となるだろうけど、複数プロジェクトで似たようなものが作れると思うので、量産化できるのではないか?Webアプリに関していえば、そういった汎用ツールって結構できるんじゃないかな?

運用による脆弱性

日々の運用は重要であるにもかかわらず軽視されることが多い。まあ、正常に動いて当たり前というのがあるからなぁorzまた、実装の段階で実装が困難なものを運用でカバーするという無茶も結構あるのではないだろうか?これは開発側が運用のことを考えずに設計しているということが大きい気がする。結果ミスをしやすい運用になったり、そもそも運用条件が現実的にありえないとかありそうである。こういったものも設計の段階からきちんと考慮していれば防げるだろう。

というわけで、(何がというわけかわからんがw)きちんと各工程でセキュリティについて考えていれば大きくコストが跳ね上がることはないのではないだろうか?現状それができていないor何をやればいいのかわからないというのが問題で、やるべきこと、考えることというのはそれほど難しいものではないと思う。また、業務アプリなんてそうそう大きな違いがないのだからテンプレート化、ツール化ってできるのでは?
そういったものを作るには確かにそれなりの知識や技術が必要だろうけどねぇ。