概要
このモジュールでは、 DevSecOps の原則とプラクティスを通じて、ソフトウェア開発ライフサイクルのすべての段階にセキュリティを統合する方法について説明しました。 リリース前にセキュリティを最終チェックポイントとして扱う従来のアプローチでは、ボトルネックが発生し、コストが増加し、多くの場合、運用環境まで重大な脆弱性をキャッチできません。 セキュリティを左にシフトし、すべてのユーザーの責任を負うことで、組織は開発速度を維持しながら、セキュリティ体制を大幅に向上させることができます。
SQL インジェクション攻撃
SQL インジェクションが最も危険で一般的な Web アプリケーションの脆弱性の 1 つであるしくみについて学習しました。
- 攻撃メカニズム: 攻撃者は、悪意のある SQL コードをアプリケーション入力に挿入し、入力検証が不十分であるため、データベース クエリを操作します。
- 潜在的な損傷: 攻撃が成功すると、認証をバイパスしたり、データベースの内容全体を取得したり、レコードを変更または削除したり、オペレーティング システム コマンドを実行したり、サービス拒否を引き起こしたりすることができます。
- 広範囲にわたる影響: SQL インジェクションは、MySQL、Oracle Database、Microsoft SQL Server、PostgreSQL、SQLite を含むすべての主要なデータベース システムに影響します。
- 予防の要点: パラメーター化されたクエリ、入力の検証とサニタイズ、最小限の特権の原則の適用、定期的なセキュリティ テストの実施、データベース アクティビティの監視を使用して、SQL インジェクションから保護します。
DevSecOps の原則
DevSecOps が障害からイネーブラーにセキュリティを変換する方法について説明しました。
- クラウド アプリケーションのセキュリティギャップ: 多くのアプリケーションには、保存データと転送中のデータの暗号化ギャップがあり、HTTP セキュリティ ヘッダーなどの適切なセッション保護メカニズムがありません。
- 従来の問題: 従来のアプローチでは、開発サイクルの終わりに計画外の作業が発生し、高価な手直しが必要となり、リリースプロセスのボトルネックが生じ、セキュリティ上の懸念が優先度を下げられます。
- DevSecOps ソリューション: 開発の開始時からセキュリティを統合し、開発チーム、運用チーム、およびセキュリティ チーム全体で責任を共有します。
- 拡張されたセキュリティ スコープ: DevSecOps は、従来のアクセス制御と境界保護だけでなく、リポジトリ、ビルド サーバー、成果物ストレージ、デプロイ ツール、コードとしてのインフラストラクチャ、構成管理、シークレット管理など、パイプライン全体をセキュリティで保護します。
- コードとしてのセキュリティ: インフラストラクチャ セキュリティ (IaC スキャン、コードとしてのポリシー、コンプライアンス チェック) とアプリケーション セキュリティ (SAST、DAST、SCA、コンテナー スキャン) の両方を自動化して、継続的なセキュリティ検証を有効にします。
セキュリティで保護された DevOps パイプライン
セキュリティで保護されたパイプラインが重要なセキュリティ機能を使用して標準 CI/CD を拡張する方法を調べました。
- セキュリティ承認を使用したパッケージ管理: コードベースにサードパーティコンポーネントを許可する前に、パッケージの既知の脆弱性のスキャン、ライセンスの確認、依存関係の分析、新しいセキュリティの問題の継続的な監視を行う承認ワークフローを実装します。
- ソース コードのセキュリティ スキャン: 静的アプリケーション セキュリティ テスト (SAST) をデプロイして、コードを実行せずに分析し、資格情報の漏えいを防ぐためのシークレット スキャン、および脆弱性につながる問題を特定するためのコード品質分析をデプロイします。
- スキャンのタイミング: ビルドの完了後、テストとデプロイの前にセキュリティ チェックを実行し、修復コストが最も低い場合の早期検出を提供します。
- ツールの統合: パイプラインに直接統合された GitHub CodeQL、SonarQube、Checkmarx、Veracode、Microsoft Security Code Analysis などのツールを使用します。
主要な検証ポイント
開発プロセス全体で重要な セキュリティ チェックポイント を検出しました。
- IDE レベルのセキュリティ チェック: コードの書き込み中にリアルタイムのフィードバック、即時の学習機会、コミット前の修正を使用して脆弱性をキャッチし、フィードバック ループを数秒に短縮します。
- リポジトリコミットコントロール: 変更をマージする前に、コード レビュー、監査証跡の作業項目リンケージ、成功した CI ビルドを必要とする Git ブランチ ポリシーを実装します。
- コード レビューの要件: 入力の検証、認証と承認のメカニズム、機密データの処理、セキュリティ ライブラリの使用、ハードコーディングされたシークレットがないなど、セキュリティに関する問題を手動で検証します。
- プル要求の自動チェック: プル要求インターフェイスに結果を直接表示して、静的分析、依存関係の脆弱性チェック、シークレット検出、コード品質分析を実行します。
- 段階的な実装: 成熟した製品の場合は、検証ポイントを徐々に採用し、影響の大きいチェックポイントの優先順位を付け、時間の経過と同時にセキュリティ カルチャを構築します。
継続的なセキュリティ検証
ソフトウェア ライフサイクル全体にわたって 継続的な検証 によってセキュリティが維持されるしくみについて学習しました。
- サードパーティコンポーネントのリスク: 最新のアプリケーションは、オープンソースとサードパーティのパッケージに大きく依存しており、セキュリティの脆弱性、ライセンス コンプライアンスの問題、サプライ チェーン攻撃ベクトルが導入されています。
- 早期検出の値: 開発中の脆弱性の検出コストは、運用環境で修正するよりも 10 ~ 100 倍少なく、自動スキャンが経済的に重要になります。
- 静的コード分析: SonarQube、Visual Studio Code Analysis、Checkmarx、BinSkim、言語固有のアナライザーなどのツールを使用して、コードがセキュリティと保守容易性の規則に従っていることを確認します。
- 脆弱性スキャン: Mend (WhiteSource)、GitHub Dependabot、Snyk、Azure Artifacts などのツールを使用して、依存関係の既知の脆弱性の検出を自動化します。このツールは、継続的に監視、リスクの優先順位付け、修復ガイダンスを提供します。
- ソフトウェア構成分析の利点: すべての依存関係の包括的な可視化、バージョンの追跡、保持されていないパッケージの特定、CVSS スコアによるリスクの優先順位付け、継続的な監視の維持、コンプライアンス ドキュメントの生成を行います。
脅威モデリング手法
セキュリティ リスクを理解するための構造化されたアプローチとして 、脅威モデリング について説明しました。
- 5 段階のプロセス: セキュリティ要件 (機密性、整合性、可用性、コンプライアンス) を定義し、アプリケーションダイアグラム (コンポーネント、データ フロー、セキュリティ境界) を作成し、STRIDE 手法を使用して脅威を特定し、軽減戦略を開発 (排除、防止、検出、対応)、軽減策が引き続き有効であることを検証します。
- STRIDE 手法: スプーフィング ID、データの改ざん、アクションの否認、情報漏えい、サービス拒否、特権の昇格という 6 つのカテゴリの脅威を体系的に検討します。
- 一般的な脅威と軽減策: パラメーター化されたクエリと入力検証を使用して SQL インジェクションに対処し、セキュリティで保護されたセッション管理と HTTPS によるセッション ハイジャックを防ぎ、TLS と証明書のピン留めによる中間者攻撃から保護し、クラウド保護サービスとレート制限を使用して DDoS を軽減します。
- ライフサイクル統合: 初期設計時に包括的な脅威モデリングを実施し、重要な新機能を繰り返し、大きな変更がなくても定期的なレビューを実行し、セキュリティ インシデント後に更新し、時間の経過と同時にリスクを段階的に軽減します。
- Microsoft Threat Modeling Tool: この無料ツールを使用して、システム コンポーネントを標準表記で視覚化し、システム構造に基づいて潜在的な脅威を自動的に生成し、軽減の決定を文書化し、実装状態を追跡し、Azure DevOps と統合します。
CodeQL の自動セキュリティ分析
GitHub CodeQL を使用して高度な自動セキュリティ分析を実現する方法について学習しました。
- セマンティック コード分析: CodeQL では、構文ツリー、制御フロー グラフ、およびデータ フロー パスをキャプチャするクエリ可能なデータベースに変換することで、コードをデータとして扱います。これにより、パターン マッチングだけでなく、コード コンテキストを理解する正確な脆弱性検出が可能になります。
- 3 相分析: コードの構造を表す CodeQL データベースを作成し、データベースに対してクエリを実行してセキュリティの問題を見つけ、優先順位付け、コンテキスト情報、修復ガイダンスを使用して結果を解釈します。
- CodeQL クエリ言語: OWASP Top 10 の脆弱性と CWE カテゴリ用の広範な標準クエリ ライブラリを使用して、オブジェクト指向のロジック プログラミングを使用して、検索方法ではなく検索対象を記述する宣言型クエリを記述します。
- GitHub 統合: 1 回のクリックでコード スキャンを有効にし、脆弱なコード行を示すプル要求でインライン注釈を受け取り、マージ前に合格する必要がある必須チェックとして CodeQL を構成し、詳細な説明を含む [セキュリティ] タブですべての結果を表示します。
- CI/CD パイプライン統合: コマンド ライン インターフェイスを使用して、GitHub Actions、Azure Pipelines、Jenkins、GitLab CI/CD、CircleCI、およびカスタム システムで CodeQL を使用し、重大度の高い脆弱性が検出されたときにビルドに失敗するセキュリティ ゲートを構成します。
- 開発ツール: 構文の強調表示、オートコンプリート、ローカル分析、デバッグのサポートを提供する CodeQL 拡張機能を使用して、Visual Studio Code でクエリを記述およびテストします。
重要なポイント
組織で DevSecOps を実装するときは、次の重要な原則を覚えておいてください。
セキュリティは、すべてのユーザーの責任です。 セキュリティはセキュリティ チームのみに属するという考え方を超えます。 開発者、運用エンジニア、テスト担当者、およびビジネス利害関係者はすべて、アプリケーションのセキュリティに貢献します。 セキュリティが別の機能ではなく、すべてのユーザーの毎日の作業の一部になると、セキュリティで保護されたプラクティスが既定のカルチャを作成します。
セキュリティを左にシフト: 可能な限り早い段階でセキュリティ上の懸念に対処します。 開発中に脆弱性を見つけて修正することで、運用環境で修正するよりも大幅に低いコストで実現可能です。多くの場合、その費用は10倍から100倍も少なくなります。 IDE、コード レビュー プロセス、および CI パイプラインにセキュリティ チェックを統合することで、修正が最も簡単で最も安価な問題をキャッチできます。
セキュリティ検証を自動化する: 手動のセキュリティ レビューは、最新のリリース周期にはスケーリングされません。 静的コード分析、依存関係の脆弱性スキャン、シークレット検出、およびコード品質のセキュリティ チェックを自動化します。 Automation は、開発速度を遅くすることなく、すべてのコミットに一貫したセキュリティ検証を提供します。
継続的に検証する: セキュリティはリリース前の 1 回限りではありません。 開発者の IDE、コード レビュー中、CI ビルド、デプロイ前、運用環境など、複数のステージでセキュリティ検証を実装します。 継続的な検証により、問題をキャッチする複数の機会が生み出され、多層防御が提供されます。
脅威モデリングを事前に使用する: セキュリティ インシデントが脅威について考えるのを待つ必要はありません。 初期設計時および重要な機能の追加時に、構造化された脅威モデリングを使用します。 STRIDE 手法は、セキュリティの専門家以外がコードを記述する前に脅威を特定し、軽減策を計画するために適用できる体系的なアプローチを提供します。
自動分析ツールを活用する: CodeQL、SonarQube、Snyk などのツールを使用すると、手動では実行できない高度なセキュリティ分析が可能になります。 これらのツールは、コード セマンティクスを理解し、データ フローを追跡し、大規模なコードベース全体で複雑な脆弱性を見つけます。 それらをパイプラインに統合して、高度なセキュリティ分析ルーチンを作成します。
依存関係の追跡と管理: 最新のアプリケーションは、サードパーティのコンポーネントに大きく依存しています。 依存関係の自動スキャンでは、依存関係の既知の脆弱性とライセンス コンプライアンスの問題が識別されます。 ソフトウェア構成分析は、サプライ チェーンを可視化し、新しい脆弱性が開示されたときに迅速に対応するのに役立ちます。
セキュリティに関する決定事項を文書化する: 脅威モデリングのドキュメント、セキュリティ要件、自動化されたツール出力を使用して、セキュリティ上の懸念に対処した方法を示す監査証跡を作成します。 このドキュメントでは、デュー デリジェンスを示し、新しいチーム メンバーがセキュリティ コンテキストを理解し、コンプライアンス要件の証拠を提供します。
速度とセキュリティのバランス: DevSecOps は、セキュリティ チェックを追加するための開発速度の低下ではなく、速度を妨げないようにセキュリティを効率的に統合することです。 通常のワークフローに組み込まれている自動化されたツール、明確なポリシー、セキュリティにより、チームはセキュリティを損なうことなく迅速に移行できます。
反復処理と改善: 影響の大きいセキュリティ プラクティスから始めて、時間の経過と共に拡張します。 すべてのセキュリティ制御をすぐに実装する必要はありません。 依存関係の自動スキャンまたはプル要求のセキュリティ チェックから始め、価値を示し、より高度な検証ポイントを徐々に追加します。 セキュリティの継続的な改善は、DevOps 自体の反復的なアプローチを反映しています。
これらの DevSecOps プラクティスを適用することで、迅速に提供され、設計によってセキュリティで保護されるソフトウェアを作成します。 セキュリティは障害ではなくイネーブラーになり、組織は自信を持ってイノベーションを起こすことができます。
詳細情報
- DevSecOps ツールとサービス | Microsoft Azure。
- Azure と GitHub で DevSecOps を有効にする - DevSecOps | Microsoft Learn。
- Advanced Threat Protection - Azure SQL Database、SQL Managed Instance、Azure Synapse Analytics | Microsoft Learn。
- Azure Pipelines のセキュリティ保護 - Azure Pipelines | Microsoft Learn。
- SQL インジェクション - SQL Server | Microsoft Learn.
- CodeQL の概要。
- Microsoft Threat Modeling Tool の概要。