多くの組織はソフトウェアの開発時に一般的な開発プロセスに従っていますが、一般的なプロセスでは通常セキュリティの欠陥を検証(テスト)フェーズで特定するため、開発プロセスではセキュアなソフトウェアの構築にほとんど対応していません。ソフトウェア開発ライフサイクル(SDLC)の後工程での欠陥の修正は、多くの場合、高コストになります。したがって、計画フェーズからリリースまでのSDLCの全工程にセキュリティを組み込むことが推奨されます。これにより、発生後すぐに欠陥を発見(および修正)することが可能になります。
以下では、SDLCのさまざまなフェーズと各工程で導入する一般的なセキュリティアクティビティをご紹介します。
計画段階では、アナリストがステークホルダーと緊密に協働してアプリケーションの機能特性と非機能特性(パフォーマンスなど)を定めます。たとえば、顧客がモバイル・バンキング・アプリケーションを利用する場合には電信送金の機能が必要です。
この段階でのセキュリティアクティビティからセキュリティ要件が導き出されます。まず、機能セキュリティ要件と非機能セキュリティ要件との違いを明確にしておきましょう。
アナリストは次の4種類のソースからセキュリティ要件を導き出します。
法律と規制は個人情報の取り扱いを規定します。ペイメントプロセッサーとの契約は財務データの保存方法を規定します。
アプリケーション自体からもさまざまな要件が発生します。アナリストはアプリケーションの機能がどの程度悪用可能であるかを評価し、該当箇所を悪用ケース(セキュリティのユースケースに相当)として文書化します。例として、顧客がファイルアップロード機能を利用してマルウェアをアップロードする場合などが挙げられます。
これは重要なポイントにつながります。効果的なセキュリティ要件定義書の作成は簡単ではありません。
セキュリティ要件は次のとおりです。
設計工程では、アーキテクトは承認された要件を満たす概要設計を選択し、アプリケーションをさまざまなコンポーネントに細分化し、テクノロジースタックを規定します。たとえば、「Javaで開発されたRESTバックエンドと通信するモバイルアプリをクラウドでデプロイする」のように定義することができます。
長年の経験からわかったことですが、セキュリティの問題をもたらすソフトウェアの不具合の半分(そうです、半分です)はこの段階で生じます。この段階でのセキュリティアクティビティは、設計をレビューしてこうしたセキュリティの欠陥を発見することです。このような脆弱性の例として、REST APIとの通信にTLSなどのセキュアチャネルを利用していないモバイル・バンキング・アプリケーションが挙げられます。厳格さのレベルに応じて、設計レビューを実行するアクティビティは異なります。
実装工程では、開発チームが既定の仕様に従ってアプリケーションを完成させます。この工程のセキュリティアクティビティはテクノロジー固有のセキュア・コーディング・ガイドラインと(自動)コードレビューが中心になります。
一般に、テクノロジー固有のガイダンスは開発チームがシステムをセキュアに実装するためのチェックリストの形式をとります。チェックリストには避けるべき事項とセキュアな代替手段を含めることもできます。ガイドラインは実践的(セキュアな実装方法を示している)であり言語またはフレームワーク(Node.jsなど)固有であることが必要です。たとえば、PHPの開発では、データの暗号化に(廃止されるmcryptの暗号化関数ではなく)libsodiumのcrypto_aead_aes256gcm_encrypt関数を使用することが推奨されます。
コードレビューでは、開発者がこのようなセキュリティ上のミスを犯しているかどうかを確認します。こうしたコードレビューを自動化するツールは静的アプリケーション・セキュリティ・テスト(SAST)ツールと呼ばれます。SASTツールはニーズに応じた包括的で予防的なソリューションを実現します。また、標準的な開発環境(Eclipseなど)にSASTツールを統合して、セキュリティ上のミスが発生した時点ですぐに開発者に通知するようにすることもできます。つまり入力と同時にスペルミスのある単語を検出するスペルチェッカーのような機能を果たします。
SASTツールをCI/CDパイプラインに統合し、開発者が新規に作成した非セキュアなコードを本番コードとマージできないようする(自動セキュリティテストに合格しないようにする)こともできます。
SDLCの検証工程では、開発チームまたはテストチームがアプリケーションの不具合を確認します。不具合の例として、1より小さい金額を入力するとモバイル・バンキング・アプリの送金ボタンが機能しない場合が挙げられます。
この段階でのセキュリティアクティビティでは、アプリケーションの実行時のセキュリティ上の不具合を探します。セキュリティ上の不具合の例として以下が挙げられます。
SDLC全体のソフトウェア・テスト・ライフサイクルには以下のテストが含まれます。
テストを効果的かつ効率的に行うため、テスト担当者は各自が異なるアーキテクチャおよびテクノロジースタックを専門にしています。モバイル、Web、組み込みアプリケーション、シッククライアント、IoTはいずれも専門的なスキルセットが必要です。
リリース工程では、アプリケーションをさまざまな依存関係と共に本番環境にデプロイしてユーザーが使用できるようにします。たとえば、TLS対応のアプリケーションをOpenSSL 1.0.1ライブラリと共にデプロイすることが考えられます。
この工程のセキュリティアクティビティでは、アプリケーションの依存関係に既知の脆弱性が存在するかどうかを確認します(そして見つかった脆弱性の阻止またはリスク低減の方法を提示します)。例として、Heartbleedに対して脆弱なOpenSSL 1.0.1を利用しているアプリケーションの検出が挙げられます。こうした(脆弱な)依存関係の検出はソフトウェア・コンポジション解析ツールで自動化できます。
アプリケーションのデプロイ後にテストチームがレッドチーム評価を行う必要もあります。このアクティビティでは、実際的な敵対行為によるシステムへの攻撃をモデリングします。また、個々には些細に見えてもまとめて攻撃されると重大な損害をもたらす可能性がある脆弱性を攻撃して、システムの耐性を検証します。テストでは、実際の攻撃者のように、アプリケーションの脆弱性だけではなく、アプリケーションをデプロイしている環境(ネットワーク、ファイアウォール、オペレーティングシステムなど)、運用手順、人(ロールベースのソーシャル・エンジニアリングなど)の弱点も考慮します。
教育はあらゆる セキュアソフトウェア開発ライフサイクル(SSDLC) の基礎です。チーム全員が基本的なソフトウェア・セキュリティ教育を受けるようにし、セキュリティの重要性に対する意識とセキュリティエンジニアリングの基礎知識の向上を図る必要があります。エンジニア・グループが新しい脅威に関する最新の知識を維持するための高度な教育を受けるようにするのも1つの方法です。
この記事でご紹介したセキュリティアクティビティはさまざまな企業が実践しているアクティビティのほんの一部にすぎません。自社のソフトウェアセキュリティ対策(SSI)の定義・構築(または成熟)を支援するソフトウェア・セキュリティ・ロードマップを独自に作成することをお勧めします。
その計画では、ソフトウェアセキュリティ戦略を定義し、組織の目的に適ったセキュリティアクティビティを選択する必要があります。自社の対策が同業他社と比較してどの程度進んでいるかを検証するという方法もあります。SSIによるアプリケーションのセキュリティ体制の向上を測定指標と共に示すことが重要です。
何よりも、セキュリティテストをSDLCの早い段階で取り入れるほどセキュリティ上の不具合を修正するためのコストが低減することを覚えておいてください。