先把敏感信息移出工作环境,再拒绝访问机密文件。建议从结合这两项措施开始。
只读模式、操作审批和退出训练用途各有不同作用。判断它们能否阻止访问机密文件时,需要逐项核对。
分别检查读取、执行和传输
从工作环境移除不必要的敏感信息。考虑用读取权限的 deny 规则限制机密文件。
确认由谁审批。不要轻易通过 Full access 或允许沙箱外执行来扩大权限边界。
分别检查命令联网、发送给模型的内容,以及浏览器或 MCP 的访问权限。
本文于2026年10月8日核对了 OpenAI 关于 Permissions、沙箱、审批与安全以及配置的文档。主要讨论本地沙箱中的命令。示例配置未在真实设备上应用,也未实测其限制是否生效。没有修改设备或账户设置。
目录
1. 只读模式、审批和训练设置
阻止修改文件和阻止读取文件,是两回事。
限制写入的模式。它不会把可读取的文件内容作为机密隐藏起来。
规定允许编辑的位置。读取范围不一定也限制在相同位置。
| 控制措施 | 主要控制什么 | 单靠它不能保证什么 |
|---|---|---|
| 只读模式 | 文件能否修改 | 可访问的机密文件不会被读取 |
| 审批策略 | 由谁审核跨越边界的操作 | 每次允许范围内的读取都由人审核 |
| 文件 deny 规则 | 拒绝读取和写入指定路径 | 删除已粘贴的内容,或阻止通过其他工具访问 |
| 命令网络限制 | 沙箱内命令的网络目的地 | 阻止模型、身份验证、浏览器、MCP 和其他服务的所有通信 |
| 训练设置 | 处理过的数据是否用于改进模型 | 数据不会被处理或传输 |
即使使用 on-request,允许范围内的命令也可能无需额外审批就能运行。如需人工审核,请同时检查审批策略和审核请求发给谁。
自动 AI 审核有什么不同
approvals_reviewer = "auto_review" 会将相应审核交给 AI。它不等于人工审核,也不会让每项原本允许的操作都新增审核要求。
来源:OpenAI:审批与沙箱边界。训练用途另见ChatGPT 与 Codex 的训练设置和机密信息。
2. 将敏感信息移出工作环境
修改界面可能只需要源代码和虚构数据。生产环境 API 密钥、客户数据及家庭文件,不必放在同一环境中。
移到另一个文件夹,并不够。如果仍有广泛的读取权限,这些文件可能依然可访问。
工作副本只放必要内容
用能复现问题的小规模输入代替生产数据。
配置示例只保留字段名。也要检查日志、备份和历史记录。
确认是否能访问其他文件夹、主目录、共享存储或已连接的应用。
Git 忽略规则能阻止读取吗?
.gitignore 指定 Git 应忽略的未跟踪文件,并不会撤销操作系统的读取权限。即使搜索工具通常跳过某个文件,也不能保证通过明确路径直接读取时会遭到拒绝。新增忽略规则也不影响已被 Git 跟踪的文件。Git 文档:gitignore 的作用范围。
文字指示与强制访问限制的区别
在 AGENTS.md 中写“不要读取机密”,可以作为有用的工作指示,但本身不会建立操作系统的访问限制。应将指示与强制访问限制结合起来。匿名化输入的例子见向 AI 工具输入信息时的注意事项。
3. 拒绝读取的示例配置
Permission profiles 是测试版功能。使用前,请检查支持的环境,以及当前会话实际选用的配置。
read:读取允许读取目标
write:编辑允许写入目标
deny:拒绝同时拒绝读取和写入目标
注意与旧版沙箱配置的冲突
旧设置仍生效时,可能不会使用 Permission profiles。
检查冲突设置和管理员限制
不要混用旧设置:default_permissions 和 [permissions] 不应与旧版 sandbox_mode 或 [sandbox_workspace_write] 混用。通常,已加载配置中存在 sandbox_mode,或启动时使用 --sandbox,就会采用旧机制。管理员通过 allowed_permission_profiles 施加的控制属于另一项条件。
以下是一个用于说明的配置方案:在官方工作区范围示例的基础上,增加机密文件拒绝规则和人工审批。不要用它替换全部现有配置。先检查版本支持、组织限制和必要的执行路径,再到无机密的测试环境验证。
在哪里配置:用户级与项目级设置
~/.codex/config.toml
.codex/config.toml
两者的作用范围和加载条件不同。项目配置仅对受信任项目加载。
default_permissions = "project-private"
approval_policy = "on-request"
approvals_reviewer = "user"
[permissions.project-private]
extends = ":workspace"
[permissions.project-private.filesystem]
":root" = "deny"
":minimal" = "read"
[permissions.project-private.filesystem.":workspace_roots"]
".env" = "deny"
".env.production" = "deny"
"secrets" = "deny"
[permissions.project-private.network]
enabled = false
这个示例覆盖哪些路径?
应用于当前工作区和每个附加工作区
.env拟拒绝访问.env.production拟拒绝访问secrets/ 及其内容拟拒绝访问subfolder/.env另行检查改名的机密或日志中的副本另行检查:root 拒绝读取。例外包括运行所需的 :minimal,以及继承的配置所允许的临时目录。
继承 :workspace 的编辑权限,并拒绝上述具体路径。这个示例不会识别混入输出内容的机密。
配置名称、多工作区与临时文件
project-private 是本示例选用的名称。:workspace_roots 覆盖当前及附加工作区,针对每个根目录下直接列出的路径。secrets 针对该名称的文件或目录子树。
这个配置并不阻止工作区外的所有读取。还需要避免把机密复制到临时存储中。
来源:OpenAI:Permission profile 配置、拒绝规则与范围。本文没有报告将示例应用于真实设备并验证隔离效果的结果。
4. .env 匹配模式与可能遗漏的路径
已知位置的机密文件适合用确切名称指定。使用模式时,要区分 *.env 和 .env.*。不能假设官方 **/*.env 示例在相同条件下也会拒绝 .env.production。
| 示例规则 | 预期目标 | 另行检查 |
|---|---|---|
.env | 工作区根目录下直接存放的同名文件 | 子文件夹和带附加后缀的文件名 |
.env.production | 根目录下的生产配置文件 | 其他名称的生产配置或副本 |
secrets | 根目录下的同名路径及其内容 | 日志、备份等其他位置的副本 |
**/*.env | 不同目录层级中以 .env 结尾的文件 | 带后缀的文件名、扫描深度和启动后的变化 |
检查目录深度及启动后新增的文件
在 Linux、WSL 和原生 Windows 中,带无限制 ** 的拒绝模式可能需要在启动前进行有界展开。官方文档说明,可将 glob_scan_max_depth 设为至少 1,或用 *.env、*/*.env、*/*/*.env 等模式明确限定深度。如果使用更深的目录,应验证能否覆盖到相应层级。
有些限制机制会在启动前收集匹配路径。应在实际使用的操作系统、版本和执行环境中,检查之后创建的文件是否也被拒绝访问。不要把拒绝模式当作必然保护未来所有机密的通用规则。
权限规则重叠时,哪条优先?
更具体的路径规则可以覆盖更宽泛的规则。对相同路径,拒绝优先;但也可能在广泛拒绝范围内建立较窄的允许范围。还要检查其他配置层和父级配置的继承关系。
来源:OpenAI:用路径或模式拒绝读取、配置加载顺序。项目的 .codex/config.toml 只在受信任项目中加载。要区分文件中写了什么,以及当前会话实际生效了什么。
5. 关闭命令联网能阻止什么
关闭命令联网,会限制相应沙箱内程序的网络使用。不过,Codex 客户端的模型请求与身份验证请求,不属于命令网络控制。命令网络开关处于关闭状态,并不能证明 Codex 读取的代码不会作为模型上下文被传输。
命令网络限制的覆盖范围
命令、脚本和它们的子进程的网络活动。
模型与身份验证、网页搜索、连接的应用、MCP、浏览器与 Computer Use,以及云端任务。
如果要允许联网但限制目的地,除了定义域名规则,还必须启用网络代理。仅在配置中列出允许的域名,并不会激活规则。
| 命令联网 | 代理 | 结果 |
|---|---|---|
| 关闭 | 任意设置 | 不允许命令联网 |
| 开启 | 关闭 | 可以直接联网;配置中的域名规则不生效 |
| 开启 | 开启 | 代理执行域名规则;没有允许的外部目的地时,拒绝外部连接 |
机密仍可能发送到允许的目的地。限制域名不等于检查传输内容。审批沙箱外执行时,不要假定现有拒绝规则仍原样提供保护。需要检查该审批扩大了哪些权限。OpenAI:网络权限与代理要求。
6. 环境变量、操作系统与 Cloud
机密不只存在于文件。如果 shell 中有 API 密钥,即使文件访问被拒绝,子进程也可能通过继承的环境变量使用该值。环境继承由 shell_environment_policy 单独管理。
变量自动排除:true 与 false
true | 默认值不应用对名称中含 KEY、SECRET 或 TOKEN 的变量进行自动排除
false应用上述自动排除
ignore_default_excludes 的值。它独立于文件拒绝规则,按变量名称过滤,无法识别所有机密。这个机制不会保护使用其他名称的变量,也不会保护程序从别处获取的值。set 在排除之后应用,可以重新加入已排除的变量。OpenAI:环境继承与应用顺序。
Windows:也要检查沙箱实现方式
官方记录了 macOS、Linux、WSL 和原生 Windows 的本地 Permission profiles,但具体实现不同。在 Windows 上,使用提升权限的沙箱被描述为更强的方案。未提升权限的沙箱网络隔离较弱,无法实施部分读写隔离策略。官方说明,不支持的策略会导致执行被拒绝。出现错误并不是切换到 Full access 的理由。OpenAI:不同操作系统如何实施限制。
Cloud:不要原样照搬本地设置
请单独核对具体 Codex Cloud 环境的设置。不能假设本地配置自动适用于整个 Cloud 或 dot 的云端环境,也不要把本文的本地配置方案原样用于云端。执行位置的区别见Codex Remote、Cloud 与 PC 连接条件。
7. 用测试文件验证
“我指示它不要读”“我保存了配置”和“读取确实被拒绝”,是不同层次的证据。无需让 Codex 读取真实机密来测试。以下是给用户或管理员的验证计划,不是本设备上的实测报告。
- 记录环境:记下 Codex 版本、操作系统、执行位置和所选权限。在 CLI 中,用
/status查看工作区范围,用/permissions查看所选权限。 - 检查配置冲突:核对用户设置、受信任项目设置、所选配置、启动参数及管理员限制。不要为了诊断把完整配置文件或机密值粘贴到对话中。
- 准备测试文件:在不含机密的独立工作区中,创建预计允许和拒绝访问的文件,以虚构标记作为内容。
- 同时验证允许和拒绝:通过同一执行路径,确认允许的文件可读、被拒绝的读取会报错。Codex 自愿不读,不是强制拒绝生效的证据。
- 测试不同位置:检查根目录、子文件夹、带后缀文件名和启动后新增的测试文件。不要批准绕过拒绝限制的操作。意外读取成功时,应停止使用该环境并调查。
- 检查输出路径:确认测试或构建是否把机密打印到日志中,或将同样信息传给其他 MCP 工具、浏览器和连接的应用。
可获取的信息随 CLI 版本和界面而变,要检查实际输出,不能只依赖命令名称。官方 CLI 还通过 codex sandbox 提供操作系统对应的检查。在认为它们等价之前,应确认辅助命令测试的设置,与日常桌面或 IDE 会话中生效的设置相同。OpenAI:测试沙箱。
事后增加拒绝规则,不能撤回已经读取的内容。需要另行检查过去对话、日志和文件的存储情况,以及训练设置。仅凭成功读取文件,不能认定信息已向第三方泄露。应分别判断读取了什么、传到哪里,以及凭据是否需要处理。
用户也在一条公开的 Codex issue 中请求排除机密文件的方法。它说明这是一项真实需求,并不证明如今仍不支持该功能。本文的规范性描述依据当前官方 Permissions 文档,而非旧帖子。
常见问题
read-only 能阻止 .env 被发送吗?
只读模式限制的是修改,无法据此保证不会发送。要避免可读的 .env 内容进入模型上下文,应分别检查文件读取拒绝规则,以及工作环境是否不含机密。
只有 .gitignore 或 AGENTS.md 够吗?
它们不能代替强制读取拒绝。Git 忽略规则、工作指示和操作系统权限是不同机制。要用测试文件验证 deny 在当前执行环境确实生效。
关闭联网后,Codex 就完全在设备上运行吗?
不是。命令网络限制不会关闭模型或身份验证通信。浏览器、MCP、连接的应用和云端设置也分别管理。
这个示例能在 Windows 上完全保护机密吗?
不能保证完全保护。需要检查测试版支持、操作系统沙箱实现、实际配置层、路径和所用工具。本文示例未在真实设备上应用或实测。