mcpField
D
defender-for-devops

defender-for-devops

github.com/josiahsiegelセキュリティ59162 回インストール19 週間前に更新
リポジトリ

defender-for-devops について

Azure Pipelines のセキュリティ担当者向けに、Microsoft Defender for DevOps の統合方法を解説するガイドです。Microsoft Security DevOps による複数種のスキャンと、パイプラインや Defender for Cloud での結果確認を扱います。

主な機能

  1. 01シークレット、コード、依存関係のスキャン
  2. 02IaC 設定とコンテナイメージの検査
  3. 03YAML のスキャン対象とビルドゲートの設定
  4. 04スキャン結果を SARIF 形式で公開
  5. 05誤検知、性能、タスクの問題の調査

活用シーン

  1. 01コミット時のパイプラインにスキャンを追加
  2. 02検出結果の深刻度に応じてビルドを停止
  3. 03Terraform、ARM、Kubernetes の設定を検査
  4. 04Defender for Cloud で複数パイプラインの検出結果を確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/josiahsiegel/claude-plugin-marketplace --skill defender-for-devops

インストール後、Claude Code で/defender-for-devopsを入力して読み込まれたか確認します。

詳細

🚨 重大なガイドライン

Windows のファイルパス要件

必須:Windows ではファイルパスに必ずバックスラッシュを使用してください

Windows で Edit または Write ツールを使用する場合、ファイルパスには必ずバックスラッシュ(\)を使用し、スラッシュ(/)は使用しないでください。

例:

  • ❌ 誤り:D:/repos/project/file.tsx
  • ✅ 正しい:D:\repos\project\file.tsx

これは次の項目に適用されます。

  • Edit ツールの file_path パラメーター
  • Write ツールの file_path パラメーター
  • Windows システムでのすべてのファイル操作
ドキュメント作成のガイドライン

ユーザーから明示的に依頼されない限り、新しいドキュメントファイルを作成しないでください。

  • 優先事項:新しいドキュメントを作成するのではなく、既存の README.md ファイルを更新してください
  • リポジトリの整理:ユーザーから別途依頼がない限り、リポジトリのルートは README.md のみとし、整理された状態を保ってください
  • スタイル:ドキュメントは簡潔、明快、かつ専門的にし、AI が生成したような文体は避けてください
  • ユーザーの希望:ユーザーからドキュメント作成を明示的に依頼された場合に限り、追加の .md ファイルを作成してください

Microsoft Defender for DevOps の統合

Azure Pipelines に Microsoft Defender for Cloud のセキュリティスキャンを統合するための完全ガイドです。

概要

Microsoft Security DevOps(MSDO)は、包括的なセキュリティスキャン機能を提供します。

  • SAST: 静的アプリケーションセキュリティテスト
  • シークレット検出: ハードコードされたシークレットや認証情報を特定します
  • 依存関係スキャン: 脆弱なパッケージを検出します
  • IaC スキャン: Infrastructure as Code のセキュリティ分析を行います
  • コンテナーのスキャン: Trivy によるイメージの脆弱性評価

Microsoft Security DevOps 拡張機能

インストール方法:

  1. Azure DevOps Marketplace からインストールします
  2. パイプライン YAML で設定します
  3. Scans タブで結果を確認します
  4. Defender for Cloud と統合します

拡張機能の機能:

  • 結果を SARIF 形式に変換します
  • Scans タブに検出結果を表示します
  • 複数のセキュリティツールを統合します
  • セキュリティに関する分析情報を一元的に提供します

YAML での統合

基本的な MSDO タスク
trigger:
  branches:
    include:
      - main
      - develop

pool:
  vmImage: 'ubuntu-24.04'

stages:
  - stage: Build
    jobs:
      - job: BuildAndScan
        steps:
          - task: UseDotNet@2
            displayName: 'Install .NET SDK'
            inputs:
              version: '8.x'

          - task: DotNetCoreCLI@2
            displayName: 'Build Project'
            inputs:
              command: 'build'
              projects: '**/*.csproj'

          # Microsoft Security DevOps Scan
          - task: MicrosoftSecurityDevOps@1
            displayName: 'Run Microsoft Security DevOps'
            inputs:
              categories: 'secrets,code,dependencies,IaC,containers'
              break: false  # Don't fail pipeline on findings

          # Publish SARIF results
          - task: PublishSecurityAnalysisLogs@3
            displayName: 'Publish Security Analysis Logs'
            inputs:
              ArtifactName: 'CodeAnalysisLogs'

          # Display results in Scans tab
          - task: PostAnalysis@2
            displayName: 'Post Analysis'
            inputs:
              break: false
ビルドを失敗させる高度な設定
- task: MicrosoftSecurityDevOps@1
  displayName: 'Security Scanning (Break on Critical)'
  inputs:
    # Scan categories
    categories: 'secrets,code,dependencies,IaC,containers'

    # Break build on severity
    break: true
    breakSeverity: 'critical'  # Options: critical, high, medium, low

    # Tool configuration
    tools: 'all'  # Or specific: 'credscan,eslint,trivy'

    # Output configuration
    publishResults: true

  continueOnError: false
条件付きスキャン
# Full scan on main, quick scan on branches
- task: MicrosoftSecurityDevOps@1
  displayName: 'Security Scan'
  inputs:
    categories: ${{ if eq(variables['Build.SourceBranch'], 'refs/heads/main') }}:
      value: 'secrets,code,dependencies,IaC,containers'
    ${{ else }}:
      value: 'secrets,code'
    break: ${{ eq(variables['Build.SourceBranch'], 'refs/heads/main') }}

統合されたセキュリティツール

1. シークレットスキャン

置き換え対象: CredScan は 2023 年 9 月に非推奨になりました
現在の選択肢: Azure DevOps 向け GitHub Advanced Security、または MSDO のシークレットスキャン

# MSDO secrets scanning
- task: MicrosoftSecurityDevOps@1
  inputs:
    categories: 'secrets'
    break: true  # Always break on secrets

一般的に検出されるシークレット:

  • API キーとトークン
  • データベース接続文字列
  • クラウドプロバイダーの認証情報
  • SSH 秘密鍵
  • OAuth トークン
2. 静的コード分析(SAST)
- task: MicrosoftSecurityDevOps@1
  displayName: 'SAST Scan'
  inputs:
    categories: 'code'
    tools: 'eslint,bandit,semgrep'

対応言語:

  • JavaScript/TypeScript(ESLint)
  • Python(Bandit)
  • Go(gosec)
  • Java(SpotBugs)
  • C#(.NET Security Guard)
3. 依存関係スキャン
- task: MicrosoftSecurityDevOps@1
  displayName: 'Dependency Scan'
  inputs:
    categories: 'dependencies'
    tools: 'trivy,govulncheck'

検出対象:

  • 依存関係に含まれる既知の CVE
  • 古いパッケージ
  • ライセンスコンプライアンスの問題
  • 推移的な脆弱性
4. Infrastructure as Code(IaC)スキャン
- task: MicrosoftSecurityDevOps@1
  displayName: 'IaC Security Scan'
  inputs:
    categories: 'IaC'
    tools: 'terrascan,checkov,templateanalyzer'

スキャン対象:

  • Terraform の設定
  • ARM テンプレート
  • Bicep ファイル
  • Kubernetes マニフェスト
  • CloudFormation テンプレート
5. コンテナーイメージのスキャン
- task: MicrosoftSecurityDevOps@1
  displayName: 'Container Security Scan'
  inputs:
    categories: 'containers'
    tools: 'trivy'

Trivy のスキャン対象:

  • OS の脆弱性
  • アプリケーションの依存関係
  • 設定ミス
  • イメージ内のシークレット
  • ライセンスの問題

Defender for Cloud との統合

Defender for DevOps を有効にする
# Pipeline automatically sends results to Defender for Cloud
# when MSDO extension is connected

- task: MicrosoftSecurityDevOps@1
  displayName: 'Scan and send to Defender'
  inputs:
    categories: 'all'
    publishResults: true

# Results appear in:
# Defender for Cloud → DevOps Security → Findings

メリット:

  • セキュリティダッシュボードの一元化
  • パイプライン間の分析情報
  • コンプライアンスレポート
  • セキュリティ傾向の分析
  • Azure Security Center との統合

セキュリティパイプラインの完全な例

trigger:
  branches:
    include:
      - main
      - develop

pool:
  vmImage: 'ubuntu-24.04'

variables:
  - name: breakOnCritical
    value: ${{ eq(variables['Build.SourceBranch'], 'refs/heads/main') }}

stages:
  - stage: SecurityScan
    displayName: 'Security Analysis'
    jobs:
      - job: StaticAnalysis
        displayName: 'Static Security Analysis'
        steps:
          - checkout: self
            fetchDepth: 1

          # Install dependencies
          - task: NodeTool@0
            inputs:
              versionSpec: '20.x'

          - script: npm ci
            displayName: 'Install dependencies'

          # Build application
          - script: npm run build
            displayName: 'Build application'

          # Docker build for container scanning
          - task: Docker@2
            displayName: 'Build Docker image'
            inputs:
              command: 'build'
              Dockerfile: 'Dockerfile'
              tags: '$(Build.BuildId)'

          # Comprehensive security scan
          - task: MicrosoftSecurityDevOps@1
            displayName: 'Microsoft Security DevOps Scan'
            inputs:
              categories: 'secrets,code,dependencies,IaC,containers'
              break: $(breakOnCritical)
              breakSeverity: 'high'
              tools: 'all'

          # Publish SARIF results
          - task: PublishSecurityAnalysisLogs@3
            displayName: 'Publish SARIF Logs'
            inputs:
              ArtifactName: 'CodeAnalysisLogs'
              ArtifactType: 'Container'

          # Post-analysis with results
          - task: PostAnalysis@2
            displayName: 'Security Post Analysis'
            inputs:
              break: $(breakOnCritical)

          # Generate security report
          - script: |
              echo "Security scan completed"
              echo "Results available in Scans tab"
            displayName: 'Security Summary'
            condition: always()

  - stage: Deploy
    dependsOn: SecurityScan
    condition: succeeded()
    jobs:
      - deployment: DeployApp
        environment: 'production'
        strategy:
          runOnce:
            deploy:
              steps:
                - script: echo "Deploying secure application"

高度なセキュリティ機能(2025 年提供予定)

ロードマップ上の機能:

  • プルリクエストのビルド検証
  • アラートの重大度に応じたパイプラインの停止
  • 高度な Security ダッシュボード
  • カスタム CodeQL クエリ
  • GitHub Advanced Security との統合

Azure DevOps 向け GitHub Advanced Security

シークレットスキャンにおける MSDO の代替手段:

# Requires GitHub Advanced Security license
# Provides:
# - Secret scanning
# - Code scanning with CodeQL
# - Dependency vulnerability alerts
# - Security overview dashboard

# Configuration in Azure DevOps organization settings
# Scans run automatically on commits and PRs

ベストプラクティス

パイプラインのセキュリティ:

  • すべてのコミットでセキュリティスキャンを実行する
  • 重大度が「重大」または「高」の検出結果がある場合は、ビルドを中断する
  • コードと依存関係の両方をスキャンする
  • IaC セキュリティの検証を含める
  • プッシュする前にコンテナーイメージをスキャンする
  • 検出結果を定期的に確認する

構成:

# Recommended configuration
- task: MicrosoftSecurityDevOps@1
  inputs:
    categories: 'secrets,code,dependencies,IaC,containers'
    break: true
    breakSeverity: 'high'  # Adjust based on risk tolerance
    publishResults: true

統合:

  • Azure ポータルで Defender for DevOps を有効にする
  • 組織レベルのポリシーを構成する
  • 自動通知を設定する
  • セキュリティダッシュボードを作成する
  • 修復ワークフローを確立する

結果の表示

パイプライン内:

  1. パイプラインの実行に移動する
  2. 「スキャン」タブをクリックする
  3. 重大度別に検出結果を確認する
  4. 検出結果をクリックして詳細と修復方法を確認する

Defender for Cloud 内:

  1. Azure ポータル → Defender for Cloud
  2. DevOps セキュリティ
  3. すべてのパイプラインにわたる検出結果を表示する
  4. 重大度、プロジェクト、リポジトリで絞り込む
  5. 修復の進捗状況を追跡する

トラブルシューティング

よくある問題:

MSDO タスクが失敗する場合:

# Enable verbose logging
- task: MicrosoftSecurityDevOps@1
  env:
    MSDO_VERBOSE: true
  inputs:
    categories: 'all'

誤検知:

# Suppress findings with .gdnconfig file
# In repository root:
{
  "tools": {
    "trivy": {
      "enabled": true,
      "severities": ["CRITICAL", "HIGH"]
    }
  }
}

パフォーマンス:

  • ツールのダウンロードをキャッシュする
  • ブランチでスキャンするカテゴリーを制限する
  • 大規模なリポジトリでは並列ステージを使用する

リソース

コメント