ストーリー
佐
佐藤CTO
ゼロトラストの設計ができた。次は開発プロセスにセキュリティを組み込む番だ
佐藤CTOがCI/CDパイプラインの図を見せました。
佐
佐藤CTO
今のパイプラインにはセキュリティチェックが入っていない。リリース直前にセキュリティレビューをやっているが、手遅れになることが多い
あなた
Shift Left — セキュリティを開発の早い段階に移すんですね
あ
佐
佐藤CTO
その通り。DevSecOpsは開発速度を落とさずにセキュリティを自動化する方法だ。パイプラインに組み込めば、人手に頼らず継続的にセキュリティを担保できる
DevSecOpsとは
DevOpsからDevSecOpsへ
graph LR
subgraph DevOps
D1["Dev"] <--> O1["Ops"]
end
subgraph DevSecOps
D2["Dev"] <--> S2["Sec"] <--> O2["Ops"]
end
| 観点 | 従来のセキュリティ | DevSecOps |
|---|
| タイミング | リリース前のセキュリティレビュー | 開発ライフサイクル全体に組み込み |
| 責任 | セキュリティチームのみ | 全員がセキュリティに責任を持つ |
| 手法 | 手動レビュー、年1回のペネトレーションテスト | 自動スキャン、継続的テスト |
| フィードバック | 遅い(数週間〜数ヶ月) | 即座(数分〜数時間) |
| コスト | 修正コストが高い(後工程) | 修正コストが低い(早期発見) |
Shift Left セキュリティ
xychart-beta
title "発見タイミングと修正コスト(Shift Left)"
x-axis ["要件", "設計", "コード", "ビルド", "テスト", "本番"]
y-axis "修正コスト(倍)" 0 --> 110
bar [1, 5, 10, 30, 60, 100]
DevSecOpsパイプライン
セキュリティゲートの配置
graph LR
C["Code"] --> B["Build"] --> T["Test"] --> R["Release"] --> D["Deploy"] --> M["Monitor"]
C --> CS["Secret Scan<br/>Lint<br/>Pre-commit"]
B --> BS["SAST<br/>SCA<br/>Build Verify"]
T --> TS["DAST<br/>API Test<br/>Pen Test"]
R --> RS["Image Scan<br/>Sign<br/>SBOM"]
D --> DS["Policy Check<br/>IAC Scan"]
M --> MS["SIEM<br/>WAF<br/>EDR<br/>Audit"]
style CS fill:#fff3e0,stroke:#e65100
style BS fill:#fff3e0,stroke:#e65100
style TS fill:#fff3e0,stroke:#e65100
style RS fill:#fff3e0,stroke:#e65100
style DS fill:#fff3e0,stroke:#e65100
style MS fill:#fff3e0,stroke:#e65100
各フェーズのセキュリティツール
| フェーズ | セキュリティ活動 | ツール例 |
|---|
| Code | シークレットスキャン、Linting | GitLeaks, Semgrep, ESLint Security |
| Build | SAST、SCA、ライセンスチェック | SonarQube, Snyk, FOSSA |
| Test | DAST、APIテスト、ファジング | OWASP ZAP, Burp Suite, AFL |
| Release | コンテナスキャン、SBOM生成、署名 | Trivy, Syft, Cosign |
| Deploy | IaCスキャン、ポリシーチェック | tfsec, Checkov, OPA |
| Monitor | SIEM、WAF、異常検知 | Datadog, Falco, CloudTrail |
GitHub Actions でのセキュリティパイプライン
# .github/workflows/security-pipeline.yml
name: Security Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
# Phase 1: コード品質とシークレットスキャン
code-security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # 全履歴を取得(シークレットスキャン用)
- name: Secret Scanning (GitLeaks)
uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Semgrep SAST
uses: semgrep/semgrep-action@v1
with:
config: >-
p/security-audit
p/owasp-top-ten
p/typescript
# Phase 2: 依存関係の脆弱性チェック
dependency-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Snyk SCA
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: --severity-threshold=high
- name: License Compliance
run: |
npx license-checker --failOn "GPL-3.0;AGPL-3.0"
# Phase 3: コンテナセキュリティ
container-security:
runs-on: ubuntu-latest
needs: [code-security, dependency-check]
steps:
- uses: actions/checkout@v4
- name: Build Docker Image
run: docker build -t app:${{ github.sha }} .
- name: Trivy Container Scan
uses: aquasecurity/trivy-action@master
with:
image-ref: app:${{ github.sha }}
format: sarif
output: trivy-results.sarif
severity: CRITICAL,HIGH
exit-code: 1
- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
image: app:${{ github.sha }}
format: spdx-json
output-file: sbom.spdx.json
# Phase 4: IaCセキュリティ
iac-security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Checkov IaC Scan
uses: bridgecrewio/checkov-action@master
with:
directory: ./infrastructure
framework: terraform,cloudformation
soft_fail: false
# セキュリティゲート: 全チェック通過後のみマージ許可
security-gate:
runs-on: ubuntu-latest
needs: [code-security, dependency-check, container-security, iac-security]
steps:
- name: Security Gate Passed
run: echo "All security checks passed"
DevSecOps成熟度モデル
| レベル | 名称 | 特徴 |
|---|
| Level 0 | Ad Hoc | セキュリティチェックなし、手動対応のみ |
| Level 1 | Reactive | 脆弱性スキャンを定期的に実施、手動トリアージ |
| Level 2 | Proactive | CI/CDにSAST/SCA統合、自動ブロック |
| Level 3 | Managed | 全フェーズにセキュリティゲート、メトリクス管理 |
| Level 4 | Optimized | AI/ML異常検知、自動修正、継続的改善 |
成熟度評価チェック
// DevSecOps成熟度の自己評価
interface DevSecOpsMaturity {
codePhase: {
preCommitHooks: boolean; // Level 1+
secretScanning: boolean; // Level 1+
sastIntegrated: boolean; // Level 2+
customRules: boolean; // Level 3+
autoFix: boolean; // Level 4
};
buildPhase: {
scaEnabled: boolean; // Level 1+
licenseCheck: boolean; // Level 2+
breakBuildOnHigh: boolean; // Level 2+
sbomGeneration: boolean; // Level 3+
};
deployPhase: {
containerScanning: boolean; // Level 2+
imageSigning: boolean; // Level 3+
iacScanning: boolean; // Level 2+
policyAsCode: boolean; // Level 3+
};
monitorPhase: {
siemIntegrated: boolean; // Level 2+
runtimeProtection: boolean; // Level 3+
anomalyDetection: boolean; // Level 4
autoRemediation: boolean; // Level 4
};
culture: {
securityChampions: boolean; // Level 2+
securityTraining: boolean; // Level 1+
sharedResponsibility: boolean; // Level 3+
gamification: boolean; // Level 4
};
}
セキュリティメトリクス
| メトリクス | 説明 | 目標値 |
|---|
| MTTR(Mean Time to Remediate) | 脆弱性発見から修正までの平均時間 | Critical: 24h, High: 7d |
| 脆弱性密度 | 1000行あたりの脆弱性数 | < 1.0 |
| シークレット漏洩率 | PRに含まれるシークレットの割合 | 0% |
| セキュリティテストカバレッジ | セキュリティテストが実行されるパイプラインの割合 | > 95% |
| False Positive率 | 誤検知の割合 | < 10% |
| パイプライン通過率 | セキュリティゲートを通過するビルドの割合 | > 90% |
まとめ
| ポイント | 内容 |
|---|
| DevSecOps | 開発ライフサイクル全体にセキュリティを組み込む |
| Shift Left | セキュリティを早い段階で実施し、修正コストを削減 |
| セキュリティゲート | 各フェーズにセキュリティチェックポイントを配置 |
| 自動化 | SAST/SCA/DAST/コンテナスキャンをCI/CDに統合 |
| 成熟度モデル | Ad Hoc → Reactive → Proactive → Managed → Optimized |
チェックリスト
次のステップへ
次は「SAST・SCA・シークレットスキャン」を学びます。コードレベルのセキュリティスキャンツールの具体的な導入方法と運用を身につけましょう。
推定読了時間: 40分