先把敏感信息移出工作环境,再拒绝访问机密文件。建议从结合这两项措施开始。

只读模式、操作审批和退出训练用途各有不同作用。判断它们能否阻止访问机密文件时,需要逐项核对。

分别检查读取、执行和传输

哪些内容可以读取

从工作环境移除不必要的敏感信息。考虑用读取权限的 deny 规则限制机密文件。

超出边界的操作

确认由谁审批。不要轻易通过 Full access 或允许沙箱外执行来扩大权限边界。

网络与其他工具

分别检查命令联网、发送给模型的内容,以及浏览器或 MCP 的访问权限。

不存在一个开关,能同时阻止所有文件访问、网络通信和数据用于训练。

本文于2026年10月8日核对了 OpenAI 关于 Permissions、沙箱、审批与安全以及配置的文档。主要讨论本地沙箱中的命令。示例配置未在真实设备上应用,也未实测其限制是否生效。没有修改设备或账户设置。

1. 只读模式、审批和训练设置

阻止修改文件和阻止读取文件,是两回事。

read-only

限制写入的模式。它不会把可读取的文件内容作为机密隐藏起来。

workspace-write

规定允许编辑的位置。读取范围不一定也限制在相同位置。

控制措施主要控制什么单靠它不能保证什么
只读模式文件能否修改可访问的机密文件不会被读取
审批策略由谁审核跨越边界的操作每次允许范围内的读取都由人审核
文件 deny 规则拒绝读取和写入指定路径删除已粘贴的内容,或阻止通过其他工具访问
命令网络限制沙箱内命令的网络目的地阻止模型、身份验证、浏览器、MCP 和其他服务的所有通信
训练设置处理过的数据是否用于改进模型数据不会被处理或传输

即使使用 on-request,允许范围内的命令也可能无需额外审批就能运行。如需人工审核,请同时检查审批策略和审核请求发给谁。

自动 AI 审核有什么不同

approvals_reviewer = "auto_review" 会将相应审核交给 AI。它不等于人工审核,也不会让每项原本允许的操作都新增审核要求。

来源:OpenAI:审批与沙箱边界。训练用途另见ChatGPT 与 Codex 的训练设置和机密信息。

2. 将敏感信息移出工作环境

修改界面可能只需要源代码和虚构数据。生产环境 API 密钥、客户数据及家庭文件,不必放在同一环境中。

移到另一个文件夹,并不够。如果仍有广泛的读取权限,这些文件可能依然可访问。

工作副本只放必要内容

1
准备源代码和虚构数据

用能复现问题的小规模输入代替生产数据。

2
去掉机密值

配置示例只保留字段名。也要检查日志、备份和历史记录。

3
检查环境的访问范围

确认是否能访问其他文件夹、主目录、共享存储或已连接的应用。

即使用工作副本、独立用户账户或容器,也要分别检查共享目录和提供给它们的凭据。
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 读取真实机密来测试。以下是给用户或管理员的验证计划,不是本设备上的实测报告。

  1. 记录环境:记下 Codex 版本、操作系统、执行位置和所选权限。在 CLI 中,用 /status 查看工作区范围,用 /permissions 查看所选权限。
  2. 检查配置冲突:核对用户设置、受信任项目设置、所选配置、启动参数及管理员限制。不要为了诊断把完整配置文件或机密值粘贴到对话中。
  3. 准备测试文件:在不含机密的独立工作区中,创建预计允许和拒绝访问的文件,以虚构标记作为内容。
  4. 同时验证允许和拒绝:通过同一执行路径,确认允许的文件可读、被拒绝的读取会报错。Codex 自愿不读,不是强制拒绝生效的证据。
  5. 测试不同位置:检查根目录、子文件夹、带后缀文件名和启动后新增的测试文件。不要批准绕过拒绝限制的操作。意外读取成功时,应停止使用该环境并调查。
  6. 检查输出路径:确认测试或构建是否把机密打印到日志中,或将同样信息传给其他 MCP 工具、浏览器和连接的应用。

可获取的信息随 CLI 版本和界面而变,要检查实际输出,不能只依赖命令名称。官方 CLI 还通过 codex sandbox 提供操作系统对应的检查。在认为它们等价之前,应确认辅助命令测试的设置,与日常桌面或 IDE 会话中生效的设置相同。OpenAI:测试沙箱。

事后增加拒绝规则,不能撤回已经读取的内容。需要另行检查过去对话、日志和文件的存储情况,以及训练设置。仅凭成功读取文件,不能认定信息已向第三方泄露。应分别判断读取了什么、传到哪里,以及凭据是否需要处理。

用户也在一条公开的 Codex issue 中请求排除机密文件的方法。它说明这是一项真实需求,并不证明如今仍不支持该功能。本文的规范性描述依据当前官方 Permissions 文档,而非旧帖子。

常见问题

read-only 能阻止 .env 被发送吗?

只读模式限制的是修改,无法据此保证不会发送。要避免可读的 .env 内容进入模型上下文,应分别检查文件读取拒绝规则,以及工作环境是否不含机密。

只有 .gitignore 或 AGENTS.md 够吗?

它们不能代替强制读取拒绝。Git 忽略规则、工作指示和操作系统权限是不同机制。要用测试文件验证 deny 在当前执行环境确实生效。

关闭联网后,Codex 就完全在设备上运行吗?

不是。命令网络限制不会关闭模型或身份验证通信。浏览器、MCP、连接的应用和云端设置也分别管理。

这个示例能在 Windows 上完全保护机密吗?

不能保证完全保护。需要检查测试版支持、操作系统沙箱实现、实际配置层、路径和所用工具。本文示例未在真实设备上应用或实测。