安全の助けになるのは、ゲートかそれともガードレールか
ソフトウェア開発におけるセキュリティの歴史は、事実からすれば「セキュリティ脆弱性テスト」に「合格」するかどうか次第という方式での導入が先行しました。この方式は、空港のセキュリティチェックのように、セキュリティ担当が調べた結果、OKであれば通過でき、NGであれば、問題とされるものを取り除かないと通過できません。行く手に立ち塞がる「門番」です。
一見堅牢なのですが、この「セキュリティ・ゲート」方式には弱点があります。セキュリティゲートは、通過する可能性のあるものの危険性について、すべて知り尽くしている必要がありますが、ソフトウェアのセキュリティを考える時、それは不可能です。

ソフトウェアが作りたいもの、作るために使うもの、目指したいものはプロジェクトごとに違いますし、アップデートなどの変化も激しいからです。
これほど多くのアーキテクチャ、コンポーネント、そして用途も多様化している現在、出来上がってしまったソフトウェアをあとでチェックしてセキュアなものかどうかを判断する方式は極めて非効率、非現実的です。外形的に判断できるほど単純ではありません。
運転中のドライバーに安全な走行をしてもらうには、運転後ではなく、運転している最中に安全な走行の助けになるものが必要です。そう、それはガードレールでしょう。
ガードレールの目的は、走って良い/いけない領域をはっきり示すことです。そうすることで、知らない道を走る場合であっても、ドライバーには明確に道筋が見えます。ガードレールで守られた領域で運転、つまり開発している限り、セキュリティ違反が起きにくい方法で進めることができます。では、ガードレールタイプのセキュリティとはどんなものか考えてみましょう。

整備するセキュリティガイドに含まれるべきこと
- リファレンス・アーキテクチャ:構造設計をゼロから考えないことです。安全のための機能や性能を盛り込んだ、先人の知恵をたたき台として使うようにします。アーキテクチャのパターンについては、書籍や、オープンなドキュメント、またクラウドベンダーから提供されています。
- 認証・認可の仕組みを決める:標準的な認証の仕組みを決め、それを使います。また、システム上のユーザロールを明確にするため、ロールと権限の関係を示す権限表(マトリックス)を作り、共有してください。
- データ保存や通信の暗号化:データを保護する、オープンな信頼できる暗号方式を採用してください。暗号関数を自分で開発するのはやめましょう。そしてチーム内で使い方と使うべき場所の足並みをそろえます。
- 適切なフレームワークやコンポーネントを活用する:セキュリティ上リスクの大きな機能の多くは、さまざまな開発用フレームワークに整備されています。チームで、上手な活用方法を共有してください。不足している共通機能は、代表して誰かが作るようにし、散在しないように工夫します。
- テストツールとトレーニングはセットで整備する:ソースコードテストツールは、いつでも使えるようにします。もっとも、エラーや警告のメッセージを理解できないと効果も半減します。トレーニングとあわせて展開していきましょう。
まだまだ挙げることがありますが、イメージが沸きましたか?このような開発者向けの効果的なセキュリティプラクティスは、OWASP Proactive Controls(事前の対策)という啓発ドキュメントで概説されています。より詳細な情報へのリンクもありますから、この機会にぜひ参照なさってください。自社の「ガードレール」ガイドを作る際の雛形として使うことは有効だと思います。
C01: セキュリティ要件の定義 C02: セキュリティフレームワークやライブラリの活用 C03: セキュアなデータベースアクセス C04: エンコーディングおよびエスケープ C05: すべての入力値の検証 C06: アイデンティティと認証管理の実装 C07: 適切なアクセス制御の実装 C08: すべてのデータの保護 C09: ロギングとモニタリングの実装 C10: エラー処理と例外処理 |
OWASP Proactive Controls 2018 日本語
https://github.com/owasp-ja/OWASP-Top10-Proactive-Controls-2018-JP
設計面でのヒントをひとこと。クラウドを活用したアーキテクチャの設計には、それぞれのクラウドベンダーが示唆を与えることが期待されます。実際に出ているものを調べ、その上で採用を決めることです。
たとえば、AWS初心者向け資料の中をいろいろと見ていくと、『AWS設計のベストプラクティスで最低限知っておくべき10のこと』という、本当は11項目ある資料があります。これには、押さえておくべきセキュリティ面の実践手段も含まれています。「初心者」じゃない人ほど読んで、共通言語として示すのも良いでしょう。

今回は、セキュリティを「ゲート」ではなく、「ガードレール」としてとらえ、うまく開発を進めることに着目することについてお話しました。うまく進められることを目的としたガイドラインを、開発チームのフィードバックを得ながら一緒に作りあげていくような姿勢で、セキュリティの面でも高い品質についてのコンセンサスを得ることが、セキュリティ推進には有効です。
もっとも、セキュリティ脆弱性テストの役割や重要性がないわけではありません。セキュリティテストのあり方と、上手な活用方法についてはまた別の機会にお話ししたいと思います。