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 → blockKế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: enabledKhi 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 |
| Scalability | Ké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" |
| UX | Linh hoạt, ít ma sát ban đầu | Chặt chẽ, yêu cầu setup |
| An toàn | Dễ bypass qua encoding (eval, base64) | An toàn hơn, giới hạn attack surface |
| Tool overwhelm | Cao — 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ùng | Prototyping nhanh, môi trường dev cô lập | Production, 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)
- Subagents là gì? 6 built-in agents giải thích — Hiểu cơ chế phân quyền và cách 6 agent mặc định hoạt động song song
- Tạo Custom Agent: .claude/agents/ từ đầu — Hướng dẫn cấu hình YAML frontmatter và permission scoping cho agent riêng
- Agent Memory: user, project, local scope — Cách permissions kết hợp với memory để agent nhớ "luật chơi" giữa các session
- 10 Agent mẫu: code-reviewer, debugger, test-engineer... — Các pattern phân quyền thực tế cho từng loại agent chuyên biệt
Đọc tiếp
- MCP là gì? Model Context Protocol giải thích đơn giản — Hiểu sâu về cách MCP servers được scoping permissions riêng biệt khỏi raw commands
- Agent Teams: Nhiều Claude phối hợp cùng lúc — Kỹ thuật chạy song song nhiều agents với worktree isolation và permission profiles khác nhau
- Tự động Code Review với /loop và GitHub Actions — Triển khai agents trong CI/CD với headless mode và permission modes tự động
Tạo Custom Agent trong Claude Code: Từ file YAML đến thực chiến
Tạo custom agent trong Claude Code: ủy thác công việc song song không lo nhiễu context. Hướng dẫn cấu hình YAML, phân quyền tool và cách tách biệt suy nghĩ hiệu quả.
Agent Memory: Bộ nhớ 3 tầng giúp Claude agent không 'lãng trí'
Phân biệt 3 tầng bộ nhớ User, Project, Local trong Claude Code. Cách giữ agent không 'quên' lệnh quan trọng sau 20 phút làm việc và xử lý dữ liệu nhạy cảm đúng cách.