TROISINH
Sử dụng thực chiếnSubagents — Ủy thác công việc

Kiểm soát quyền hạn Agent: Allowlist, Denylist và Model Override

Cho AI quyền 'tự động' nhưng không lo phá hoại: Cách dùng allowlist/denylist và model override để kiểm soát chặt quyền hạn Agent trong Claude Code.

Định nghĩa

Agent tools và permissions là hệ thống rào chắn bảo mật dùng để kiểm soát chặt chẽ không gian hành động (action space) của AI agents — thay vì để agent tự do gọi 30+ công cụ một cách ngẫu nhiên, hệ thống này áp dụng nguyên tắc default-deny (mặc định từ chối) qua allowlist regex, đặt denylist làm rào chắn tuyệt đối, và dùng model override để chuyển đổi giữa các mức độ tự chủ khác nhau.

Giải thích chi tiết

Tại sao cần giới hạn? "Thực tập sinh siêu nhanh nhưng mất trí nhớ"

Hãy tưởng tượng bạn thuê một thực tập sinh cực kỳ thông minh, đọc tài liệu nhanh như điện, nhưng có vấn đề về trí nhớ ngắn hạn và hoàn toàn thiếu "common sense" tổ chức. Đó chính xác là bản chất của LLM agents: chúng có thể viết code xuất sắc nhưng không nhớ rằng "không được xóa production database" nếu lệnh đó không nằm trong context window hiện tại.

Khi agents có quyền truy cập vào bộ công cụ lớn (bash, file edit, API calls, MCP servers), chúng gặp phải action-space explosion — với 30 công cụ, có 30! (tức là hàng tỷ tỷ) chuỗi hành động có thể xảy ra. Nhiều chuỗi trong số đó là nguy hiểm hoặc vô nghĩa. Không thể dựa vào "prompt engineering" để ngăn chặn điều này, bởi vì prompt là xác suất, không phải bảo đảm.

Allowlist: Mô hình "mặc định từ chối" (Default-Deny)

Thay vì cấm từng lệnh xấu (denylist — cách tiếp cận mặc định cho phép), allowlist chỉ cho phép các mẫu lệnh được xác định rõ ràng. Đây là cách tiếp cận zero-trust cho AI:

// Ví dụ cấu hình allowlist trong .claude/agents/reviewer-agent.md
allowedTools: ["Read", "Glob", "Grep"]
allowedCommands: ["ls(\\s.*)?", "grep(\\s.*)?", "find .*"]

Khi agent cố gắng chạy git push --force hoặc rm -rf, hệ thống tự động chặn vì không nằm trong allowlist. Điều này giới hạn không gian kết hợp (combinatorial space), buộc agent phải hoạt động trong "vùng an toàn" đã được kiểm định.

Denylist: Rào chắn tuyệt đối (Circuit Breakers)

Dù có allowlist, một số lệnh quá nguy hiểm cần được cấm tuyệt đối ngay cả khi chúng "vô tình" khớp với regex cho phép. Denylist hoạt động như physical kill switch:

denyPatterns:
  - "rm\\s+-rf"
  - "curl.*\\|.*bash"
  - "DROP\\s+TABLE"
  - "eval\\s*\\("

Quan trọng nhất: denylist có quyền ưu tiên tuyệt đối (precedence) ngay cả trong "YOLO mode" (full autonomy). Đây là lớp bảo vệ cuối cùng chống lại jailbreak và hallucination nguy hiểm.

Model Override: AI kiểm soát AI

Đây là kỹ thuật tinh vi nhất: thay vì người dùng phê duyệt từng hành động, một safety classifier (thường là model nhỏ hơn như Haiku hoặc một bộ phân loại chuyên dụng) chạy song song để đánh giá mỗi lệnh trước khi thực thi:

  • Green zone: Read-only operations, file edits trong project directory → Auto-approve
  • Yellow zone: Destructive operations, network calls → Block hoặc escalate
  • Gray zone: Ambiguous cases → Fallback to human

Điều này cho phép chế độ auto (tự động) hoạt động mà không cần human-in-the-loop cho mỗi bước nhỏ, nhưng vẫn giữ an toàn thông qua "proxy judge" nhanh và rẻ hơn.

MCP Scoping: Phân quyền theo giao thức

Khi agents sử dụng Model Context Protocol (MCP) để kết nối với PostgreSQL, GitHub, hay Slack, permissions được scoping riêng biệt tại lớp MCP server. Điều này ngăn chặn privilege escalation qua plugin:

mcpServers:
  database:
    allowedOperations: ["SELECT", "EXPLAIN"]
    deniedOperations: ["DROP", "TRUNCATE", "GRANT"]
  github:
    allowedScopes: ["read:pull_requests", "write:issues"]
    deniedScopes: ["delete:repositories"]

Ví dụ thực tế

Agent review PR chỉ đọc, không ghi tại startup fintech

Một team backend ở TP.HCM tạo code-reviewer agent chuyên audit pull request cho dự án thanh toán VietQR. Trong file .claude/agents/code-reviewer.md:

name: security-reviewer
description: "Chuyên gia audit bảo mật, chỉ đọc code để tìm lỗ hổng SQL injection và XSS, không sửa code"
model: claude-3-5-haiku-20241022  # Rẻ và nhanh cho đọc file
allowedTools: ["Read", "Glob", "Grep", "Bash"]
allowedCommands: ["ls", "find", "grep"]
denyPatterns: ["git.*push", "rm", "write", "edit", ">.*\\.py"]

Khi agent này chạy, nó có thể grep để tìm execute( hoặc innerHTML, nhưng nếu "hallucinate" và cố gắng chạy git push hoặc sửa file để "fix" lỗi, hệ thống từ chối ngay lập tức. Điều này cho phép họ chạy 5 agents song song (mỗi agent kiểm tra một loại lỗi: SQLi, XSS, logic bugs) mà không lo chúng "vô tình" deploy code lỗi lên production trong lúc sáng thứ 7.

Automation agent cho thao tác file an toàn tại agency marketing

Một agency ở Hà Nội dùng Claude để dọn dẹp thư viện ảnh sản phẩm từ Shopee và TikTok Shop hàng ngày. Agent được cấu hình với allowlist chặt chẽ:

# Agent chỉ được phép
ls ~/Photos/Inbox/
grep -r "IMG_" ~/Photos/Inbox/
find ~/Photos/Inbox/ -name "*.jpg"

# Bị chặn tuyệt đối
rm -rf ~/Photos/  # Denylist match → block immediately
curl https://example.com/cleaner.sh | bash  # Denylist match → block
mv ~/Photos/Important ~/Photos/Trash  # Không trong allowed patterns → block

Kết quả: Agent có thể liệt kê và phân loại ảnh suốt 8 tiếng liên tục (auto mode) để đổi tên file theo format SKU_YYYYMMDD.jpg, mà không lo xóa nhầm dữ liệu khách hàng hay chạy script lạ từ mạng.

Model override cho migration database tại Grab gọi xe

Khi agent phát hiện cần refactor bảng rides trong PostgreSQL (thao tác high-risk), hệ thống tự động override model:

profile: database-migration
defaultModel: claude-3-5-sonnet-20241022  # Nhanh cho query thường
dangerousOperationsModel: claude-3-opus-20240229  # Cẩn thận cho thay đổi schema
autoMode: true
safetyClassifier: enabled

Khi agent cố gắng chạy ALTER TABLE hoặc DROP COLUMN, safety classifier nhận diện đây là "yellow zone" và chuyển sang model Opus để xem xét kỹ lưỡng hơn, hoặc yêu cầu human approval nếu confidence thấp. Điều này tránh việc Sonnet "vội vàng" xóa cột đang chứa dữ liệu trip history quan trọng.

Ứng dụng

Developer độc lập

Giới hạn agent khi thử nghiệm code trong môi trường production-like. Dùng allowlist để agent chỉ được đọc logs, không được restart services, tránh "oops" lúc 3 giờ sáng khi đang fix bug cho khách hàng Mỹ.

Team Lead và Tech Lead

Chuẩn hóa permissions trong .claude/agents/ cho toàn team. Mọi developer dùng chung "Security Auditor Agent" với cùng denylist, đảm bảo consistency trong code review tự động. Dùng composite authorization để agent kết hợp cả user identity (ai chạy) và resource attributes (file nào bị tác động).

Product Manager (Non-coder)

Hiểu rằng khi giao việc cho agent, cần xác định rõ "agent được quyền làm gì". Ví dụ: agent research được quyền đọc Slack và Google Docs, nhưng không được post message thay mặt bạn (denylist trên chat:write scope), tránh việc agent "tự ý" thông báo lịch delay cho cả công ty khi chưa được xác nhận.

Doanh nghiệp và Compliance

Triển khai Cerbos hoặc policy engine tương tự để đánh giá quyền trong dưới 1ms. Audit log ghi lại mọi lệnh agent thực thi, phục vụ SOC 2 và GDPR compliance. Dùng managed settings để ép buộc denylist toàn tổ chức (ví dụ: cấm tất cả agent dùng curl tới domain ngoài whitelist corp).

So sánh: Allowlist vs Denylist

Tiêu chíDenylist (Default-Allow)Allowlist (Default-Deny)
Triết lýTin tưởng, sau đó hạn chếNghi ngờ, sau đó cho phép
ScalabilityKém — phải liệt kê mọi lệnh xấu (zero-day luôn thắng)Tốt — chỉ cần định nghĩa "tốt"
UXLinh hoạt, ít ma sát ban đầuChặt chẽ, yêu cầu setup
An toànDễ bypass qua encoding (eval, base64)An toàn hơn, giới hạn attack surface
Tool overwhelmCao — agent có thể gọi công cụ theo thứ tự kỳ lạThấp — không gian hành động bị ràng buộc
Khi nào dùngPrototyping nhanh, môi trường dev cô lậpProduction, multi-agent systems, CI/CD

Kết luận: Denylist phù hợp cho "north-south traffic" (perimeter defense), còn allowlist phù hợp cho "east-west traffic" (internal traffic giữa các agents). Trong Claude Code, best practice là kết hợp cả hai: allowlist cho phép auto-execute các lệnh read-only an toàn, denylist làm circuit breaker cho lệnh destructive.

Bài viết liên quan

Cùng cụm (Subagents)

Đọc tiếp

On this page