DevSecOps ツールチェーンのベストプラクティス
以下のセクションでは、 DevSecOps の各ツールチェーン(継続的インテグレーション(CI)、インフラストラクチャ・アズ・コード(IAC)向けのCI( IaC )、継続的デプロイメント(CD)、および継続的コンプライアンス(CC))に関するベストプラクティスについて説明します。
継続的インテグレーション(CI)ツールチェーンのベストプラクティス
DevSecOps のCIツールチェーンでは、以下のプラクティスを採用しています:
- アプリケーションのリポジトリに対して
detect-secretsを実行し、アプリケーションのソースコードにおけるシークレットの漏洩を防止します。 - アプリケーションコードに対して、ユニットテストおよびアプリケーションテストを実行します。
- アプリケーションのリポジトリに対して静的コードスキャナを実行し、ソースコード内のセキュリティ上の脆弱性を特定します。
- Code Risk Analyzer などのコンプライアンススキャナーを使用して、すべてのアプリケーションリポジトリに対してコンプライアンスチェックを実行します。これには、脆弱性スキャンや、すべてのパッケージ依存関係に対する部品表(BOM)チェックが含まれます。
- 前回のビルド以降にマージされたすべてのプルリクエストについて、ピアレビューのコンプライアンスデータを収集します。
- Git へのコミットが行われるたびにコンテナイメージをビルドし、トレーサビリティを確保するために、ビルド番号、タイムスタンプ、およびコミットIDに基づいてタグを設定します。
- ビルドされたコンテナイメージに署名します。
- コンテナイメージをスキャンして、セキュリティ上の脆弱性を検出します。
- ビルドされたアーティファクトを開発環境にデプロイし、実行中のアプリケーションに対して動的スキャン(ZAP APIおよびUIスキャン)を実行して、実行時の脆弱性を検出します。
- 開発環境にデプロイされたアーティファクトに対して、受け入れテストおよび統合テストを実行します。
- パイプラインの実行が終了するたびに、すべての証拠(スキャン結果、テスト結果、ログ、ピアレビューデータ、およびパイプライン実行データ)をエビデンスロッカーに収集します。
インフラストラクチャ・アズ・コード( IaC )ツールチェーンにおける継続的インテグレーション(CI)のベストプラクティス
IaC 用ツールチェーンの DevSecOps CIでは、以下のプラクティスに従っています:
- Terraformの設定におけるシークレットの漏洩を防ぐため、 IaC のリポジトリで
detect-secretsを実行します。 - Git へのコミットが行われるたびに、 IaC の設定に基づいてユニットテストを実行します。
- IaC のリポジトリに対して静的コードスキャンを実行します。これには、リンティングやベストプラクティスの遵守を確認するための
tflint、およびフォーマットの一貫性や設定の妥当性を確認するためのterraform fmtやterraform validateといった、Terraform専用のツールが含まれます。 - IaC-specific のツール(Code Risk Analyzerや
checkovなど)を使用して、 IaC のリポジトリに対してコンプライアンスチェックを実行し、コンプライアンス上の問題をスキャンします。 - Git へのコミットが行われるたびに、Terraformの設定を含むTarファイルを生成します。
- 生成されたTarアーティファクトに署名します。
- IBM Cloud Schematics またはTerraform CLIを使用して、 IaC の設定を開発環境にデプロイします。
- 開発環境にデプロイされた構成に対して、受け入れテストおよび統合テストを実行します。
- トレーサビリティの確保および下流環境への展開を目的として、ビルドされたアーティファクトをインベントリリポジトリに追加します。
- パイプラインの実行が終了するたびに、すべての証拠(スキャン結果、テスト結果、署名データ、ログ、およびパイプラインの実行データ)を証拠保管庫に収集します。
安全なアプリケーションをデプロイするための継続的デプロイ(CD)ツールチェーンのベストプラクティス
セキュアなアプリケーションをデプロイするために、 DevSecOps のCDツールチェーンでは以下のベストプラクティスに従っています:
- インベントリリポジトリに対してプロモーションプルリクエストを実行し、デプロイの範囲を定義するとともに、前回の完了したデプロイ以降に変更されたアーティファクトのセットであるデプロイのデルタを算出します。
- 現在のデプロイスコープ内のすべてのプルリクエストが、処理を進める前にピアレビューを経て承認されていることを確認します。 プルリクエストが1つでも承認されていない場合、デプロイを停止します。
- デプロイが予定されているすべてのアーティファクトが正しく署名されていることを検証します。 有効な署名がない場合、デプロイをブロックします。
- デプロイメントのデルタに基づいてデプロイメントの部品表(BOM)を算出し、関連するCIパイプラインの実行と現在のCDパイプラインの実行の両方から証拠の概要を収集します。
- 設定済みの変更管理システムに変更依頼を作成し、デプロイメントのBOM、証拠概要、およびピアレビューの準拠データを添付します。
- すべてのコンプライアンス基準が満たされている場合、変更依頼を自動的に承認します。 基準が完全に満たされていない場合でも、手動による承認や緊急タグ付けに対応しています。
- 変更リクエストが承認されたか、緊急としてタグ付けされると、インベントリからターゲット環境(ステージング環境や本番環境など)へアーティファクトをデプロイします。
- デプロイ後に受け入れテストおよび統合テストを実行し、デプロイが成功したこと、およびアプリケーションが期待どおりに動作していることを確認します。
- デプロイメントまたは受入テストの段階で障害が発生した場合、同じパイプラインの実行内でデプロイメントを自動的にロールバックし、インベントリ内の最後に正常だった状態を維持します。
- 変更リクエストを、
close_categoryとしてSuccessfulまたはSuccessful with issuesを指定してクローズし、<target-environment>_latestのインベントリタグをデプロイ済みのコミットに移動します。 - パイプラインの実行が終了するたびに、すべてのログファイル、アーティファクト、および証拠を収集し、証拠保管庫にアップロードします。
- デプロイが成功した後、必要に応じてマージされたプルリクエストに「
deploy:{region}:{env}」というラベルを付与し、パイプラインの詳細にアクセスすることなく、エンドツーエンドのデプロイのトレーサビリティを確保します。
継続的コンプライアンス(CC)ツールチェーンのベストプラクティス
DevSecOps のCCツールチェーンでは、以下の慣行に従っています:
- すべてのインベントリ対象リポジトリに対して
detect-secretsを実行し、アプリケーションのソースコード内のシークレット漏洩を特定します。 - インベントリ内で検出されたすべてのソースリポジトリに対して、静的コードスキャン( SonarQube、またはカスタム実装)を実行します。
- デプロイ済みのアプリケーションに対して、動的なアプリケーションセキュリティテスト(OWASP ZAP)を実行し、実行時の脆弱性を検出します。
- (Code Risk Analyzerなどの)ツールを使用して、すべてのインベントリ対象ソースリポジトリに対してコンプライアンスチェックを実行します。これには、脆弱性スキャン、 Kubernetes のデプロイメントマニフェストに対する CIS チェック、すべてのパッケージ依存関係に対するBOMチェック、およびブランチ保護の検証が含まれます。
- デプロイ済みのすべてのコンテナイメージをスキャンし、セキュリティ上の脆弱性を検出します。
- パイプラインの実行中に検出された個々のCVE、脆弱性、またはアラートごとにインシデントの課題を作成または更新し、各課題に期限を設定します。
- 各段階の証拠を証拠保管庫に収集し、スキャン結果と検査結果を対応する課題に添付し、スキャンされたすべてのアーティファクトのコンプライアンス状況を更新します。