ストーリー
高橋アーキテクトがCI/CDパイプラインの図を描きました。
セキュリティテストの3つの柱
| テスト | 正式名称 | 対象 | タイミング |
|---|---|---|---|
| SAST | Static Application Security Testing | ソースコード | コミット時 |
| DAST | Dynamic Application Security Testing | 実行中のアプリ | デプロイ後 |
| SCA | Software 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 Security | JavaScript/TS | ESLintプラグインとして動作 |
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ペイロードを入力フィールドに送信 |
| CSRF | CSRFトークンなしでのリクエスト試行 |
| セキュリティヘッダー不備 | レスポンスヘッダーの検証 |
| 情報漏洩 | エラーレスポンスの内容分析 |
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 audit | Node.js標準、無料 |
| Snyk | 多言語対応、修正提案付き |
| Trivy | コンテナイメージもスキャン可能 |
| Dependabot | GitHub統合、自動PR作成 |
CI/CDパイプラインへの統合
┌─────────┐ ┌─────────┐ ┌──────────┐ ┌─────────┐ ┌──────────┐
│ コミット │→│ SAST │→│ ビルド │→│ SCA │→│ デプロイ │
│ │ │(静的解析)│ │ │ │(依存検査)│ │(ステージ) │
└─────────┘ └─────────┘ └──────────┘ └─────────┘ └────┬─────┘
│
┌─────▼─────┐
│ DAST │
│(動的解析) │
└─────┬─────┘
│
┌─────▼─────┐
│ 本番 │
│ デプロイ │
└───────────┘
まとめ
| ポイント | 内容 |
|---|---|
| SAST | ソースコードの静的解析、コミット時に実行 |
| DAST | 実行中アプリの動的テスト、デプロイ後に実行 |
| SCA | 依存ライブラリの脆弱性チェック、ビルド時に実行 |
| 統合 | CI/CDパイプラインに3つのテストを組み込む |
チェックリスト
- SAST、DAST、SCAの違いを理解した
- 各テストが検出できる脆弱性を把握した
- 主要なツールを把握した
- CI/CDへの統合方法を理解した
次のステップへ
次は「セキュリティ監査ログの設計」を学びます。セキュリティイベントを記録し、インシデント対応に活用するためのログ設計を身につけましょう。
推定読了時間: 30分