Quy tắc

Kiểm soát những lệnh Codex có thể chạy bên ngoài môi trường cô lập

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

Tạo tệp quy tắc

Đối với quyền truy cập máy tính cục bộ với Work Cloud, hãy cấu hình các quy tắc lệnh được quản lý có hỗ trợ bằng trường TOML rules trong Agent Security. Các quy tắc này áp dụng cho trình thực thi cục bộ; các container đám mây của Work sử dụng chính sách Work Cloud hiện có.

Các hướng dẫn về .rules cục bộ này áp dụng cho Codex; đừng mặc định rằng quyền truy cập máy tính cục bộ với Work Cloud sẽ đọc các tệp quy tắc cục bộ. Xem Cấu hình được quản lý và Tài liệu tham khảo cấu hình để biết các yêu cầu đối với Work được quản lý.

  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 môi trường cô lập.
   # 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 môi trường cô lập 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`."`).
  • match và not_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 thao tác trong một chuỗi, Codex xử lý đặc biệt đối với bash -lc, bash -c và các dạng tương đương zsh / sh của chúng.

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ì Codex đánh giá rm -rf / riêng biệt.

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 ngôn ngữ này giống Python, nhưng được thiết kế để thực thi an toàn: bộ máy quy tắc có thể chạy ngôn ngữ này mà không gây tác động phụ (ví dụ: tác động đến hệ thống tệp).