Harness Academy
Tài liệu gốc 12 10 phútTiếng Việt + English
docs/en/s09-permission-system.mdXem bản gốc
Ngôn ngữ bài đọc
Bản dịch tiếng Việt

Bản dịch đầy đủ theo đúng cấu trúc tài liệu; code, liên kết và định danh kỹ thuật được giữ nguyên.

s09: Hệ thống cấp phép

s00 > s01 > s02 > s03 > s04 > s05 > s06 > s07 > s08 > [ s09 ] > s10 > s11 > s12 > s13 > s14 > s15 > s16 > s17 > s18 > s19 > s20 > s21 > s22 > s23 > s24 > s25 > s26 > s27

Mô hình có thể đề xuất một hành động, nhưng trước khi thực hiện, nó phải vượt qua cổng an toàn.

Mục tiêu cốt lõi của chương này

Bởi s08, agent có công cụ, tính kiên trì, trí nhớ và kỹ năng. Nó thực sự đang làm công việc thực sự.

Các vấn đề đi kèm với nó:

  • Mô hình có thể thực thi rm -rf /
  • Mô hình có thể DROP TABLE cơ sở dữ liệu của bạn
  • Mô hình có thể định dạng đĩa, tắt các tiến trình hệ thống hoặc ghi vào /etc/

Nếu mọi lệnh gọi công cụ được thực hiện trực tiếp, một phán đoán sai lầm có thể gây ra thiệt hại không thể khắc phục.

Vì vậy, bắt đầu từ chương này:

"Những gì mô hình muốn làm" không được trực tiếp trở thành "những gì hệ thống thực sự đã làm" -- việc kiểm tra an toàn phải đứng giữa hai điều này.

Nhưng hệ thống cấp phép của agent Hermes không giống như hầu hết các khung agent. Nó không có cái chung deny / allow / ask đường ống. Thay vào đó, nó thực hiện khớp mẫu cụ thể trên lệnh đầu cuối -- bởi vì trong số tất cả các công cụ, terminal là công cụ nguy hiểm nhất.

Phát hiện lệnh nguy hiểm

Giải thích các thuật ngữ chính

Phát hiện lệnh nguy hiểm là gì

Hệ thống duy trì một danh sách các biểu thức chính quy. Trước khi mỗi lệnh đầu cuối được thực thi, chuỗi lệnh sẽ được khớp với danh sách này. Một trận đấu kích hoạt đánh chặn.

Đây không phải là một hệ thống cấp phép công cụ chung mà là một mạng lưới an toàn dành riêng cho các lệnh shell.

phê duyệt là gì

Sau khi một lệnh bị chặn, nó không bị từ chối hoàn toàn. Thay vào đó, người dùng được hỏi:

  • Chế độ CLI: Lời nhắc xác nhận xuất hiện trong terminal
  • Chế độ cổng: Nút phê duyệt được gửi đến người dùng

Người dùng có thể chọn:

  • once -- Cho phép điều này một lần
  • session -- Cho phép loại hoạt động này trong toàn bộ phiên
  • always -- Cho phép vĩnh viễn (ghi vào file config)
  • deny -- Từ chối

Chế độ YOLO là gì

Người dùng có thể bật chế độ YOLO cho phiên hiện tại (/yolo) -- điều này bỏ qua tất cả việc phát hiện lệnh nguy hiểm và thực thi lệnh trực tiếp.

Điều này dành cho những người dùng biết chính xác những gì họ đang làm. Nó được tắt theo mặc định.

Phê duyệt thông minh là gì

Khi một lệnh bị chặn, thay vì nhắc người dùng ngay lập tức, trước tiên hệ thống có thể hỏi LLM phụ trợ: "Lệnh này có thực sự nguy hiểm không?"

Nếu LLM phụ trợ đánh giá rủi ro ở mức thấp thì lệnh có thể được phê duyệt tự động mà không làm phiền người dùng. Điều này làm giảm sự khó chịu của những lời nhắc xác nhận thường xuyên.

Mô hình tinh thần tối thiểu

Terminal tool receives a command
   |
   v
YOLO mode enabled? --yes--> Execute directly
   |
   no
   |
   v
Does the command match DANGEROUS_PATTERNS?
   |
   +-- No match --> Execute directly
   |
   +-- Match found
         |
         v
   Already approved for this type in this session? --yes--> Execute directly
         |
         no
         |
         v
   In the permanent allowlist? --yes--> Execute directly
         |
         no
         |
         v
   [CLI] Show confirmation prompt  /  [Gateway] Send approval buttons
         |
         +-- once / session / always --> Execute, remember the approval
         +-- deny --> Return "Permission denied"
         +-- timeout --> Return "Permission denied"

Điểm mấu chốt: Đây không phải là hệ thống cấp phép công cụ chung. Nó chỉ quản lý các lệnh đầu cuối. read_file, web_searchvà các công cụ khác không đi qua luồng này.

Cấu trúc dữ liệu chính

1. Danh sách mẫu nguy hiểm

DANGEROUS_PATTERNS = [
    (r'\brm\s+-[^\s]*r',                    "recursive delete"),
    (r'\bmkfs\b',                            "format filesystem"),
    (r'\bDROP\s+(TABLE|DATABASE)\b',         "SQL DROP"),
    (r'\bDELETE\s+FROM\b(?!.*\bWHERE\b)',   "SQL DELETE without WHERE"),
    (r'\bkill\s+-9\s+-1\b',                  "kill all processes"),
    (r'\b(curl|wget)\b.*\|\s*(ba)?sh\b',     "pipe remote content to shell"),
    (r'\bgit\s+reset\s+--hard\b',            "git reset --hard"),
    # ... 30+ patterns
]

Mỗi mục nhập là một biểu thức chính quy được ghép nối với một mô tả mà con người có thể đọc được.

Hermes Agent có hơn 30 mẫu bao gồm: xóa tệp, thao tác ổ đĩa, SQL phá hoại, dịch vụ hệ thống, quản lý quy trình, bom phân nhánh, thực thi tập lệnh từ xa, ghi đè cấu hình hệ thống, thao tác Git phá hoại, v.v.

2. Bộ đệm kết quả phê duyệt

# Per-session cache: same type of operation only needs approval once
_session_approved = {"sess_abc": {"recursive delete", "SQL DROP"}}

# Permanent allowlist: written to config.yaml
_permanent_approved = {"recursive delete"}

3. Tùy chọn phê duyệt

once    -> Allow this one time only
session -> Allow this type of operation for the entire session
always  -> Allow permanently, written to the config file
deny    -> Reject execution

Thực hiện tối thiểu

Bước 1: Xác định các mô hình nguy hiểm

DANGEROUS_PATTERNS = [
    (r'\brm\s+-[^\s]*r', "recursive delete"),
    (r'\bDROP\s+(TABLE|DATABASE)\b', "SQL DROP"),
    (r'\bmkfs\b', "format filesystem"),
]

Phiên bản giảng dạy chỉ cần một số mẫu phổ biến nhất. Một hệ thống sản xuất có thể được xây dựng theo thời gian.

Bước 2: Chức năng phát hiện

def detect_dangerous_command(command):
    command_lower = command.lower()
    for pattern, description in DANGEROUS_PATTERNS:
        if re.search(pattern, command_lower, re.IGNORECASE):
            return (True, description)
    return (False, None)

Ý tưởng chính đằng sau bước này:

Không cần hiểu cú pháp shell -- chỉ cần sử dụng biểu thức chính quy để khớp với các mẫu nguy hiểm đã biết. Điều này bao gồm 80% các hoạt động có rủi ro cao.

Bước 3: Quy trình phê duyệt

def approve_command(command, description, session_key):
    # Already approved?
    if description in session_approved.get(session_key, set()):
        return True
    if description in permanent_approved:
        return True
    
    # Ask the user
    choice = prompt_user(command, description)  # once / session / always / deny
    
    if choice == "once":
        return True
    if choice == "session":
        session_approved.setdefault(session_key, set()).add(description)
        return True
    if choice == "always":
        permanent_approved.add(description)
        save_to_config(permanent_approved)
        return True
    return False

Bước 4: Móc vào công cụ đầu cuối

def run_terminal(command, session_key):
    is_dangerous, description = detect_dangerous_command(command)
    
    if is_dangerous and not yolo_enabled(session_key):
        if not approve_command(command, description, session_key):
            return "Permission denied: " + description
    
    return execute(command)

Lưu ý: logic này tồn tại bên trong trình xử lý công cụ đầu cuối, không nằm trong vòng lặp lõi. Các công cụ khác không đi qua luồng này.

Lựa chọn thiết kế độc đáo của agent Hermes tại đây

1. Chỉ quản lý các lệnh đầu cuối, không phải hệ thống cấp phép chung

Hầu hết các khung agent đều có hệ thống cấp phép chung -- mọi lệnh gọi công cụ đều phải trải qua quá trình kiểm tra quyền. agent Hermes không làm điều này. Nó chỉ thực hiện khớp mẫu nguy hiểm trên các lệnh đầu cuối.

Tại sao? Bởi vì read_file đọc một tập tin không gây ra thiệt hại không thể khắc phục được, nhưng rm -rf / có. Việc chặn mọi công cụ khiến hệ thống trở nên khó chịu; chỉ đánh chặn những kẻ thực sự nguy hiểm mới là điều quan trọng.

2. Ngăn chặn bỏ qua Unicode và ANSI

Những kẻ tấn công (hoặc vô tình nhập vào) có thể sử dụng các ký tự có chiều rộng đầy đủ Unicode hoặc chuỗi thoát ANSI để bỏ qua việc so khớp biểu thức chính quy. Hermes Agent bình thường hóa đầu vào trước khi khớp: loại bỏ các chuỗi ANSI và chuyển đổi các ký tự có độ rộng đầy đủ thành độ rộng một nửa.

3. Hai giao diện người dùng phê duyệt cho CLI và Gateway

Trong chế độ CLI, đó là dấu nhắc đầu cuối: [o]nce / [s]ession / [a]lways / [d]eny.
Ở chế độ Cổng, đó là các nút nền tảng (bàn phím nội tuyến Telegram, nút Slack, v.v.).

Cả hai giao diện người dùng đều có chung logic phê duyệt cơ bản -- chỉ có lớp trình bày là khác nhau.

4. Phê duyệt thông minh (phán quyết LLM phụ trợ)

Các lệnh bị chặn có thể được gửi đến LLM phụ trợ để đánh giá rủi ro trước tiên. Nếu rủi ro được đánh giá là thấp, lệnh sẽ được phê duyệt tự động.

Điều này làm giảm sự khó chịu của việc "phải xác nhận thủ công mọi pip install" trong khi vẫn chặn các lệnh thực sự nguy hiểm.

5. Hết thời gian phê duyệt

Nếu người dùng không phản hồi yêu cầu phê duyệt trong một khoảng thời gian nhất định thì mặc định là từ chối. Các agent không phải chờ đợi vô thời hạn.

Làm thế nào nó phù hợp với vòng lặp chính

Logic phê duyệt của chương này không có trong vòng lặp lõi -- nó nằm bên trong trình xử lý của công cụ đầu cuối.

Nói cách khác, vòng lặp cốt lõi hoàn toàn không thay đổi. Những thay đổi là công cụ đầu cuối có một bước kiểm tra bổ sung trước khi thực hiện lệnh:

Core loop -> dispatch("run_terminal", args) -> terminal tool handler
                                               |
                                               v
                                           Detect dangerous patterns
                                               |
                                               +-- Safe -> Execute directly
                                               +-- Dangerous -> Approval -> Execute or deny

Đây cũng là lý do tại sao chương này ở s09 thay vì s02: nó không làm thay đổi kiến trúc của hệ thống công cụ; nó chỉ bổ sung thêm tính năng kiểm tra an toàn bên trong một công cụ cụ thể.

Những lỗi thường gặp của người mới bắt đầu

1. Cố gắng xây dựng một hệ thống cấp phép chung

Không cần phải kiểm tra quyền trên mọi công cụ. Bắt đầu bằng cách khóa cái nguy hiểm nhất (lệnh đầu cuối) và thế là đủ.

2. Chỉ kiểm tra rm

Những mệnh lệnh nguy hiểm vượt xa rm. SQL DROP, định dạng đĩa, kill -9 -1, cuộn tròn | sh, bom nĩa -- tất cả đều cần phải bị chặn lại.

3. Không lưu vào bộ nhớ đệm ở cấp phiên

Nếu mọi pip install kích hoạt lời nhắc xác nhận, người dùng sẽ sớm vô hiệu hóa toàn bộ hệ thống phê duyệt. Hỏi một lần cho mỗi loại hoạt động trong mỗi phiên.

4. Không xử lý bỏ qua Unicode

Các ký tự có độ rộng đầy đủ như rm có thể bỏ qua việc khớp mẫu rm. Bình thường hóa trước, sau đó khớp.

5. Đưa logic phê duyệt vào vòng lặp lõi

Logic phê duyệt thuộc về trình xử lý công cụ, không thuộc về vòng lặp. Vòng lặp không cần biết lệnh nào nguy hiểm.

Ranh giới giảng dạy

Chương này chỉ cần trình bày một dòng rõ ràng:

  1. Khớp mẫu -- Sử dụng biểu thức chính quy để phát hiện các lệnh nguy hiểm đã biết
  2. Quy trình phê duyệt -- Sau trận đấu, hãy hỏi người dùng; kết quả có thể được lưu trữ
  3. Chỉ dành cho terminal -- Không phải là hệ thống cấp phép chung

Cố ý trì hoãn: triển khai phê duyệt thông minh đầy đủ, công cụ chính sách bảo mật thứ ba, nguồn chính sách cấp doanh nghiệp, triển khai cụ thể các nút phê duyệt nền tảng Gateway.

Nếu người đọc có thể yêu cầu agent "bật lên xác nhận khi sắp thực thi rm -rfvà chỉ thực thi sau khi người dùng chấp thuận," chương này đã đạt được mục tiêu.

Sau khi kết thúc chương này, bạn sẽ có thể trả lời

  • Tại sao hệ thống cấp quyền của Hermes Agent chỉ quản lý các lệnh đầu cuối?
  • Cơ chế cốt lõi của việc phát hiện lệnh nguy hiểm là gì?
  • Bốn phương án phê duyệt là gì?
  • Bộ nhớ đệm cấp phiên giải quyết được vấn đề gì?
  • Tại sao logic phê duyệt lại nằm trong bộ xử lý công cụ chứ không phải trong vòng lặp lõi?

Một dòng cần nhớ: Hệ thống cấp phép của agent Hermes không phải là một quy trình cho phép/từ chối chung. Đây là hành vi khớp mẫu nguy hiểm cộng với luồng phê duyệt, nhắm mục tiêu cụ thể vào các lệnh đầu cuối -- bởi vì trong số tất cả các công cụ, terminal là công cụ duy nhất có thể gây ra thiệt hại không thể khắc phục.

Mục lục nguồn