VNPT

Hooks as Approval Gates (Stage 5: Deploy)

Cơ chế chốt chặn xác định: Kiểm soát quyền hạn, phê duyệt phát hành và cô lập môi trường thực thi

Bài gốc: Anthropic Claude Academy reference/ai-native-sdlc/course/10-hooks-as-approval-gates.md 2026-09-16 ~6 phút đọc

1. Bắt đầu: Hooks làm Approval Gates

Trong Stage 3: Build, hooks đóng vai trò guardrails tự động (allow/block) không cần con người can thiệp. Ngoài ra, hook có thể tạm dừng để hỏi (ask), kích hoạt Approval Gates (cổng phê duyệt của con người), chờ người có thẩm quyền phê duyệt trước khi tiếp tục — đáp ứng yêu cầu release gating trong Stage 5: Deploy.

Traditional: Prompt-based Rules

Chỉ dựa vào quy định trong CLAUDE.md. Dễ bị bypass do hallucination, prompt injection hoặc trôi chỉ dẫn khi context window dài.

Nguyên tắc cốt lõi

Hook là cơ chế kiểm soát tất định (deterministic 100%) ở tầng hệ thống và mạng, không phụ thuộc vào việc AI có tuân thủ prompt hay không.

2. Sơ đồ luồng: PreToolUse Interceptor & Approval Gates

Cơ chế PreToolUse interceptor (chốt chặn kiểm soát lệnh trước khi thực thi) chặn lệnh bash, đối chiếu chính sách doanh nghiệp, kích hoạt Approval Gates (cổng phê duyệt của con người) và ghi log OpenTelemetry:

Archify Interactive Diagram (Stage 5: Hooks as Approval Gates) Mở toàn màn hình ↗

3. Điều kiện tiên quyết & Hạ tầng

4. Các bước thực thi: 4 bước thiết lập

4 bước triển khai các cổng phê duyệt kiểm soát phát hành:

1

Lập danh mục Approval Gates (cổng phê duyệt của con người) bắt buộc

Lãnh đạo kỹ thuật cùng bộ phận Change Management và Compliance liệt kê các Approval Gates (cổng phê duyệt của con người) bắt buộc phải duy trì, chẳng hạn như phê duyệt từ Change Management (change management sign-off), ủy quyền phát hành (release authorization), và chỉnh sửa các đường dẫn được bảo vệ (edits to protected paths).

compliance governance
2

Hiện thực hóa cổng thành Hook Script

Platform engineer chuyển đổi từng cổng kiểm soát thành hook script dưới dạng PreToolUse interceptor (chốt chặn kiểm soát lệnh trước khi thực thi) chạy trước khi Claude thao tác: cho phép (allow - exit 0), yêu cầu phê duyệt (ask), hoặc chặn đứng (block - exit 2).

PreToolUse bash script
3

Phân tầng cấu hình Git và Managed Settings

Hook của dự án lưu tại .claude/settings.json trong Git. Hook bắt buộc không thể thương lượng đặt trong Managed Settings do Platform hoặc IT Admin quản lý (kỹ sư không thể tắt).

managed settings tamper-proof
4

Giải thích rõ lý do và đường dẫn phê duyệt khi Block

Mỗi quyết định chặn phải tự giải thích: khi hook ngăn chặn hành động, lý do và quy trình xin phê duyệt hiển thị trực tiếp trong output của Claude.

error feedback stderr exit 2

5. Cấu hình Hook trong dự án

Khai báo PreToolUse interceptor (chốt chặn kiểm soát lệnh trước khi thực thi) trong .claude/settings.json của dự án:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/production-gate.sh"
          }
        ]
      }
    ]
  }
}

Hook script kiểm soát release (.claude/hooks/production-gate.sh):

#!/bin/bash
# Production deploys require a named release authorization
cmd=$(jq -r '.tool_input.command' < /dev/stdin)
if [[ "$cmd" == *"deploy"* && "$cmd" == *"production"* ]]; then
  if [ -z "$RELEASE_APPROVAL" ]; then
    echo "Production deploys need a release authorization." >&2
    exit 2   # exit 2 blocks the action; the message goes to Claude
  fi
fi
exit 0

6. Managed Settings trong doanh nghiệp có kiểm soát

Trong môi trường doanh nghiệp có kiểm soát (regulated enterprise), cấu hình an toàn được triển khai tập trung qua MDM hoặc Admin Console. Kỹ sư không thể chỉnh sửa hay ghi đè:

{
  "permissions": {
    "deny": [
      "Read(.env*)", "Read(./secrets/**)",
      "WebFetch", "Bash(curl *)", "Bash(wget *)"
    ],
    "allow": [
      "Bash(git *)", "Bash(make build)",
      "Bash(make test)", "Bash(make lint)"
    ],
    "disableBypassPermissionsMode": "disable"
  },
  "allowManagedPermissionRulesOnly": true,
  "sandbox": {
    "enabled": true,
    "failIfUnavailable": true,
    "allowUnsandboxedCommands": false,
    "network": { "allowedDomains": ["git.internal.example.com", "registry.npmjs.org"] },
    "credentials": {
      "files": [
        { "path": "~/.ssh", "mode": "deny" },
        { "path": "~/.aws/credentials", "mode": "deny" }
      ],
      "envVars": [ { "name": "GITHUB_TOKEN", "mode": "deny" } ]
    }
  },
  "allowManagedHooksOnly": true,
  "disableSideloadFlags": true,
  "allowManagedMcpServersOnly": true,
  "strictKnownMarketplaces": [
    { "source": "github", "repo": "example-corp/approved-plugins" }
  ],
  "requiredMinimumVersion": "2.1.193"
}

7. Phân tích 8 cơ chế kiểm soát kỹ thuật

1

permissions.deny/allow

permissions.deny giữ secrets không lọt vào context của agent và chặn egress mạng tùy ý qua các công cụ. permissions.allow phê duyệt trước safe inner loop (chu trình làm việc an toàn nội bộ: build, test, lint) để danh sách deny không gây ra tình trạng quá tải xác nhận (prompt fatigue). Đi kèm đó, disableBypassPermissionsMode kết hợp cùng allowManagedPermissionRulesOnly đồng nghĩa không một kỹ sư, file cấu hình dự án hay cờ dòng lệnh (CLI flag) nào có thể nới lỏng hoặc mở rộng các quy tắc đã đặt.

2

sandbox

sandbox bao quát những gì permissions không thể xử lý. Việc cấm WebFetch ở cấp độ công cụ không ngăn được lệnh shell tiếp cận mạng ngoài, trong khi danh sách domain cho phép (domain allowlist: network.allowedDomains) ở cấp hệ điều hành sẽ chặn đứng hoàn toàn egress — cả hai lớp cùng thực thi một mục tiêu ở các tầng khác nhau. failIfUnavailableallowUnsandboxedCommands biến sandbox thành điều kiện tiên quyết: Claude Code từ chối khởi động nếu sandbox không thể khởi tạo, và một lệnh thất bại trong sandbox tuyệt đối không được phép thử lại bên ngoài sandbox.

3

credentials

credentials xử lý trường hợp mà các quy tắc deny bỏ sót. permissions.deny quản lý các công cụ file của Claude, nhưng một lệnh shell chạy trong sandbox theo mặc định vẫn có thể đọc ~/.ssh hoặc ~/.aws/credentials. Khối credentials (quản lý filesenvVars) từ chối các thao tác đọc đó và loại bỏ các secrets được chỉ định (như GITHUB_TOKEN) khỏi môi trường thực thi của các lệnh trong sandbox.

4

allowManagedHooksOnly

allowManagedHooksOnly quy định chỉ các hook khai báo trong Managed Settings mới được chạy; các hook trong user, project và local settings đều bị chặn (kể cả ví dụ .claude/settings.json độc lập ở trên). Để đảm bảo Approval Gates (cổng phê duyệt của con người) của bài học này luôn được thực thi bắt buộc, hãy định nghĩa nó trong chính khối hooks của file managed settings.

5

disableSideloadFlags

disableSideloadFlags từ chối ngay khi khởi động các cờ dòng lệnh (flags) cho phép nạp ngoài (sideload) một plugin, agent hoặc cấu hình MCP cho một lần chạy đơn lẻ, loại bỏ nguy cơ kỹ sư bypass hệ thống kiểm soát bằng các thiết lập tạm thời.

6

strictKnownMarketplaces

strictKnownMarketplaces bảo đảm mọi skill, agent, hook hoặc MCP server trên máy kỹ sư đều phải đến từ marketplace plugin đã được tổ chức phê duyệt (approved plugin marketplace), không được nạp từ thư mục người dùng cá nhân (home directory). Marketplace allowlist kiểm soát chặt chẽ toàn bộ danh mục được phép cài đặt.

7

allowManagedMcpServersOnly

allowManagedMcpServersOnly biến toàn bộ bề mặt công cụ (tool surface) của agent thành một allowlist do Platform Team trực tiếp sở hữu và quản lý.

8

requiredMinimumVersion

requiredMinimumVersion từ chối khởi động Claude Code nếu phiên bản thấp hơn mức sàn phê duyệt, bảo đảm các cơ chế an ninh được thực thi bởi một bản build mà tổ chức đã thực sự thẩm định và đánh giá rủi ro.

8. Kiểm soát & Đo lường hiệu quả

Hooks chính là các Approval Gates (cổng phê duyệt của con người). Điều kiện cổng được thực thi trong mọi trường hợp, cho tất cả mọi người. Các quyết định allow và block đều được ghi log kèm timestamp. Cổng cũng định nghĩa rõ ràng những gì được tính là sự phê duyệt hợp lệ, cho dù đó là một change ticket đã duyệt hay ký duyệt của Release Manager.

Yếu tố Quản trị Chi tiết Thực thi Kỹ thuật
What is enforced Điều kiện cổng (gate condition) được thực thi trong mọi trường hợp, áp dụng đồng nhất 100% cho tất cả mọi người.
Where it is logged Mọi quyết định allow và block đều được ghi nhận kèm timestamp và chuyển tiếp qua OpenTelemetry export về observability stack của tổ chức.
Who approves Cổng kiểm soát định nghĩa rõ điều kiện phê duyệt hợp lệ: một change ticket đã được phê duyệt hoặc ký duyệt của Release Manager.

Chỉ số Đo lường Hiệu quả