跳转到内容

托管配置

身份 非官方简体中文镜像
翻译状态 AI 翻译 / AI 审校
来源版本 官方未提供
同步日期 2026-07-26
官方原文 learn.chatgpt.com

托管配置控制 ChatGPT 桌面应用、Codex CLI 和 IDE extension 中所涵盖功能支持的本地运行时行为。不同客户端和版本支持的要求可能有所不同。托管配置不会授予 ChatGPT 工作区访问权限、分配席位,也不会取代基于工作区角色的访问控制(RBAC)。有关工作区功能访问,请参阅角色和工作区权限;有关本地运行时策略,请参阅本页面。

企业管理员可以通过两种方式控制本地客户端行为:

  • 要求:管理员强制执行的约束,用户无法覆盖。
  • 托管默认值:受支持客户端启动时应用的初始值。用户仍可在运行期间更改设置;客户端下次启动时会重新应用托管默认值。

管理员强制执行的要求(requirements.toml)

Section titled “管理员强制执行的要求(requirements.toml)”

要求会约束安全敏感设置(审批策略、审批审核者、自动审核策略、沙箱模式、权限配置文件、Web 搜索模式、托管钩子、用户可以启用的 MCP 服务器,以及用户配置的插件市场源中可以添加、安装或刷新的源)。在解析配置时(例如来自 config.toml配置文件 或 CLI 配置覆盖项),如果某个值与强制规则冲突,本地客户端会回退到兼容值并通知用户。如果配置了 mcp_servers 允许列表,客户端只有在 MCP 服务器的名称和身份都与获批准条目匹配时才会启用该服务器;否则客户端会将其禁用。

要求还可以通过 requirements.toml 中的 [features] 表约束功能标志。请注意,功能并不总是安全敏感项,但企业可以根据需要固定其值。省略的键不受约束。

对于 Codex 0.138.0 或更高版本,优先使用带有 allowed_permission_profiles 和托管 default_permissions权限配置文件。仅对仍配置 sandbox_mode 的旧版部署使用 allowed_sandbox_modes

有关完整的键列表,请参阅配置参考中的 requirements.toml 部分

每个受支持的本地客户端都会按从低到高的优先级组合要求:

  1. 系统级 requirements.toml(Unix 系统上的 /etc/codex/requirements.toml,包括 Linux 和 macOS;Windows 上的 %ProgramData%\OpenAI\Codex\requirements.toml)。
  2. 云配置包中交付的企业托管要求。
  3. 本地客户端重新解释为要求的旧版 managed_config.toml 字段。
  4. 通过 com.openai.codex:requirements_toml_base64 交付的 macOS 托管偏好设置(MDM)。

优先级较高的层会覆盖较低层中的普通标量值和列表值。表会按键合并,而规则、钩子和文件系统限制等要求则具有特定于字段的组合行为。请使用当前的 requirements.toml 参考,不要假设每个字段都以相同方式合并。

为保持向后兼容,受支持的本地客户端会将旧版 approval_policyapprovals_reviewersandbox_mode 字段重新解释为要求。此转换会在必要时添加兼容选项;如需明确的允许列表,请使用 requirements.toml

当用户在受支持的计划中使用 ChatGPT 登录时,受支持的本地客户端可以接收与工作区关联的管理员强制要求。这是交付兼容 requirements.toml 的策略渠道。它不会授予工作区访问权限,也不会取代工作区 RBAC。

打开托管配置以创建和分配云托管要求。例如,此策略要求受支持的客户端使用美国数据驻留,限制审批和沙箱选项,并在运行受支持的 shell 入口点之前发出提示:

enforce_residency = "us"
allowed_approval_policies = ["on-request"]
allowed_sandbox_modes = ["read-only", "workspace-write"]
[rules]
prefix_rules = [
{ pattern = [{ any_of = ["bash", "sh", "zsh"] }], decision = "prompt", justification = "Require explicit approval for shell entry points" },
]

请确认每个托管客户端版本都支持所选的键,并先使用小范围用户组测试策略,再在整个组织中分配。请使用配置参考了解当前架构,并使用管理界面了解当前的分配行为。

服务会选择适用于已登录身份的企业托管要求层。本地客户端会将这些层与位置和优先级中所述的其他要求源一起评估。请使用当前管理界面在工作区一侧创建和分配配置。不要依赖复制的组匹配算法;该行为由管理服务负责,并且可以独立于本地要求格式进行更改。

有关支持的键和示例,请参阅requirements.toml 示例requirements.toml 参考

本地客户端如何应用云托管要求

Section titled “本地客户端如何应用云托管要求”

当用户启动受支持的本地客户端,并在受支持的计划中使用 ChatGPT 登录时,客户端首先会检查是否存在有效且与身份匹配的缓存条目。如果没有有效条目,客户端会通过重试获取适用的配置包,并在成功后写入签名缓存条目。如果请求失败或超时,且没有可用的有效缓存,云配置包加载会返回错误,而不会在缺少云托管要求层的情况下静默启动。

解析缓存后,客户端会将云要求与上述其他要求层组合。后台刷新可以更新缓存,供下次启动使用;它不会替换当前进程中已经加载的要求。

此示例会阻止 --ask-for-approval never--sandbox danger-full-access(包括 --yolo):

allowed_approval_policies = ["untrusted", "on-request"]
allowed_sandbox_modes = ["read-only", "workspace-write"]

要为托管用户禁用 Appshots,请设置顶层 allow_appshots 要求:

allow_appshots = false

在支持 Appshots 的情况下,allow_appshots = false 会将其禁用。如果省略该键,要求不会约束 Appshots,正常的产品可用性检查仍会生效。通过 configRequirements/read 读取有效要求的 App-server 客户端会收到与 allowAppshots 相同的限制;省略或将 allowAppshots 设为 null 不会禁用 Appshots。

要为托管用户禁用设备远程控制,请设置顶层 allow_remote_control 要求:

allow_remote_control = false

在支持设备远程控制的情况下,allow_remote_control = false 会将其禁用。如果省略该键,要求不会约束设备远程控制,正常的产品可用性检查仍会生效。此要求不会禁用 SSH 远程连接。

使用 allowed_permission_profiles 控制用户可以选择的内置和自定义权限配置文件。这是 allowed_sandbox_modes 对应的权限配置文件机制;请使用与用户选择权限方式相匹配的允许列表。

权限配置文件允许列表要求 Codex 0.138.0 或更高版本。Codex 0.137.0 及更早版本会忽略 allowed_permission_profiles 和托管的 default_permissions

仅当所有托管客户端都运行支持该功能的版本后,才使用以下权限配置文件示例。在整个客户端群升级完成前,不要部署托管自定义配置文件。

存在该表时,它就是允许的配置文件完整列表。设为 true 的配置文件会被允许;省略或设为 false 的配置文件会被拒绝,包括未来 Codex 版本中新增的内置配置文件。

此策略允许只读访问和工作区访问,但不允许完全访问:

default_permissions = ":workspace"
[allowed_permission_profiles]
":read-only" = true
":workspace" = true
# ":danger-full-access" is omitted, so it is denied.

管理员可以在同一要求源中定义自定义配置文件。请使用不会与用户已加载配置中的名称冲突的组织专用配置文件名称。自定义名称不能以 : 开头,也不能使用保留名称 filesystem

不要将托管自定义配置文件部署到运行 Codex 0.137.0 或更早版本的客户端。这些客户端可以识别配置文件表,但无法识别用于选择该配置文件的托管默认值。

例如:

default_permissions = "acme_review_only"
[allowed_permission_profiles]
":read-only" = true
":workspace" = true
acme_review_only = true
# ":danger-full-access" is intentionally omitted, so it is denied.
[permissions.acme_review_only]
description = "Review code without modifying the workspace."
extends = ":read-only"

当用户只能选择管理员定义的配置文件时,请省略所有内置配置文件:

default_permissions = "acme_workspace"
[allowed_permission_profiles]
acme_workspace = true
[permissions.acme_workspace]
description = "Workspace access with sensitive files denied."
extends = ":workspace"
[permissions.acme_workspace.filesystem]
glob_scan_max_depth = 3
[permissions.acme_workspace.filesystem.":workspace_roots"]
"**/*.env" = "deny"

即使用户不能直接选择内置的 :workspace 配置文件,自定义配置文件仍可以扩展 :workspace

权限允许列表按配置文件名称组合。由于云要求的优先级高于系统要求,云要求可以使用 false 关闭系统文件所允许的配置文件。

云要求:

default_permissions = ":read-only"
[allowed_permission_profiles]
":read-only" = true
":workspace" = false

系统要求:

[allowed_permission_profiles]
":read-only" = true
":workspace" = true # Not honored because cloud requirements set this to false.

请将 default_permissions 明确设置为允许的配置文件。如果省略该值,仅当 :workspace:read-only 都被明确允许时,本地运行时才会默认使用 :workspace。当不存在 allowed_permission_profiles 时,托管要求不会限制用户可以选择的配置文件名称。每个条目都必须指定内置配置文件,或在已加载配置或要求源中定义的自定义配置文件。在托管要求中定义自定义配置文件,以便集中控制其行为。

当同一托管策略需要在不同主机上应用不同的沙箱要求时,请使用 [[remote_sandbox_config]]。例如,可以为笔记本电脑保留更严格的默认设置,同时允许在匹配的开发计算机或 CI 运行器上写入工作区。主机专用条目目前只会覆盖 allowed_sandbox_modes

allowed_sandbox_modes = ["read-only"]
[[remote_sandbox_config]]
hostname_patterns = ["*.devbox.example.com", "runner-??.ci.example.com"]
allowed_sandbox_modes = ["read-only", "workspace-write"]

本地运行时会将每个 hostname_patterns 条目与尽力解析出的主机名进行比较。如果可用,它会优先使用完全限定域名,否则回退到本地主机名。匹配不区分大小写;* 匹配任意字符序列,? 匹配一个字符。

在同一要求源中,第一个匹配的 [[remote_sandbox_config]] 条目优先。如果没有匹配条目,本地运行时会保留顶层 allowed_sandbox_modes。主机名匹配仅用于策略选择;不要将其视为经过身份验证的设备证明。

还可以约束 Web 搜索模式:

allowed_web_search_modes = ["cached"] # "disabled" remains implicitly allowed

allowed_web_search_modes = [] 仅允许 "disabled"。例如,allowed_web_search_modes = ["cached"] 会阻止实时 Web 搜索,即使是在 danger-full-access 会话中。

警告

[experimental_network] 处于实验阶段,可能会发生变化。在未针对用户运行的本地客户端版本和操作系统进行验证前,不要在企业部署中广泛启用这些要求。Windows 支持仍然有限;除非已在环境中进行测试,否则应避免将此策略应用于 Windows 用户。

当管理员需要集中定义网络访问要求时,请在 requirements.toml 中使用 [experimental_network]。这些要求与用户的 features.network_proxy 开关相互独立:它们可以在不启用该功能标志的情况下配置沙箱网络,但当活动沙箱保持网络关闭时,它们不会授予命令网络访问权限。

experimental_network.enabled = true
experimental_network.allowed_domains = [
"api.openai.com",
"*.example.com",
]
experimental_network.denied_domains = [
"blocked.example.com",
"*.exfil.example.com",
]

仅当同时定义管理员拥有的 allowed_domains,并且希望该允许列表成为唯一允许列表时,才使用 experimental_network.managed_allowed_domains_only = true。如果将其设为 true 却没有托管允许规则,用户添加的域名允许规则将不会继续生效。

域名语法、本地/私有目标规则、拒绝优先于允许的行为以及 DNS 重绑定限制,与代理审批和安全中所述的沙箱网络行为相同。

还可以为接收托管 requirements.toml 的用户固定功能标志

[features]
personality = true
unified_exec = false
# Disable surface-specific features when needed.
browser_use = false
browser_use_full_cdp_access = false
browser_use_external = false
in_app_browser = false
computer_use = false

对于运行时功能,请使用 config.toml[features] 表中的规范功能键。本地运行时会对已识别的功能进行规范化以符合这些固定值,并拒绝与之冲突的 config.toml 或配置文件功能设置写入。

  • in_app_browser = false 会禁用内置浏览器窗格。
  • browser_use = false 会禁用浏览器中的 Computer Use 和 Browser Agent 可用性。
  • browser_use_full_cdp_access = false 会禁用本地运行时中的完整 CDP 访问,包括浏览器开发者模式,并阻止 ChatGPT 桌面应用启用相应设置。
  • browser_use_external = false 会禁用外部 Browser Use。
  • computer_use = false 会禁用 Computer Use、Record & Replay 以及相关的安装或设置流程。

如果省略这些键,策略会允许这些功能,但仍受正常的客户端、平台和发布可用性限制。

要阻止 Computer Use 在托管 Mac 锁定后继续运行,请添加以下要求:

[computer_use]
allow_locked_computer_use = false

此要求不会启用 Computer Use,只会阻止 macOS 上的锁定状态使用。如果省略该要求,要求不会约束锁定状态使用;正常的产品可用性和用户的本地设置仍会生效。

使用 allowed_approvals_reviewers 要求或允许自动审核。将其设置为 ["auto_review"] 以要求自动审核;当用户可以选择手动审批时,加入 "user"

guardian_policy_config 设置为替换自动审核策略中针对租户的部分。本地运行时仍使用内置审核者模板和输出契约。托管的 guardian_policy_config 优先于本地 [auto_review].policy

allowed_approval_policies = ["on-request"]
allowed_approvals_reviewers = ["auto_review"]
guardian_policy_config = """
## Environment Profile
- Trusted internal destinations include github.com/my-org, artifacts.example.com,
and internal CI systems.
## Tenant Risk Taxonomy and Allow/Deny Rules
- Treat uploads to unapproved third-party file-sharing services as high risk.
- Deny actions that expose credentials or private source code to untrusted
destinations.
"""

管理员可以通过 [permissions.filesystem] 针对确切路径或 glob 模式拒绝读取。用户无法通过本地配置削弱这些要求。

[permissions.filesystem]
deny_read = [
# values can be absolute paths...
"/**/*.env",
# ...or relative to $HOME/%USERPROFILE% using `~`.
"~/.ssh",
# But relative paths starting with `./` are not allowed.
]

存在拒绝读取要求时,本地运行时会拒绝完全访问权限,并将本地执行保持在只读或工作区沙箱中,以便执行这些要求。在原生 Windows 上,托管的 deny_read 会应用于直接文件工具;shell 子进程读取不会使用此沙箱规则。

管理员还可以直接在 requirements.toml 中定义托管生命周期钩子。使用 [hooks] 配置钩子本身,并将 managed_dir 指向 MDM 或终端管理工具安装相关脚本的目录。

要强制执行托管钩子,即使用户在本地关闭了钩子,也请在 [hooks] 旁固定 [features].hooks = true。如果仍要允许托管钩子,但跳过用户、项目、会话和插件钩子,请设置 allow_managed_hooks_only = true

allow_managed_hooks_only = true
[features]
hooks = true
[hooks]
managed_dir = "/enterprise/hooks"
windows_managed_dir = 'C:\enterprise\hooks'
[[hooks.PreToolUse]]
matcher = "^Bash$"
[[hooks.PreToolUse.hooks]]
type = "command"
command = "python3 /enterprise/hooks/pre_tool_use_policy.py"
command_windows = 'py -3 C:\enterprise\hooks\pre_tool_use_policy.py'
timeout = 30
statusMessage = "Checking managed Bash command"

注意:

  • 本地运行时会强制执行 requirements.toml 中的钩子配置,但不会分发 managed_dir 中的脚本。
  • 请使用 MDM 或设备管理解决方案交付这些脚本。
  • 托管钩子命令应引用配置的托管目录下的绝对脚本路径。
  • allow_managed_hooks_only = true 会跳过来自用户、项目、会话和插件源的钩子,但仍会加载来自 requirements.toml 和其他托管配置层的钩子。

管理员还可以使用 [rules] 表从 requirements.toml 中强制执行限制性命令规则。这些规则会与常规 .rules 文件合并,并采用限制最严格的决定。

.rules 不同,要求规则必须指定 decision,且该决定必须为 "prompt""forbidden"(不能为 "allow")。

[rules]
prefix_rules = [
{ pattern = [{ token = "rm" }], decision = "forbidden", justification = "Use git clean -fd instead." },
{ pattern = [{ token = "git" }, { any_of = ["push", "commit"] }], decision = "prompt", justification = "Require review before mutating history." },
]

要限制本地客户端可以启用的 MCP 服务器,请添加 mcp_servers 获批准列表。对于 stdio 服务器,请按 command 匹配;对于可流式传输的 HTTP 服务器,请按 url 匹配:

[mcp_servers.docs]
identity = { command = "codex-mcp" }
[mcp_servers.remote]
identity = { url = "https://example.com/mcp" }

identity.command 的字符串形式仅匹配配置的 command,不会检查 argscwdenvenv_vars

要约束完整的 stdio 调用,请匹配可执行文件和每个位置参数:

[mcp_servers.internal.identity]
command = { executable = "/usr/local/bin/codex-mcp", args = [
{ match = "exact", value = "serve" },
{ match = "prefix", value = "--workspace=" },
] }

可执行文件、参数数量和参数顺序必须匹配。参数和 URL 规则支持 exactprefix 以及完整值的 regex 匹配。结构化命令规则仍不会检查 cwdenvenv_vars。插件捆绑的 MCP 服务器在 plugins.<plugin>.mcp_servers.<server> 下使用相同的身份结构。

如果存在 mcp_servers 但其为空,本地客户端会禁用所有 MCP 服务器。

要在受支持的本地客户端中关闭插件,请在 requirements.toml 中将 features.plugins 设置为 false

features.plugins = false

用户使用 API key 登录 Codex 时,此设置同样适用。有关支持的配置,请参阅features.plugins 参考

要限制对用户配置的市场源执行的操作,请设置 restrict_to_allowed_sources = true,并定义一个或多个源规则:

[marketplaces]
restrict_to_allowed_sources = true
[marketplaces.allowed_sources.company_plugins]
source = "git"
url = "https://github.com/example/company-plugins.git"
ref = "main"
[marketplaces.allowed_sources.internal_git]
source = "host_pattern"
host_pattern = '^git\.example\.com$'
[marketplaces.allowed_sources.local_plugins]
source = "local"
path = "/opt/company/codex-plugins"

Git 规则会匹配规范化的仓库 URL,并在存在时匹配完全一致的 ref。主机模式是针对小写 Git 主机进行匹配的正则表达式;如需匹配整个主机,请使用 ^$。本地规则要求使用绝对的规范化路径。完整架构和合并行为请参阅requirements.toml 参考

对于用户配置的源,这些要求会拒绝不匹配的市场添加、插件安装和已配置 Git 市场刷新操作。当其源和保留名称匹配时,由 Codex 管理的 OpenAI 市场仍然可用。这些要求不会在运行时过滤已经配置的用户市场或其中的插件。

这些源限制仅适用于支持插件市场操作的本地客户端:桌面应用中的 ChatGPT Work 和 Codex,以及 Codex CLI。它们不会向 Chat、IDE extension 或移动端添加插件。

托管默认值会叠加在用户本地的 config.toml 之上,并优先于任何 CLI --config 覆盖项,在受支持的本地客户端启动时设置初始值。用户仍可在运行期间更改这些设置;客户端会在下次启动时重新应用托管默认值。

请确保托管默认值符合你的要求;本地运行时会拒绝不允许的值。

本地运行时按以下顺序组装生效配置(顶部覆盖底部):

  • 托管偏好设置(macOS MDM;最高优先级)
  • managed_config.toml(系统/托管文件)
  • config.toml(用户的基础配置)

CLI --config key=value 覆盖项会应用于基础配置,但托管层会覆盖这些设置。这意味着每次运行都会从托管默认值开始,即使你提供了本地标志。

云托管要求会影响要求层(而非托管默认值)。有关优先级,请参阅上方的“管理员强制执行的要求”部分。

  • Linux/macOS(Unix):/etc/codex/managed_config.toml
  • Windows/非 Unix:~/.codex/managed_config.toml

如果文件不存在,本地运行时会跳过托管层。

在 macOS 上,管理员可以推送设备配置文件,在以下位置提供经过 base64 编码的 TOML 负载:

  • 偏好设置域:com.openai.codex
  • 键:
    • config_toml_base64(托管默认值)
    • requirements_toml_base64(要求)

本地运行时会将这些“托管偏好设置”负载解析为 TOML。对于托管默认值(config_toml_base64),托管偏好设置具有最高优先级。对于要求(requirements_toml_base64),优先级遵循上方所述的云托管要求顺序。要求侧的 [features] 表同样适用于 requirements_toml_base64;其中也应使用规范的功能键。

本地运行时遵循标准 macOS MDM 负载,因此你可以使用 Jamf ProFleetKandji 等工具分发设置。一个轻量级的部署流程如下:

  1. 构建托管负载 TOML,并使用 base64 对其进行编码(不换行)。
  2. 将字符串放入 MDM 配置文件的 com.openai.codex 域下,使用 config_toml_base64(托管默认值)或 requirements_toml_base64(要求)。
  3. 推送配置文件,然后让用户重启受支持的本地客户端,并确认启动配置摘要反映了托管值。
  4. 撤销或更改策略时,更新托管负载;客户端会在下次启动时读取刷新的偏好设置。

避免在负载中嵌入机密或频繁变化的动态值。应像管理其他 MDM 设置一样,在变更控制下管理托管 TOML。

# Set conservative defaults
approval_policy = "on-request"
sandbox_mode = "workspace-write"
[sandbox_workspace_write]
network_access = false # keep network disabled unless explicitly allowed
[otel]
environment = "prod"
exporter = "otlp-http" # point at your collector
log_user_prompt = false # keep prompts redacted
# exporter details live under exporter tables; see Monitoring and telemetry above

  • 对大多数用户,优先使用带审批的 workspace-write;仅在受控容器中使用完全访问权限。
  • 除非安全审查允许使用工作流所需的收集器或域,否则保持 network_access = false
  • 使用托管配置固定 OTel 设置(导出器、环境),但除非你的策略明确允许存储提示内容,否则保持 log_user_prompt = false
  • 定期审计本地 config.toml 与托管策略之间的差异,以发现配置漂移;托管层应优先于本地标志和文件。