Kiểm soát thực thi lệnh của AI Agent với OpenClaw Exec Approvals
Hệ thống phê duyệt thực thi của OpenClaw đóng vai trò như lớp bảo vệ cuối cùng, ngăn chặn AI Agent chạy các lệnh nguy hiểm lên máy chủ của bạn. Bài viết này sẽ đi sâu vào cơ chế hoạt động, cấu hình chính sách và cách thiết lập mức độ an toàn tối ưu cho môi trường phát triển và sản xuất.

Hãy tưởng tượng Agent AI của bạn vừa chạy lệnh rm -rf / trên máy chủ sản xuất. Có lẽ điều đó chưa xảy ra, nhưng việc nó có thể xảy ra chính là nguyên nhân khiến các nhà vận hành hệ thống mất ngủ. Hệ thống phê duyệt thực thi (exec approval) của OpenClaw được tạo ra để đảm bảo bạn có thể yên tâm ngủ ngon.
Exec approvals đóng vai trò là hàng rào bảo vệ giữa ý định của Agent và shell của máy chủ. Nó nằm trên cùng của chính sách công cụ (tool policy) và sandboxing, thêm lớp "bạn có chắc không?" cuối cùng trước khi bất kỳ lệnh nào chạm vào phần cứng thực. Hãy coi nó như một khóa an toàn: các lệnh chỉ chạy khi chính sách, danh sách cho phép (allowlist) và (tùy chọn) sự chấp thuận rõ ràng của bạn đều đồng ý.
Exec Approvals được áp dụng ở đâu
Exec approvals được thực thi cục bộ trên máy chủ thực thi — không phải trên đám mây, không phải trong vòng lặp suy luận của Agent, mà ngay tại nơi lệnh thực sự sẽ chạy:
- Gateway host — máy chủ đang chạy quy trình OpenClaw gateway.
- Node host — thiết bị đã được ghép đôi (macOS companion app, node Linux headless, v.v.).
Điều này quan trọng vì niềm tin mang tính cục bộ. Máy chủ gateway tin tưởng quy trình gateway. Một node được ghép đôi mở rộng sự tin tưởng đó cho bất kỳ thiết bị nào nó đang chạy. Exec approvals giảm thiểu rủi ro thực thi vô tình trong ranh giới tin tưởng đó — chúng không phải là hệ thống xác thực theo người dùng.
Trên macOS cụ thể, dịch vụ node host chuyển tiếp các yêu cầu system.run cho ứng dụng đi kèm macOS qua IPC cục bộ. Ứng dụng này thực thi các phê duyệt và chạy lệnh trong ngữ cảnh UI, vì vậy bạn thấy chính xác những gì đang chạy.
Ba nút điều chỉnh chính sách
Exec approvals được tóm gọn trong ba cài đặt hoạt động cùng nhau. Hiểu rõ ba điều này là chìa khóa.
Security Mode (Chế độ Bảo mật)
Kiểm soát cái gì có thể chạy:
deny— chặn tất cả các yêu cầu exec của máy chủ. Không có gì lọt qua được.allowlist— chỉ các lệnh khớp với allowlist của bạn mới có thể chạy.full— cho phép mọi thứ. Tương đương với chế độ nâng cao (elevated mode).
Ask Mode (Chế độ Hỏi)
Kiểm soát khi nào bạn nhận được lời nhắc:
off— không bao giờ nhắc. Chính sách quyết định âm thầm.on-miss— chỉ nhắc khi allowlist không khớp. Đây là điểm ngọt ngào cho hầu hết các thiết lập.always— nhắc cho mọi lệnh đơn lẻ, ngay cả những cái có trong allowlist.
Ask Fallback (Dự phòng khi Hỏi)
Xảy ra khi cần nhắc nhưng không có ai ở nhà để trả lời (không có UI tiếp cận được):
deny— chặn lệnh. Mặc định an toàn.allowlist— chỉ cho phép nếu allowlist khớp.full— cho phép mọi thứ ngay cả khi không có con người. Cần hết sức thận trọng khi dùng.
Chính sách hiệu quả luôn là cái nghiêm ngặt hơn giữa cấu hình OpenClaw (tools.exec.*) và tệp phê duyệt cục bộ của máy chủ. Nếu bạn đặt ask: "off" trong cấu hình nhưng tệp máy chủ nói ask: "always", thì máy chủ sẽ thắng.
Tệp Approvals
Mọi thứ nằm trong một tệp JSON trên máy chủ thực thi:
~/.openclaw/exec-approvals.json
Dưới đây là ví dụ về một thiết lập thực tế:
{
"version": 1,
"defaults": {
"security": "allowlist",
"ask": "on-miss",
"askFallback": "deny"
},
"agents": {
"main": {
"security": "allowlist",
"ask": "on-miss",
"autoAllowSkills": true,
"allowlist": [
{
"pattern": "/opt/homebrew/bin/rg",
"lastUsedAt": 1737150000000,
"lastUsedCommand": "rg -n TODO"
},
{
"pattern": "~/.local/bin/*"
}
]
}
}
}
Những điểm chính cần lưu ý:
- Allowlist theo từng Agent. Mỗi Agent có cái riêng. Phê duyệt của Agent này không bị lẫn sang Agent khác.
- Mẫu Glob (Glob patterns) cho các mục allowlist. Không phân biệt hoa thường. Phải giải quyết được đường dẫn binary — các mục chỉ có tên cơ bản (basename-only) sẽ bị bỏ qua.
- Theo dõi việc sử dụng. Mỗi mục ghi lại thời điểm sử dụng cuối cùng và lệnh nào đã kích hoạt nó. Giúp bạn kiểm tra và dọn dẹp.
Bạn có thể chỉnh sửa tệp này trực tiếp, nhưng cách sạch sẽ hơn là dùng CLI:
# Kiểm tra chính sách hiện tại
openclaw approvals get
# Kiểm tra một node cụ thể
openclaw approvals get --node my-macbook
# Đặt chính sách qua stdin
openclaw approvals set --stdin
Safe Bins: Tự động cho phép các công cụ vô hại
Không phải mọi lệnh đều cần mục allowlist. Một số công cụ có phạm vi hẹp rất cụ thể — stdin vào, stdout ra — nên việc kiểm soát chúng chỉ gây trở ngại. Đó chính là mục đích của Safe bins.
OpenClaw đi kèm một bộ mặc định nhỏ: cut, uniq, head, tail, tr, wc. Những cái này có thể chạy ở chế độ allowlist mà không cần mục rõ ràng vì chúng bị hạn chế ở hoạt động chỉ dùng stdin.
Các hạn chế là thật:
- Các đối số tệp vị trí bị từ chối — không có cách nào lén lút đọc tệp.
- Các token Argv được coi là văn bản thuần túy tại thời điểm thực thi — không có mở rộng glob, không có
$VARS. - Binary phải giải quyết được từ các thư mục tin cậy (mặc định:
/bin,/usr/bin). - Các cờ cụ thể phá vỡ hành vi chỉ stdin bị từ chối cho mỗi binary (ví dụ:
sort -o,grep -r,jq -f).
Bạn có thể thêm nhiều safe bins hơn trong cấu hình, nhưng cần cân nhắc kỹ:
{
"tools": {
"exec": {
"safeBins": ["jq", "myfilter"],
"safeBinTrustedDirs": ["/opt/homebrew/bin"],
"safeBinProfiles": {
"myfilter": {
"minPositional": 0,
"maxPositional": 0,
"allowedValueFlags": ["-n", "--limit"],
"deniedFlags": ["-f", "--file", "-c", "--command"]
}
}
}
}
}
Không bao giờ thêm trình thông dịch vào safe bins.
python3,node,ruby,bash— những cái này có thể đánh giá mã tùy ý, thực thi lệnh con và đọc tệp theo thiết kế. Hãy sử dụng các mục allowlist rõ ràng cho chúng và cân nhắc bậtstrictInlineEval.
Cứng hóa Inline Eval
Ngay cả khi bạn cho phép python3 trong allowlist, có lẽ bạn không muốn Agent của mình chạy python3 -c "import os; os.system('rm -rf /')" mà không có lời nhắc. Đó chính là mục đích của strictInlineEval.
{
"tools": {
"exec": {
"strictInlineEval": true
}
}
}
Khi được bật, các biểu thức eval nội tuyến như python -c, node -e, ruby -e, perl -e, php -r, lua -e, và osascript -e luôn yêu cầu phê duyệt rõ ràng — ngay cả khi binary trình thông dịch đã có trong allowlist. Hành động "allow always" cũng sẽ không tự động lưu các mục này.
Đây là phòng thủ đa lớp cho các lệnh trình thông dịch không ánh xạ rõ ràng đến một tệp ổn định. Nếu Agent chạy python3 myscript.py, thì không sao — tệp có thể được ràng buộc và xác minh. Nhưng python3 -c '...' là mã tùy ý không có tệp nào để kiểm tra, nên nó bị kiểm tra kỹ hơn.
Tự động cho phép CLI của Skills
Nếu bạn đang sử dụng OpenClaw skills, bạn có thể tự động allowlist các tệp thực thi mà những kỹ năng này cần. Đặt autoAllowSkills: true trong cấu hình phê duyệt của bạn và OpenClaw sẽ tìm nạp danh sách bin của kỹ năng qua Gateway RPC, coi các binary đó được ngầm allowlist trên các node.
Đây là sự tiện lợi cho các môi trường tin cậy nơi gateway và các node của bạn chia sẻ ranh giới tin tưởng. Nếu bạn cần sự tin tưởng rõ ràng nghiêm ngặt, hãy tắt nó đi và thêm mục allowlist thủ công thay thế.
Chế độ YOLO (Cứu cánh cuối cùng)
Đôi khi bạn chỉ muốn mọi thứ hoạt động mà không có lời nhắc. Máy tính phát triển, môi trường dùng một lần, thiết lập cá nhân nơi bạn tin tưởng Agent hoàn toàn — chế độ YOLO là dành cho bạn.
Để hoàn toàn cho phép, hãy mở cả hai lớp chính sách:
Lớp cấu hình:
openclaw config set tools.exec.host gateway
openclaw config set tools.exec.security full
openclaw config set tools.exec.ask off
openclaw gateway restart
Lớp phê duyệt máy chủ:
openclaw approvals set --stdin
Các lệnh phê duyệt trong cùng cuộc trò chuyện cũng hoạt động: nếu yêu cầu exec bắt nguồn từ cuộc trò chuyện Slack, bạn có thể /approve ngay tại đó mà không cần mục tiêu chuyển tiếp riêng biệt. Các phê duyệt đang chờ xử lý hết hạn sau 30 phút mặc định.
Đối với Discord và Telegram, việc phân phối phê duyệt gốc thêm định tuyến DM và các nút phê duyệt tương tác trên top của luồng /approve dựa trên văn bản. Cấu hình qua channels.discord.execApprovals hoặc channels.telegram.execApprovals.
Điều gì xảy ra khi Phê duyệt bị Từ chối
Khi bạn từ chối một yêu cầu exec, OpenClaw không chỉ chặn lệnh — nó ngăn Agent sử dụng lại đầu ra từ bất kỳ lần chạy sớm hơn nào của cùng một lệnh trong phiên làm việc. Lời từ chối bao gồm hướng dẫn rõ ràng rằng không có đầu ra lệnh nào khả dụng, điều này ngăn Agent tưởng tượng kết quả hoặc hành động dựa trên dữ liệu cũ từ một lần chạy thành công trước đó.
Đây là một chi tiết tinh tế nhưng quan trọng. Nếu không có nó, Agent có thể chạy cat /etc/passwd một lần (được phê duyệt), bị từ chối trong lần thử thứ hai, và vẫn tham chiếu đầu ra của lần chạy đầu tiên như thể nó là hiện tại.
Các thiết lập được khuyến nghị
Máy phát triển cá nhân
Bạn tin tưởng Agent, nhưng muốn một mạng an toàn cho các lệnh phá hủy:
defaults:
security: "allowlist"
ask: "on-miss"
askFallback: "deny"
Xây dựng allowlist của bạn một cách tự nhiên — phê duyệt các lệnh khi chúng đến, sử dụng "allow always" cho các công cụ bạn tin tưởng, và xem xét danh sách thỉnh thoảng.
Máy chủ sản xuất
Khóa chặt lại. Chỉ các lệnh đã được phê duyệt trước, luôn nhắc khi bị trượt, từ chối khi không có ai đang watching:
defaults:
security: "allowlist"
ask: "always"
askFallback: "deny"
Kết hợp với strictInlineEval: true và chuyển tiếp phê duyệt đến kênh ops của bạn để kỹ sư trực ban có thể phê duyệt các lệnh nhạy cảm về thời gian từ điện thoại của họ.
Thiết lập đa Agent
Các Agent khác nhau nhận được mức độ tin cậy khác nhau. Người điều phối chính của bạn có thể có quyền truy cập rộng trong khi Agent viết nội dung nhận gần như không có gì:
"agents": {
"main": { "security": "allowlist", "ask": "on-miss" },
"writer": { "security": "deny" }
}
Allowlist theo từng Agent giữ ranh giới sạch sẽ.
Gỡ lỗi Approvals
Nếu một lệnh không chạy và bạn không chắc tại sao, hãy bắt đầu với:
openclaw approvals get
Điều này hiển thị chính sách được yêu cầu, nguồn chính sách máy chủ và kết quả hiệu quả sau khi cả hai lớp được hợp nhất. Đối với các node:
openclaw approvals get --node <tên-node>
Các bẫy phổ biến:
- Máy chủ nghiêm ngặt hơn cấu hình. Máy chủ luôn thắng. Nếu cấu hình của bạn nói
fullnhưng tệp máy chủ nóiallowlist, bạn nhận đượcallowlist. - Các mục allowlist chỉ có tên cơ bản bị bỏ qua. Sử dụng đường dẫn đầy đủ hoặc mẫu glob:
/opt/homebrew/bin/rg, không chỉrg. - Chuỗi shell cần mọi đoạn được cho phép. Chạy
echo ok && pwdyêu cầu cảechovàpwdđều thỏa mãn quy tắc allowlist. - Chuyển hướng không được hỗ trợ ở chế độ allowlist. Chuỗi shell (
&&,||,;) hoạt động khi mọi đoạn vượt qua, nhưng>và<thì không.
Ngoài ra hãy kiểm tra openclaw security audit — nó cảnh báo về những thứ như trình thông dịch trong danh sách safe bins của bạn mà không có hồ sơ rõ ràng.
Ngăn xếp bảo mật trong bối cảnh
Exec approvals là một lớp trong cách tiếp cận phòng thủ đa lớp (defense-in-depth) của OpenClaw:
- [Chính sách công cụ (Tool policy)] — kiểm soát công cụ nào Agent có thể sử dụng.
- Sandboxing — cô lập exec sang môi trường sandbox theo mặc định.
- Chế độ nâng cao (Elevated mode) — thoát được kiểm soát từ sandbox sang máy chủ.
- Exec approvals — gác cổng từng lệnh trên máy chủ.
- Allowlists + safe bins — tin tưởng chi tiết cho các binary cụ thể.
Mỗi lớp bắt những gì các lớp khác bỏ sót. Một Agent có thể có quyền truy cập công cụ exec (chính sách), thoát khỏi sandbox (elevated), nhưng vẫn bị dừng lại bởi một lần trượt allowlist (approvals). Đó là ý nghĩa của nó — không có lớp đơn lẻ nào là toàn bộ câu chuyện.



