セキュリティパイプラインがすべてをブロックするとき:抜け穴を作らずに例外を処理する方法
CIパイプラインでセキュリティスキャンを実行しているとします。チームが依存するライブラリに脆弱性が見つかりました。深刻度は中程度ですが、まだパッチが提供されていません。パイプラインは失敗し、チームはデプロイできません。
ここで選択肢があります。スキャン全体を無効にする、すべてが通るまでしきい値を下げる、またはパイプラインの結果を無視し始めることです。これらの選択肢はどれも良いものではありません。しかし、個々の検出結果を簡単にバイパスできるようにすると、パイプラインはセーフティネットとして機能しなくなります。
これが例外の問題です。パイプラインでセキュリティルールやコンプライアンスルールを適用するすべてのチームが、いつかは直面します。解決策はゲートを削除することではありません。解決策は、例外を処理するための明確で説明責任のあるメカニズムを構築することです。
例外が存在する理由
例外はプロセスが壊れている証拠ではありません。現実世界が常にルールと一致するとは限らないという証拠です。ライブラリに既知の脆弱性があるが、メンテナがまだ修正をリリースしていない。コンプライアンスルールが特定の設定を禁止しているが、インフラストラクチャが現在代替案をサポートできない。セキュリティ上の発見は技術的に有効だが、特定のコンテキストではリスクが許容可能である。
パイプラインにこれらの状況を処理する方法がない場合、チームは回避策を見つけます。スキャンを無効にしたり、しきい値を弱めたり、赤いパイプラインを正常と見なしたりし始めます。パイプラインは形骸化し、セキュリティギャップは残ったままになります。
目標は、パイプラインを厳格に保ちながら、チームが実際のブロッカーに直面したときに正当な前進手段を提供することです。
例外処理の4つのルール
優れた例外メカニズムには4つの特性があります。それぞれが、チームがよく直面する特定の障害モードを防ぎます。
次のフローチャートは、4つのルールで説明される例外のライフサイクル全体を示しています。
1. 例外は記録されなければならない
最初のルールは最もシンプルです:書き留めることです。例外はプルリクエストのコメントやチャットチャンネルのメッセージではありません。誰もが確認できる場所に存在する必要があります。セキュリティチーム、コンプライアンスチーム、パイプラインを実行するチームのすべてが同じレコードにアクセスできる必要があります。
どこに保存するかは、保存することほど重要ではありません。リポジトリ内の設定ファイルでも、課題トラッカーへのエントリでも構いません。重要なのは、レコードに3つの情報が含まれていることです:誰が例外を提出したか、何が除外されているか、そしてその理由です。
2. 例外は承認されなければならない
一人の人間がセキュリティゲートをバイパスすることを決定すべきではありません。ブロッカーを発見した開発者は例外を提出できますが、承認はリスクを理解している人が行うべきです。セキュリティ関連の例外はセキュリティエンジニアが承認します。ポリシー違反はコンプライアンス責任者が承認します。承認自体は、別のプルリクエストまたはパイプライン内の承認ステップを通じて行うことができます。
このステップは、例外の最も一般的な悪用を防ぎます:開発者が他の誰にも理由をレビューされずに、自分の発見を許容可能とマークすることです。
3. 例外には有効期限がなければならない
これはほとんどのチームが忘れるルールです。例外は何かが一時的にブロックされているために作成されます。6ヶ月後には、ライブラリにパッチがあるかもしれません。インフラストラクチャの制限が解決されているかもしれません。しかし、例外はまだ有効で、同じ脆弱性がすべてのデプロイを通過することを静かに許可しています。
すべての例外には期限が必要です。重大な脆弱性の場合は1週間が適切かもしれません。低深刻度の場合は1ヶ月または3ヶ月が妥当です。期間は発見の種類とコンテキストに依存しますが、存在しなければなりません。
4. 期限切れの例外はパイプラインを失敗させなければならない
誰も強制しなければ、有効期限は無意味です。例外の期限が切れたとき、パイプラインは該当するゲートで自動的に失敗する必要があります。チームは確認を覚えておく必要はありません。パイプライン自体がリマインダーになります。ブロッカーがまだ存在する場合、チームは更新された正当性とともに新しい例外を提出します。ブロッカーが解決された場合、例外は削除され、パイプラインは再び通過します。
これにより、自然なレビューサイクルが生まれます。すべての例外は、継続する前に少なくとも1回は再検討されます。
技術的負債のアナロジー
このパターンは新しいものではありません。優れたチームが技術的負債を処理するのと同じ方法です。負債が存在しないふりをするのではありません。記録し、優先順位を付け、返済する時間をスケジュールします。セキュリティ例外も同じように機能します。脆弱性を無視しているのではありません。認識し、決定を文書化し、対処するための期限を設定しているのです。
違いは、技術的負債は問題を引き起こすまで見えないことが多いことです。セキュリティ例外は作成された瞬間から可視化されます。パイプラインがそれを記録し、承認がそれを記録し、有効期限がそれを忘れられなくします。
実践的なチェックリスト
パイプラインの例外メカニズムを設定する場合、開始するための短いチェックリストを以下に示します。
- セキュリティ、コンプライアンス、エンジニアリングチームがアクセス可能な例外の保存場所を選択する
- 各タイプの例外(セキュリティ発見、コンプライアンス違反、インフラストラクチャ制限)を承認できる人を定義する
- 異なる深刻度レベルに対するデフォルトの有効期間を設定する
- パイプラインが有効期限を自動的にチェックし、例外の期限が切れたときに失敗するようにする
- フローをテストする:例外を提出し、承認し、期限切れにさせ、パイプラインの動作を確認する
次に来るもの
優れた例外メカニズムは、パイプラインを厳格に保ちながら、硬直的にはしません。チームは実際のブロッカーに直面したときに前進できますが、痕跡を残さずにゲートをバイパスすることはできません。パイプラインは形骸化ではなく、ガードレールとして有用であり続けます。
このメカニズムを整えたら、次のステップはすべてのルールをコードとしてエンコードすることです。ドキュメントに書かれたり、会議で話されたりするポリシーは、一貫して強制するのが困難です。コードとして書かれたルールは、テスト、レビュー、自動実行が可能です。そこがセキュリティとコンプライアンスのゲートが真に信頼できるものになる場所です。