Skip to content

Buổi 12: Security Gate — Snyk + Aikido

Mục Tiêu Học Tập

Sau buổi này, bạn sẽ:

  • Hiểu chính sách thực thi bảo mật 3 cấp độ
  • Triển khai Snyk CLI để quét lỗ hổng dependencies
  • Cấu hình Aikido security gates trong CI/CD
  • Thiết lập escalation protocol cho phát hiện rủi ro
  • Implement PR gating Phase 2.5 với security checks

LÝ THUYẾT

1. Enforcement Policy — 3 Cấp Độ

Security gates hoạt động theo chính sách phân cấp:

Cấp ĐộĐiều KiệnHành Động
SUGGESTEDUser projects, không phát hiện rủi roCảnh báo, build vẫn pass
MANDATORYCodyMaster internal projectsBuild phải pass tất cả checks
ESCALATED MANDATORYRisk detected (HIGH/CRITICAL)Tự động escalate, yêu cầu phê duyệt

Quy trình Escalation:

  1. Phát hiện lỗ hổng HIGH/CRITICAL
  2. Tự động trigger full security scan
  3. Gửi notification cho security team
  4. Block merge cho đến khi remediate

2. Dual Security Architecture

TaskFlow sử dụng hai công cụ bảo mật chính:

┌─────────────────────────────────────────┐
│     Dual Security Layer                 │
├─────────────────────────────────────────┤
│ 1. Snyk CLI (Dependency Vulnerabilities)│
│    └─ npm packages, SBOM tracking      │
├─────────────────────────────────────────┤
│ 2. Aikido MCP (SAST + IaC + Secrets)    │
│    └─ Code analysis, infrastructure    │
└─────────────────────────────────────────┘

Snyk CLI: Quét lỗ hổng trong dependencies Aikido CLI: Quét SAST, IaC, secrets trong code

3. Snyk CLI — Dependency Vulnerabilities

bash
# Cài đặt Snyk
npm install -g snyk

# Xác thực (lấy token từ snyk.io)
snyk auth

# Quét lỗ hổng
snyk test

# Output ví dụ:
# ✗ High severity vulnerability found in lodash
# Package: lodash
# Version: 4.17.20
# Fix available: 4.17.21

Cơ chế hoạt động:

  • Phân tích package-lock.json
  • So sánh với Snyk vulnerability database
  • Tính severity (LOW/MEDIUM/HIGH/CRITICAL)
  • Gợi ý phiên bản fix hoặc patches

4. Aikido CLI — Advanced Security Scanning

bash
# Cấu trúc lệnh
aikido-api-client scan-release <repo> <commit> \
  --minimum-severity-level="HIGH"

# Ví dụ:
aikido-api-client scan-release taskflow-app abc123def \
  --minimum-severity-level="HIGH"

Flags (Gating Policy):

bash
--fail-on-sast-scan        # Fail nếu tìm thấy SAST issues
--fail-on-iac-scan         # Fail nếu tìm thấy IaC issues
--fail-on-secrets-scan     # Fail nếu tìm thấy secrets

Workflow:

Code Push → Snyk test → Pass?
                ↓ No
         Aikido full scan → SAST + IaC + Secrets

         Minimum severity? → HIGH/CRITICAL detected?
                ↓ Yes
         ESCALATED MANDATORY → Block merge

5. Escalation Protocol — npm audit Trigger

javascript
// Ví dụ: npm audit output
// ┌─────────────────────────────────────────┐
// │ 2 vulnerabilities found                 │
// │ 1 HIGH, 1 CRITICAL                      │
// ├─────────────────────────────────────────┤
// │ HIGH: lodash@4.17.20                    │
// │ CRITICAL: express@4.17.1                │
// └─────────────────────────────────────────┘

// Quy trình escalation:
// 1. npm audit → phát hiện HIGH/CRITICAL
// 2. Trigger: aikido-api-client scan-release (full scan)
// 3. Email alert → security team
// 4. Block all merges → ESCALATED MANDATORY
// 5. Require: fix + security approval

6. PR Gating — Phase 2.5

PR security checks trước merge:

bash
aikido-api-client scan-pr <repo> <base-branch> <head-branch> \
  --minimum-severity-level="HIGH"

Workflow:

PR created → CI/CD trigger

scan-release (base) + scan-pr (head)

Compare: base vs. head

New vulnerabilities? → FAIL (block merge)
No new issues → PASS (allow merge)

THỰC HÀNH

Bài Tập 1: Cài Đặt & Cấu Hình Snyk

Bước 1: Cài đặt Snyk CLI

bash
npm install -g snyk
snyk auth

Bước 2: Quét TaskFlow project

bash
cd /path/to/taskflow
snyk test

# Ghi lại output:
# - Tổng số lỗ hổng
# - Severity breakdown
# - Packages cần upgrade

Bước 3: Kiểm tra file .snyk

bash
# Nếu chưa có, tạo file ignore:
snyk ignore --id=<vulnerability-id> --expiry=<date>

Bài Tập 2: Security Gate Step trong CI/CD

Tạo .github/workflows/security-gate.yml:

yaml
name: Security Gate

on:
  pull_request:
  push:
    branches: [main, develop]

jobs:
  security:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "20"
          cache: "npm"

      - name: Install dependencies
        run: npm ci

      - name: Snyk Test - Dependency Vulnerabilities
        env:
          SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
        run: |
          npm install -g snyk
          snyk test --severity-threshold=high

      - name: Aikido Security Scan
        env:
          AIKIDO_API_TOKEN: ${{ secrets.AIKIDO_API_TOKEN }}
        run: |
          npm install -g @aikido/cli
          aikido-api-client scan-release \
            ${{ github.repository }} \
            ${{ github.sha }} \
            --minimum-severity-level="HIGH" \
            --fail-on-sast-scan \
            --fail-on-iac-scan \
            --fail-on-secrets-scan

      - name: PR Security Gate (Phase 2.5)
        if: github.event_name == 'pull_request'
        env:
          AIKIDO_API_TOKEN: ${{ secrets.AIKIDO_API_TOKEN }}
        run: |
          aikido-api-client scan-pr \
            ${{ github.repository }} \
            origin/${{ github.base_ref }} \
            origin/${{ github.head_ref }} \
            --minimum-severity-level="HIGH"

      - name: Security Report
        if: always()
        run: |
          echo "Security Gate Report"
          echo "===================="
          npm audit --json > audit-report.json || true
          cat audit-report.json

      - name: Upload Security Report
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: security-reports
          path: |
            audit-report.json

Cấu hình workflow:

  • Chạy trên mỗi PR và push
  • Install dependencies
  • Snyk: kiểm tra dependencies
  • Aikido: SAST + IaC + secrets
  • PR Gate: so sánh base vs. head
  • Upload report → artifacts

Bài Tập 3: Vulnerability Simulation & Fix

Bước 1: Thêm package có lỗ hổng

bash
cd /path/to/taskflow
npm install lodash@4.17.20

# Hoặc sửa package.json:
# "lodash": "4.17.20"
npm install

Bước 2: Chạy Snyk test

bash
snyk test

# Output:
# ✗ High severity vulnerability found in lodash
# Package: lodash
# Version: 4.17.20
# Introduced through: direct dependency
# Fix available: 4.17.21 (upgrade)

Bước 3: Fix vulnerability

bash
# Cách 1: Upgrade package
npm upgrade lodash

# Cách 2: npm audit fix
npm audit fix

# Cách 3: Ignore (chỉ nếu risk chấp nhận được)
snyk ignore --id=<vuln-id> --expiry=90d

Bước 4: Xác minh fix

bash
snyk test

# Output:
# ✓ Your dependencies are secure

Bài Tập 4: Escalation Protocol Thực Hành

Scenario: HIGH severity found → trigger escalation

bash
# Simulate HIGH vulnerability
npm install express@4.17.1

snyk test
# ✗ CRITICAL found in express

# Trigger full Aikido scan
aikido-api-client scan-release taskflow-app HEAD \
  --minimum-severity-level="HIGH" \
  --fail-on-sast-scan

# Result: ESCALATED MANDATORY
# - Email alert → security@company
# - GitHub status: fail
# - Require approval + fix

Bài Tập 5: Tạo Security Gate Test

Tạo test/security-gate.test.ts:

typescript
import { describe, it, expect, beforeAll } from "vitest";
import { exec } from "child_process";
import { promisify } from "util";

const execAsync = promisify(exec);

describe("Security Gate", () => {
  it("should pass Snyk vulnerability scan", async () => {
    const { stdout } = await execAsync("snyk test --json", {
      env: { ...process.env, SNYK_TOKEN: process.env.SNYK_TOKEN },
    });

    const result = JSON.parse(stdout);
    expect(result.vulnerabilities).toBeDefined();
    expect(result.vulnerabilities.length).toBe(0);
  });

  it("should have no HIGH/CRITICAL npm audit issues", async () => {
    const { stdout } = await execAsync("npm audit --json");

    const auditResult = JSON.parse(stdout);
    const highCritical =
      (auditResult.metadata?.vulnerabilities?.high || 0) +
      (auditResult.metadata?.vulnerabilities?.critical || 0);

    expect(highCritical).toBe(0);
  });

  it("should validate .snyk file exists", async () => {
    const { stdout } = await execAsync("test -f .snyk && echo 'exists'");
    expect(stdout.trim()).toBe("exists");
  });

  it("should report security metadata", async () => {
    const { stdout } = await execAsync("npm audit --json");
    const report = JSON.parse(stdout);

    console.log("Security Report:");
    console.log(`- Total vulnerabilities: ${Object.keys(report.vulnerabilities || {}).length}`);
    console.log(
      `- Low: ${report.metadata?.vulnerabilities?.low || 0}`
    );
    console.log(
      `- Medium: ${report.metadata?.vulnerabilities?.medium || 0}`
    );
    console.log(
      `- High: ${report.metadata?.vulnerabilities?.high || 0}`
    );
    console.log(
      `- Critical: ${report.metadata?.vulnerabilities?.critical || 0}`
    );

    expect(report.metadata).toBeDefined();
  });
});

Chạy test:

bash
npm run test test/security-gate.test.ts

TỔNG KẾT

Key Points:

  1. Enforcement Policy: 3 cấp độ (SUGGESTED → MANDATORY → ESCALATED)
  2. Dual Security: Snyk (dependencies) + Aikido (SAST/IaC/secrets)
  3. Snyk CLI: snyk test → phát hiện lỗ hổng npm packages
  4. Aikido CLI: Advanced scanning với gating flags
  5. Escalation: HIGH/CRITICAL → full scan → block merge
  6. PR Gating: scan-pr → so sánh base vs. head
  7. CI/CD Integration: Tự động kiểm tra security trong workflow

CÂU HỎI KIỂM TRA

  1. Policy Level: TaskFlow internal project nên sử dụng enforcement level nào? Tại sao?
  2. Snyk vs Aikido: Phân biệt chức năng quét giữa Snyk và Aikido?
  3. Escalation Protocol: Khi nào trigger ESCALATED MANDATORY?
  4. PR Gating: Phase 2.5 PR gating hoạt động như thế nào?
  5. Flags: Ý nghĩa của --fail-on-secrets-scan flag?

BÀI TẬP VỀ NHÀ

  1. Setup Snyk cho TaskFlow project, chạy snyk test, ghi lại report
  2. Create CI/CD workflow với security-gate.yml (gợi ý: GitHub Actions)
  3. Simulate vulnerability: thêm old package version → fix → verify pass
  4. Document escalation: viết SOP khi phát hiện HIGH severity
  5. Test automation: implement security-gate.test.ts và chạy trong CI

Powered by CodyMaster × VitePress