Tiếng Việt

Quy tắc

Kiểm soát những lệnh Codex có thể chạy bên ngoài sandbox

Sử dụng quy tắc để kiểm soát những lệnh Codex có thể chạy bên ngoài sandbox.

Tạo tệp quy tắc

  1. Tạo tệp .rules trong thư mục rules/ bên cạnh một lớp cấu hình đang hoạt động (ví dụ: ~/.codex/rules/default.rules).
  2. Thêm một quy tắc. Ví dụ này yêu cầu xác nhận trước khi cho phép gh pr view chạy bên ngoài sandbox.
   # Prompt before running commands with the prefix `gh pr view` outside the sandbox.
   prefix_rule(
       # The prefix to match.
       pattern = ["gh", "pr", "view"],

       # The action to take when Codex requests to run a matching command.
       decision = "prompt",

       # Optional rationale for why this rule exists.
       justification = "Viewing PRs is allowed with approval",

       # `match` and `not_match` are optional "inline unit tests" where you can
       # provide examples of commands that should (or should not) match this rule.
       match = [
           "gh pr view 7888",
           "gh pr view --repo openai/codex",
           "gh pr view 7888 --json title,body,comments",
       ],
       not_match = [
           # Does not match because the `pattern` must be an exact prefix.
           "gh pr --repo openai/codex view 7888",
       ],
   )
  1. Khởi động lại Codex.

Codex quét rules/ trong mọi lớp cấu hình đang hoạt động khi khởi động, bao gồm các vị trí Cấu hình nhóm và lớp người dùng tại ~/.codex/rules/. Quy tắc cục bộ của dự án trong <repo>/.codex/rules/ chỉ được tải khi lớp .codex/ của dự án được tin cậy.

Khi bạn thêm một lệnh vào danh sách cho phép trong TUI, Codex ghi vào lớp người dùng tại ~/.codex/rules/default.rules để các lượt chạy sau có thể bỏ qua yêu cầu xác nhận.

Khi Phê duyệt thông minh được bật (theo mặc định), Codex có thể đề xuất một prefix_rule cho bạn trong các yêu cầu nâng quyền. Hãy xem xét kỹ tiền tố được đề xuất trước khi chấp nhận.

Quản trị viên cũng có thể áp đặt các mục prefix_rule hạn chế từ requirements.toml.

Tìm hiểu các trường quy tắc

prefix_rule() hỗ trợ các trường sau:

  • pattern (bắt buộc): Danh sách không trống xác định tiền tố lệnh cần khớp. Mỗi phần tử là một trong hai loại:
    • Chuỗi ký tự cố định (ví dụ: "pr").
    • Tập hợp các chuỗi ký tự cố định (ví dụ: ["view", "list"]) để khớp các lựa chọn thay thế tại vị trí đối số đó.
  • decision (mặc định là "allow"): Hành động cần thực hiện khi quy tắc khớp. Codex áp dụng quyết định hạn chế nhất khi có nhiều quy tắc khớp (forbidden > prompt > allow).
    • allow: Chạy lệnh bên ngoài sandbox mà không yêu cầu xác nhận.
    • prompt: Yêu cầu xác nhận trước mỗi lần gọi khớp.
    • forbidden: Chặn yêu cầu mà không hỏi xác nhận.
  • justification (không bắt buộc): Lý do không trống, dễ hiểu đối với con người cho quy tắc. Codex có thể hiển thị lý do này trong prompt phê duyệt hoặc thông báo từ chối. Khi sử dụng forbidden, hãy nêu một phương án thay thế được đề xuất trong phần giải thích nếu phù hợp (ví dụ: "Use \rg` instead of `grep`."`).
  • matchnot_match (mặc định là []): Các ví dụ mà Codex xác thực khi tải quy tắc. Sử dụng chúng để phát hiện lỗi trước khi quy tắc có hiệu lực.

Khi Codex xem xét chạy một lệnh, Codex so sánh danh sách đối số của lệnh với pattern. Trong nội bộ, Codex coi lệnh là một danh sách đối số (giống dữ liệu mà execvp(3) nhận được).

Trình bao shell và lệnh phức hợp

Một số công cụ gói nhiều lệnh shell vào một lần gọi, ví dụ:

["bash", "-lc", "git add . && rm -rf /"]

Vì loại lệnh này có thể ẩn nhiều hành động trong một chuỗi, Codex xử lý bash -lc, bash -c và các biến thể tương đương zsh / sh theo cách đặc biệt.

Khi Codex có thể tách tập lệnh một cách an toàn

Nếu tập lệnh shell là một chuỗi lệnh tuyến tính chỉ gồm:

  • các từ đơn thuần (không mở rộng biến, không có VAR=..., $FOO, *, v.v.)
  • được nối bằng các toán tử an toàn (&&, ||, ; hoặc |)

thì Codex sẽ phân tích cú pháp tập lệnh (bằng tree-sitter) và tách thành các lệnh riêng lẻ trước khi áp dụng quy tắc của bạn.

Tập lệnh ở trên được coi là hai lệnh riêng biệt:

  • ["git", "add", "."]
  • ["rm", "-rf", "/"]

Sau đó, Codex đánh giá từng lệnh theo các quy tắc của bạn và kết quả hạn chế nhất sẽ được áp dụng.

Ngay cả khi bạn cho phép pattern=["git", "add"], Codex cũng không tự động cho phép git add . && rm -rf / vì phần rm -rf / được đánh giá riêng và ngăn toàn bộ lần gọi được tự động cho phép.

Cách này ngăn các lệnh nguy hiểm bị che giấu bên cạnh các lệnh an toàn.

Khi Codex không tách tập lệnh

Nếu tập lệnh sử dụng các tính năng shell nâng cao hơn, chẳng hạn như:

  • chuyển hướng (>, >>, <)
  • phép thay thế ($(...), ...)
  • biến môi trường (FOO=bar)
  • mẫu ký tự đại diện (*, ?)
  • luồng điều khiển (if, for, && kèm phép gán, v.v.)

thì Codex không cố diễn giải hoặc tách tập lệnh.

Trong các trường hợp đó, toàn bộ lần gọi được coi là:

["bash", "-lc", "<full script>"]

và các quy tắc của bạn được áp dụng cho một lần gọi đó.

Với cách xử lý này, bạn có được tính bảo mật của việc đánh giá theo từng lệnh khi có thể thực hiện an toàn, cùng hành vi thận trọng khi không thể.

Kiểm thử tệp quy tắc

Sử dụng codex execpolicy check để kiểm thử cách các quy tắc áp dụng cho một lệnh:

codex execpolicy check --pretty \
  --rules ~/.codex/rules/default.rules \
  -- gh pr view 7888 --json title,body,comments

Lệnh xuất JSON cho biết quyết định nghiêm ngặt nhất và mọi quy tắc khớp, bao gồm mọi giá trị justification từ các quy tắc đã khớp. Sử dụng nhiều cờ --rules để kết hợp các tệp và thêm --pretty để định dạng đầu ra.

Tìm hiểu ngôn ngữ quy tắc

Định dạng tệp .rules sử dụng Starlark (xem đặc tả ngôn ngữ). Cú pháp của nó tương tự Python nhưng được thiết kế để chạy an toàn: công cụ quy tắc có thể chạy mà không gây tác dụng phụ (ví dụ: tác động đến hệ thống tệp).