(2)設計
ここでは、セキュリティ要件だけでなく、開発速度を意識した設計を行います。
セキュリティという点では、ツールで検出することが困難な脆弱性と、フレームワークやライブラリが原因で発生する脆弱性に特に注意します。
ツールで検出することが困難な脆弱性の例としては、閲覧権限がないユーザがページを閲覧できてしまうフォースフルブラウジングという脆弱性があげられます。これはアプリケーションの仕様が原因で発生するため、ツールでの検出が難しい脆弱性の一つです。このような脆弱性を埋め込まないよう、アクセス権限のチェックを自動化するなど、意識して設計する必要があります。
また、フレームワークやライブラリが原因となる脆弱性は狙われやすく、危険度が高い脆弱性が悪用された場合、情報漏洩やサービス妨害などの大きな被害につながる恐れがあります。フレームワークの選定時には、過去に何度も危険な脆弱性が報告されているフレームワークは避けるようにしましょう。さらに、不要な機能をできる限り無効化することで、脆弱性が公開されても、最小の被害で済むように準備しておくことも重要です。
開発速度という点では、できるだけ小さく、シンプルなアプリケーションを開発することがカギとなります。このようなアプリケーションを設計することができれば、セキュリティ対策ツールの実行に掛かる時間を減らすことができます。それだけでなく、開発に掛かる工数も抑えることができます。しかし、現実のアプリケーションはどうしても複雑になってしまいがちです。そのため、1つの大きなアプリケーションを開発するのではなく、複数の小さなアプリケーションを開発するように心がけるとよいでしょう。そうすることで、1つのアプリケーションに対するツールの実行時間を削減することができ、開発速度への影響を小さくすることができます。
(3)実装
開発の初期段階では、できるだけ手間をかけずに、アプリケーションのセキュリティチェックを行えるよう自動化された環境を整えます。最初は、SCAと静的解析ツールを導入します。
SCAは、アプリケーションが使用するフレームワークやライブラリに新しい脆弱性が報告されていないかチェックするために使用します。フレームワークやライブラリはインターネット上に脆弱性の情報が公開されているだけでなく、脆弱性を再現するための手順が公開されている場合もあります。そのため、脆弱性が悪用される前に最新のライブラリに更新し、影響度が大きい脆弱性が報告されているライブラリを使い続けないようにすることが重要です。リリース後に影響が大きい脆弱性が突然公開されることもあるので、テストを自動化し、ライブラリ更新による影響を簡単に確認できるようにしておくことをお勧めします。また、ライブラリを改造して使用していると、バージョンアップが困難になってしまいます。セキュリティ対策という観点では、ライブラリを改造せずに使用しましょう。SCAはプログラムの変更時だけでなく、毎日定期的に実行するように設定してください。
静的解析ツールは、開発者が実装したプログラムに脆弱性が埋め込まれていないかどうかチェックするために使用します。静的解析ツールも実装の初期段階から導入することで、脆弱性を埋め込まないようにします。静的解析ツールでは、どうしても過剰検知が発生してしまいます。アプリケーションの規模が小さいうちから、静的解析ツールの解析内容や過剰検知の判定をチューニングしていくことで、解析結果に振り回されないような体制を作っていきましょう。静的解析ツールはプログラムを修正したタイミングで、都度実行するように設定します。
これらのツールは、単に自動実行するだけだと、結果を確認するために、複数のツールを使い分ける必要が出てきます。このままでは、開発者の負担が増えてしまい、開発効率が下がってしまうか、ツールの結果を誰も確認しなくなってしまいます。このような状況にならないよう、チェック結果は一か所に集約し、開発者が意識しなくても目に入るように設定します。GitHubや、Bitbucketなどのツールを使用している場合は、プルリクエストに結果を表示し、セキュリティツールもレビューアーとして参加させると良いでしょう。
開発が進んでいき、ある程度アプリケーションが実行できるようになったら、動的解析ツールも併用し、実際に悪用できる脆弱性が残っていないかチェックしましょう。適切な実行頻度は、アプリケーションの規模によって変わります。規模が小さなアプリケーションの場合は、プルリクエスト作成時に都度実行することもできますが、規模が大きなアプリケーションの場合は、解析が終了するまでに数時間から数十時間かかることもあります。この場合、深夜や週末に解析を行うなど、実行タイミングを工夫する必要があります。
動的解析ツールには大きく分けて、2つのモードが搭載されています。1つは、自動でアプリケーションを巡回し、簡易検査を行ってくれる自動巡回モード。もう一つは、自分で設定を作り込む必要があるが、アプリケーションの特性に応じた検査が可能なマニュアルモード。最初はアプリケーションの仕様が固まっておらず、実際に動作する範囲が限られるため、自動巡回モードを活用し簡単に見つけられる範囲の脆弱性をチェックします。
このように、開発の初期段階からセキュリティテストを組み込むことで脆弱性を埋め込まないような開発を行うことができます。
