为您的项目提供 GPU · 无 KYC 的加密货币支付 如何租用
简体中文
打开控制台
实用指南 / KERNODECK

可共享的配置不包含你的访问凭据。

将计算参数保存在一个受版本控制的文件中,并在运行时通过单独的渠道提供机密。定义各配置来源之间的优先级,验证结果,并只记录被允许的值。这种分离能让实验更容易重新运行;但它不会把环境变量或被 Git 忽略的文件变成保险箱。

2 分钟阅读 · 开发者指南

1. 区分描述计算的内容与授予访问权限的内容

先从程序实际消费的信息入手。批次大小、模型名称和处理模式描述的是一次体验。一个允许下载的令牌或一把打开存储的密钥提供的是访问权限。前者应当可以被解释清楚;后者只应出现在确实需要它的地方。

这条边界并不只体现在变量名上。一个路径可能泄露客户信息,一个 URL 可能内嵌标识符,而一小份数据样本也可能是机密。因此还要评估可共享参数的内容。发布配置和发布它所有的绝对路径并不是同一个决定。

这张表给出的是一份工作分类。它描述的不是 Kernodeck 机器上安装的服务。请为你的项目规定每一项由谁读取、在什么时间读取、读取哪一份副本;不要让这个决定留给 notebook 的最后一次导出。

左右滚动表格即可查看所有列。
分类方式应结合项目的访问权限和数据来调整。
元素角色建议处理方式
批次大小、模式、阈值计算参数纳入版本控制并校验其取值。
令牌、私钥、密码访问凭据单独提供,不要包含在输出中。
路径、URL、语料库标识符可能敏感的上下文共享前先检查;优先使用逻辑标识符。
结果和日志执行证据选择保留哪些字段,并检查所要传递的文件夹。

2. 只选择一条优先级规则

同一个参数如果同时出现在代码、配置文件和启动选项中,而没人知道哪个生效,就会变得含糊不清。请定下一条简单的规则,例如:先使用有文档说明的默认值,然后使用配置文件,最后使用命令行的公开选项。这是你的应用程序的约定,而不是 Python 提供的通用优先级。

在此解析之后进行校验。拒绝未知的键,这样像 batch_szie 这样的拼写错误就不会被静默地替换为默认值。区分整数、表示整数的字符串和布尔值。然后加上有用的约束:取值必须为正、模式必须在允许范围内、参数组合必须自洽。

最后记录一份仅包含允许字段的实际生效配置。它能说明程序实际使用了什么,即使某个选项覆盖了配置文件。不要先把整个配置对象序列化、再删掉几个已知的密码来得到这份文档:应先决定哪些内容可以出现在里面。

3. 在不连接任何服务的情况下运行一个示例

下面的示例仅用于教学,并未实际运行。它描述了一次虚构的向量生成操作,批次为八条。这里的 embedding 一词只是接口上的选择;不会加载任何模型,也不假定已安装任何 GPU 依赖。读取或校验这个文件不需要任何密钥。

标准库模块 tomllib 从 Python 3.11 起可用,用于读取 TOML 格式。它会把文档中的值转换成 Python 对象;它不会替你决定在你的应用中批次为零是被禁止的。读取之后仍需显式进行取值范围的检查。

这段代码只接受两个键和两种模式。要在项目中使用它,还需接上参数、错误处理和输出路径。预期的拒绝情况很容易推演:batch_size 为零、batch_size 为字符串,或额外添加 token 键。这些是需要在你自己环境中验证的情况,而不是此处测得的结果。

config.toml 的教学参数——不含密钥
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. 应对泄露并保留可用的记录

如果某个访问凭据已被暴露,请停止复用它,并让其签发系统撤销或替换它。从当前文件中删除一行,并不会使先前的副本变得无害。找出相关位置,以移除能移除的内容,并了解泄露的范围。

您的可复现文件夹随后可以保留所用通道的名称和获授权的参数,而不保留密钥本身。未来的启动将在合适的时机索取有效的访问权限。这样您就得到了一套可传递的流程,而不会把实验归档变成一串访问钥匙。

此方法针对您的应用程序及其交付物。它既不保证整个环境的隔离,也不保证其他地方不存在技术痕迹。要进入执行阶段,请将其与有文档记录的环境、受控的数据以及能区分进度与已验证结果的跟踪结合起来。

您的疑问

一个 .env 文件足以保护密钥吗?

不能。它只是一种集中存放值的方式,而非独立的保护措施。要控制谁可以读取它、它的值如何被注入,以及哪些文件会被复制。不要打印其内容,也不要打印进程的完整环境变量。

把密钥加入 gitignore 就能抹去它在 Git 中的存在吗?

不能。排除规则不会移除已被跟踪的文件,也不会移除旧副本。如果某个凭据已被泄露,请将其吊销或替换;并对相关文件和历史记录分别处理。

能否在不共享访问凭据的情况下共享实验?

可以。请提供代码、依赖项、允许的参数以及预期访问通道的说明。每次运行都会单独获得访问权限。同时请检查路径、URL、数据和日志是否泄露了敏感信息。