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ện | Hành Động |
|---|---|---|
| SUGGESTED | User projects, không phát hiện rủi ro | Cảnh báo, build vẫn pass |
| MANDATORY | CodyMaster internal projects | Build phải pass tất cả checks |
| ESCALATED MANDATORY | Risk detected (HIGH/CRITICAL) | Tự động escalate, yêu cầu phê duyệt |
Quy trình Escalation:
- Phát hiện lỗ hổng HIGH/CRITICAL
- Tự động trigger full security scan
- Gửi notification cho security team
- 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.21Cơ 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 secretsWorkflow:
Code Push → Snyk test → Pass?
↓ No
Aikido full scan → SAST + IaC + Secrets
↓
Minimum severity? → HIGH/CRITICAL detected?
↓ Yes
ESCALATED MANDATORY → Block merge5. 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 approval6. 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 authBướ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 upgradeBướ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.jsonCấ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 installBướ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=90dBước 4: Xác minh fix
bash
snyk test
# Output:
# ✓ Your dependencies are secureBà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 + fixBà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.tsTỔNG KẾT
Key Points:
- Enforcement Policy: 3 cấp độ (SUGGESTED → MANDATORY → ESCALATED)
- Dual Security: Snyk (dependencies) + Aikido (SAST/IaC/secrets)
- Snyk CLI:
snyk test→ phát hiện lỗ hổng npm packages - Aikido CLI: Advanced scanning với gating flags
- Escalation: HIGH/CRITICAL → full scan → block merge
- PR Gating: scan-pr → so sánh base vs. head
- CI/CD Integration: Tự động kiểm tra security trong workflow
CÂU HỎI KIỂM TRA
- Policy Level: TaskFlow internal project nên sử dụng enforcement level nào? Tại sao?
- Snyk vs Aikido: Phân biệt chức năng quét giữa Snyk và Aikido?
- Escalation Protocol: Khi nào trigger ESCALATED MANDATORY?
- PR Gating: Phase 2.5 PR gating hoạt động như thế nào?
- Flags: Ý nghĩa của
--fail-on-secrets-scanflag?
BÀI TẬP VỀ NHÀ
- Setup Snyk cho TaskFlow project, chạy
snyk test, ghi lại report - Create CI/CD workflow với security-gate.yml (gợi ý: GitHub Actions)
- Simulate vulnerability: thêm old package version → fix → verify pass
- Document escalation: viết SOP khi phát hiện HIGH severity
- Test automation: implement security-gate.test.ts và chạy trong CI