defender-for-devops について
Azure Pipelines のセキュリティ担当者向けに、Microsoft Defender for DevOps の統合方法を解説するガイドです。Microsoft Security DevOps による複数種のスキャンと、パイプラインや Defender for Cloud での結果確認を扱います。
主な機能
- 01シークレット、コード、依存関係のスキャン
- 02IaC 設定とコンテナイメージの検査
- 03YAML のスキャン対象とビルドゲートの設定
- 04スキャン結果を SARIF 形式で公開
- 05誤検知、性能、タスクの問題の調査
活用シーン
- 01コミット時のパイプラインにスキャンを追加
- 02検出結果の深刻度に応じてビルドを停止
- 03Terraform、ARM、Kubernetes の設定を検査
- 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 拡張機能
インストール方法:
- Azure DevOps Marketplace からインストールします
- パイプライン YAML で設定します
- Scans タブで結果を確認します
- 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 を有効にする
- 組織レベルのポリシーを構成する
- 自動通知を設定する
- セキュリティダッシュボードを作成する
- 修復ワークフローを確立する
結果の表示
パイプライン内:
- パイプラインの実行に移動する
- 「スキャン」タブをクリックする
- 重大度別に検出結果を確認する
- 検出結果をクリックして詳細と修復方法を確認する
Defender for Cloud 内:
- Azure ポータル → Defender for Cloud
- DevOps セキュリティ
- すべてのパイプラインにわたる検出結果を表示する
- 重大度、プロジェクト、リポジトリで絞り込む
- 修復の進捗状況を追跡する
トラブルシューティング
よくある問題:
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"]
}
}
}
パフォーマンス:
- ツールのダウンロードをキャッシュする
- ブランチでスキャンするカテゴリーを制限する
- 大規模なリポジトリでは並列ステージを使用する