LESSON 30分

ストーリー

高橋アーキテクト
セキュリティテストを手動でやっていたら、リリースのたびに膨大な時間がかかる

高橋アーキテクトがCI/CDパイプラインの図を描きました。

高橋アーキテクト
SAST、DAST、SCA。この3つのテストをパイプラインに組み込めば、コードを書くたびに自動でセキュリティチェックが走る。これがDevSecOpsの核心だ

セキュリティテストの3つの柱

テスト正式名称対象タイミング
SASTStatic Application Security Testingソースコードコミット時
DASTDynamic Application Security Testing実行中のアプリデプロイ後
SCASoftware Composition Analysis依存ライブラリビルド時

SAST(静的解析)

ソースコードを解析して、脆弱性パターンを検出します。実行せずにコードレベルで問題を発見できます。

// SASTが検出する脆弱性の例

// 1. SQLインジェクション
// SAST警告: ユーザー入力がSQL文に直接埋め込まれています
const getUser = (email: string) => {
  return db.query(`SELECT * FROM users WHERE email = '${email}'`); // 危険
};

// 2. XSS(クロスサイトスクリプティング)
// SAST警告: ユーザー入力がHTMLに直接挿入されています
const renderComment = (comment: string) => {
  return `<div>${comment}</div>`; // 危険
};

// 3. パストラバーサル
// SAST警告: ユーザー入力がファイルパスに使用されています
const readFile = (filename: string) => {
  return fs.readFileSync(`/uploads/${filename}`); // 危険
  // 攻撃者: filename = "../../etc/passwd"
};

主要なSASTツール

ツール言語特徴
Semgrep多言語高速、カスタムルール定義可能
SonarQube多言語品質+セキュリティ、豊富なルール
CodeQL多言語GitHub統合、クエリベース
ESLint SecurityJavaScript/TSESLintプラグインとして動作

DAST(動的解析)

実行中のアプリケーションに対してテストリクエストを送信し、脆弱性を検出します。

// DASTのテスト例(OWASP ZAPの自動スキャン)
interface DastScanConfig {
  target: string;          // テスト対象URL
  scanType: "baseline" | "full";
  authentication: {
    loginUrl: string;
    username: string;
    password: string;
  };
  excludePaths: string[];  // スキャン除外パス
  alertThreshold: "high" | "medium" | "low";
}

// GitHub Actions での DAST 実行例
const dastWorkflow = {
  name: "DAST Scan",
  on: { deployment_status: {} },
  jobs: {
    "zap-scan": {
      "runs-on": "ubuntu-latest",
      steps: [
        {
          name: "ZAP Baseline Scan",
          uses: "zaproxy/action-baseline@v0.7.0",
          with: {
            target: "https://staging.example.com",
            rules_file_name: ".zap/rules.tsv",
            cmd_options: "-a",
          },
        },
      ],
    },
  },
};

DASTが検出する脆弱性

脆弱性検出方法
XSSスクリプトを含むリクエストを送信
SQLインジェクションSQLペイロードを入力フィールドに送信
CSRFCSRFトークンなしでのリクエスト試行
セキュリティヘッダー不備レスポンスヘッダーの検証
情報漏洩エラーレスポンスの内容分析

SCA(ソフトウェア構成分析)

依存ライブラリの既知の脆弱性とライセンスの問題を検出します。

// SCAツールの実行(npm audit)
// npm audit --audit-level=moderate

// GitHub ActionsでのSCA実行例
const scaWorkflow = {
  name: "Dependency Check",
  on: { push: {}, pull_request: {} },
  jobs: {
    audit: {
      "runs-on": "ubuntu-latest",
      steps: [
        {
          name: "Install dependencies",
          run: "npm ci",
        },
        {
          name: "Security audit",
          run: "npm audit --audit-level=high",
        },
        {
          name: "License check",
          run: "npx license-checker --failOn 'GPL-3.0;AGPL-3.0'",
        },
        {
          name: "SBOM generation",
          run: "npx @cyclonedx/cyclonedx-npm --output-file sbom.json",
        },
      ],
    },
  },
};

主要なSCAツール

ツール特徴
npm auditNode.js標準、無料
Snyk多言語対応、修正提案付き
Trivyコンテナイメージもスキャン可能
DependabotGitHub統合、自動PR作成

CI/CDパイプラインへの統合

┌─────────┐   ┌─────────┐   ┌──────────┐   ┌─────────┐   ┌──────────┐
│  コミット │→│  SAST   │→│  ビルド   │→│  SCA    │→│  デプロイ │
│         │   │(静的解析)│   │          │   │(依存検査)│   │(ステージ) │
└─────────┘   └─────────┘   └──────────┘   └─────────┘   └────┬─────┘

                                                        ┌─────▼─────┐
                                                        │   DAST    │
                                                        │(動的解析)  │
                                                        └─────┬─────┘

                                                        ┌─────▼─────┐
                                                        │  本番     │
                                                        │  デプロイ  │
                                                        └───────────┘

まとめ

ポイント内容
SASTソースコードの静的解析、コミット時に実行
DAST実行中アプリの動的テスト、デプロイ後に実行
SCA依存ライブラリの脆弱性チェック、ビルド時に実行
統合CI/CDパイプラインに3つのテストを組み込む

チェックリスト

  • SAST、DAST、SCAの違いを理解した
  • 各テストが検出できる脆弱性を把握した
  • 主要なツールを把握した
  • CI/CDへの統合方法を理解した

次のステップへ

次は「セキュリティ監査ログの設計」を学びます。セキュリティイベントを記録し、インシデント対応に活用するためのログ設計を身につけましょう。


推定読了時間: 30分