1. 区分描述计算的内容与授予访问权限的内容
先从程序实际消费的信息入手。批次大小、模型名称和处理模式描述的是一次体验。一个允许下载的令牌或一把打开存储的密钥提供的是访问权限。前者应当可以被解释清楚;后者只应出现在确实需要它的地方。
这条边界并不只体现在变量名上。一个路径可能泄露客户信息,一个 URL 可能内嵌标识符,而一小份数据样本也可能是机密。因此还要评估可共享参数的内容。发布配置和发布它所有的绝对路径并不是同一个决定。
这张表给出的是一份工作分类。它描述的不是 Kernodeck 机器上安装的服务。请为你的项目规定每一项由谁读取、在什么时间读取、读取哪一份副本;不要让这个决定留给 notebook 的最后一次导出。
左右滚动表格即可查看所有列。| 元素 | 角色 | 建议处理方式 |
|---|---|---|
| 批次大小、模式、阈值 | 计算参数 | 纳入版本控制并校验其取值。 |
| 令牌、私钥、密码 | 访问凭据 | 单独提供,不要包含在输出中。 |
| 路径、URL、语料库标识符 | 可能敏感的上下文 | 共享前先检查;优先使用逻辑标识符。 |
| 结果和日志 | 执行证据 | 选择保留哪些字段,并检查所要传递的文件夹。 |
2. 只选择一条优先级规则
同一个参数如果同时出现在代码、配置文件和启动选项中,而没人知道哪个生效,就会变得含糊不清。请定下一条简单的规则,例如:先使用有文档说明的默认值,然后使用配置文件,最后使用命令行的公开选项。这是你的应用程序的约定,而不是 Python 提供的通用优先级。
在此解析之后进行校验。拒绝未知的键,这样像 batch_szie 这样的拼写错误就不会被静默地替换为默认值。区分整数、表示整数的字符串和布尔值。然后加上有用的约束:取值必须为正、模式必须在允许范围内、参数组合必须自洽。
最后记录一份仅包含允许字段的实际生效配置。它能说明程序实际使用了什么,即使某个选项覆盖了配置文件。不要先把整个配置对象序列化、再删掉几个已知的密码来得到这份文档:应先决定哪些内容可以出现在里面。
3. 在不连接任何服务的情况下运行一个示例
下面的示例仅用于教学,并未实际运行。它描述了一次虚构的向量生成操作,批次为八条。这里的 embedding 一词只是接口上的选择;不会加载任何模型,也不假定已安装任何 GPU 依赖。读取或校验这个文件不需要任何密钥。
标准库模块 tomllib 从 Python 3.11 起可用,用于读取 TOML 格式。它会把文档中的值转换成 Python 对象;它不会替你决定在你的应用中批次为零是被禁止的。读取之后仍需显式进行取值范围的检查。
这段代码只接受两个键和两种模式。要在项目中使用它,还需接上参数、错误处理和输出路径。预期的拒绝情况很容易推演:batch_size 为零、batch_size 为字符串,或额外添加 token 键。这些是需要在你自己环境中验证的情况,而不是此处测得的结果。
batch_size = 8
mode = "embedding"import tomllib
with open("config.toml", "rb") as source:
config = tomllib.load(source)
if set(config) != {"batch_size", "mode"}:
raise ValueError("CONFIG_KEYS")
if type(config["batch_size"]) is not int or config["batch_size"] <= 0:
raise ValueError("CONFIG_BATCH_SIZE")
if config["mode"] not in ("embedding", "classification"):
raise ValueError("CONFIG_MODE")
public_config = {
"batch_size": config["batch_size"],
"mode": config["mode"],
}4. 只在需要密钥的步骤提供它
在已存在的文件上执行的步骤不应要求下载令牌。在真正需要访问的边界处索取密钥。如果该步骤已启用但缺少其访问权限,应停止该步骤并给出提示预期通道的消息,不要显示收到的值,也不要复制整个请求。
该通道取决于可用的环境:密钥管理器、访问受限的凭据文件,或您组织所规定的注入机制。环境变量可以作为接口使用,但它仍是进程可访问的数据,并且可能出现在诊断信息中。不要将注入的便利性与完整的保护混为一谈。
将访问限制在有用的范围内,并为其轮换做好准备。软件准备请求并不保证存在密钥管理器。在围绕某种机制构建启动流程之前,先核实实际可用的机制,然后避免将密钥传递给不需要它的子进程。
5. 设计有用的日志而不复制输入
定义几个事件:配置被接受、文件已检查、分区完成、输出已验证。为它们关联一个执行标识、一个步骤和一个计数器。一个 CONFIG_BATCH_SIZE 错误就足以找到相关规则;它不需要包含整个文件。
OWASP 建议尤其要将密码、访问令牌和密钥排除在日志之外。请也将此规则应用于异常、为调试而展示的对象以及单元格输出。仅在最后一个界面上进行的遮蔽,并不会移除已经写入文件或截图中的内容。
为分享事故,请准备一个小的选取:有用的版本、获授权的参数、错误以及复现问题的合成示例。避免自动打包整个文件夹。同样要复查 URL、标头、路径以及错误附近的行;一个看似无害的消息周围可能环绕着敏感数据。
6. 在分享前核实分离
准备三项测试:无远程步骤的有效配置、无效配置,以及需要缺失访问权限的步骤。第一项应能在没有不必要密钥的情况下走到其功能边界;另外两项应给出不同的错误。还要核实对批大小的公开修改会出现在有效配置中。
为检查您的分享流程,请使用一个明显虚构且无访问权限的哨兵字符串。在一次隔离演练中,让它经过与密钥相同的位置,然后在日志、导出和选定的文件中搜索它。它未被找到,只是这条路径的有限检查,并不能证明所有泄露都不可能。
将适当的私有文件加入您的 Git 排除项,但也要检查已被跟踪的文件。Git 文档说明 gitignore 针对的是未跟踪的文件;添加一个模式并不会移除已被记录的密钥。检查您将要传递的内容,而不仅仅是那些本应将其排除的规则。
7. 应对泄露并保留可用的记录
如果某个访问凭据已被暴露,请停止复用它,并让其签发系统撤销或替换它。从当前文件中删除一行,并不会使先前的副本变得无害。找出相关位置,以移除能移除的内容,并了解泄露的范围。
您的可复现文件夹随后可以保留所用通道的名称和获授权的参数,而不保留密钥本身。未来的启动将在合适的时机索取有效的访问权限。这样您就得到了一套可传递的流程,而不会把实验归档变成一串访问钥匙。
此方法针对您的应用程序及其交付物。它既不保证整个环境的隔离,也不保证其他地方不存在技术痕迹。要进入执行阶段,请将其与有文档记录的环境、受控的数据以及能区分进度与已验证结果的跟踪结合起来。