Skip to content

Buổi 12: Security Gate — Snyk + Aikido ​

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