DNAnexus 集成安全认证实践指南:从 DX_SECURITY_CONTEXT 到令牌生命周期管理
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
本指南以 scientific-agent-skills 仓库中dnanexus-integration技能(基线验证于 2026-07-23,对应dxpy==0.410.0,详见 skills/dnanexus-integration/references/sources.md)为核心,系统讲解在构建、运行和运维 DNAnexus 基因组学工作负载时必须掌握的认证与上下文机制。读者将掌握交互式登录与自动化令牌登录的正确姿势、配置优先级与上下文冲突的排障方法、作业内凭证的使用边界,以及令牌轮换、撤销和认证失败排查的完整操作流程,从而在敏感基因组数据环境下安全、合规地使用dxCLI 与dxpy。
认证基本原则:令牌即用户身份
DNAnexus 的 bearer token(不记名令牌)会冒充创建它的用户:它继承该用户的项目访问权限,并可以启动计费任务。因此,持有令牌等同于持有该用户的临时身份,必须将DX_SECURITY_CONTEXT当作最高等级的秘密对待。
根据 skills/dnanexus-integration/references/authentication.md 的明确要求,安全底线包括:
- 绝不打印、记录、序列化、返回或提交
DX_SECURITY_CONTEXT。 - 绝不将令牌直接写入源代码、notebook、输入 JSON、作业属性(tags/properties)或命令输出。
- 绝不通过读取或导出整个环境变量的方式来定位令牌。
- 只使用用户提供的具名 DNAnexus 凭证或来自秘密管理器的注入值。
- 绝不将令牌发送到任何非 DNAnexus 端点。
特别注意:dx env与dx env --bash会明文显示当前活动令牌。这两个命令绝不能出现在被捕获的终端会话、CI 日志、支持包(support bundle)或 Agent 输出中。类似的禁令同样适用于 Upload Agent 的ua --env命令(见 skills/dnanexus-integration/references/data-operations.md)。
这种安全约定也被仓库的辅助工具落地为可验证的检查:validate_dxapp.py会在任意深度扫描dxapp.json中的内嵌凭证(embedded-secret检查码),同时对access.network、access.project: ADMINISTER等过度授权配置给出告警;对应测试位于 tests/dnanexus-integration/test_scripts.py 的AccessAndSecretTests类中。
交互式登录:人类会话的标准路径
安装 CLI(推荐隔离工具环境,详见 skills/dnanexus-integration/SKILL.md):
uv tool install "dxpy==0.410.0" dx --version在项目内使用 Python 时:
uv add "dxpy==0.410.0"然后执行交互式认证:
dx login dx whoami dx select dx pwd关键语义:
dx login将 CLI 状态存储在~/.dnanexus_config/下。- 使用
dx whoami与dx pwd验证身份和当前项目,不会暴露令牌。 - 对于 SSO 账户,如果组织要求,可在My Profile → API Tokens中创建 API 令牌。
- 保持登录提示为交互式,避免将令牌值写入 shell 历史或终端转录中。
交互式登录应作为人类会话的唯一推荐路径;对于非交互环境,则应切换到下面的令牌注入模式,而不是依赖dx login --token之类的命令行传参方式。
令牌登录与自动化:通过环境变量注入秘密
CLI 虽然支持dx login --token TOKEN,但把字面令牌放在命令行上会通过 shell 历史或进程检查暴露风险。推荐的安全自动化流程是:
- 在 DNAnexus UI 中创建短期有效令牌。
- 使用专用用户/服务身份,只授予其完成任务所需的最小项目访问权限。
- 将完整的安全上下文存储在 CI 或编排系统的秘密管理器中,使用精确键名
DX_SECURITY_CONTEXT。 - 只把这一单个键直接注入进程环境。
- 在日志中屏蔽该键,且永远不要在认证期间开启 shell 追踪(tracing)。
- 用
dx whoami验证身份,不要使用dx env。 - 操作结束后,从进程环境中移除该秘密。
一个至关重要的格式约束:DX_SECURITY_CONTEXT必须是JSON 文本,而不是裸的 UI 令牌。其秘密值形状为:
{ "auth_token_type": "Bearer", "auth_token": "<secret-token>" }应由秘密管理器注入完整的序列化对象,绝不要在带追踪的 shell 命令中自行拼装或 echo 该对象。
权限边界与过期时间
标准用户 API 令牌继承创建用户的项目访问权,不是独立按项目作用域的。因此,在签发专用身份的令牌之前,应先最小化该身份的项目成员关系和访问级别;如果组织提供更受限的凭证机制,应优先使用最窄的可用作用域。
关于过期时间:根据当前平台指引,未显式指定过期时间的令牌默认在一个月后过期。只要现实可行,应选择更短的过期时间——例如按天计的任务就使用按天的短期令牌。
各工具的环境变量差异
不同 DNAnexus 客户端消费的变量名并不统一,这是一个常见的混淆点:
| 客户端 | 优先读取的环境变量 | 回退行为 |
|---|---|---|
dx/dxpy | JSON 格式的DX_SECURITY_CONTEXT | — |
| dx-toolkit shell 引导脚本 | DX_AUTH_TOKEN | 仅在DX_SECURITY_CONTEXT缺失时,将DX_AUTH_TOKEN映射为DX_SECURITY_CONTEXT |
Download Agent(dx-download-agent) | DX_API_TOKEN | 缺失时回退到~/.dnanexus_config/environment.json |
这些变量名本身都是敏感信息,但在每个工具中并非通用替代品。只注入所选客户端需要的那个变量;除非存在明确兼容性需求,绝不要把一个秘密镜像到多个变量中(例如不要为了保险同时设置DX_SECURITY_CONTEXT和DX_API_TOKEN)。Download Agent 的专属变量行为在 skills/dnanexus-integration/references/data-operations.md 中有进一步说明。
配置优先级:环境变量高于已保存的 CLI 状态
DNAnexus 工具链按以下顺序解析配置:
- 命令行覆盖参数
- shell 中已设置的环境变量
~/.dnanexus_config/environment.json- 内置默认值
这一顺序带来一个隐蔽的坑:shell 中残留的旧DX_SECURITY_CONTEXT会覆盖后来的交互式dx login。也就是说,dx login可能显示成功,但后续命令实际仍在继续使用旧的 shell 凭证。如果环境变量覆盖了 CLI 状态,dx login只是写入磁盘,运行时仍优先读取环境。
安全诊断上下文不匹配
诊断时只使用非秘密命令:
dx whoami dx pwd如果需要丢弃 shell 环境、改用已保存的 CLI 状态:
source "$HOME/.dnanexus_config/unsetenv" dx whoami dx pwd如果需要反过来丢弃已保存的 CLI 状态(重新认证):
dx clearenv绝不打印unsetenv或environment.json的内容来比较令牌值。dxpy复用了与dx完全相同的配置来源,此处的诊断流程对 Python 自动化同样适用(见 skills/dnanexus-integration/references/python-sdk.md)。
项目上下文:显式优于环境隐式
交互式场景下选择项目:
dx select dx pwd但在脚本中,不要依赖环境里的隐式上下文,而是显式使用项目 ID 与完整路径:
dx ls "project-xxxx:/input" dx download "project-xxxx:/input/sample.bam" --output "sample.bam"在 Python 中,当需要计费上下文或执行可执行程序时,应在搜索、上传、下载中显式传入project="project-xxxx":
import dxpy files = dxpy.find_data_objects( classname="file", project="project-xxxx", # 显式项目上下文 folder="/results", recurse=True, name="*.bam", name_mode="glob", state="closed", describe={"fields": {"name": True, "size": True, "archivalState": True}}, limit=100, )显式上下文可以防止脚本静默操作另一个终端里所选的项目。仓库的inspect_dxpy.py脚本(skills/dnanexus-integration/scripts/inspect_dxpy.py)将find_data_objects、DXProject、upload_local_file、download_dxfile等符号列为必需基线,安装 SDK 后可用uv run --with "dxpy==0.410.0" skills/dnanexus-integration/scripts/inspect_dxpy.py --strict离线核对签名,无需认证与联网。
执行环境中的凭证:作业内自动继承
作业(job)会从平台获得作业作用域的安全上下文,dxpy与dx会自动消费它。App 代码通常不应该自行解析DX_SECURITY_CONTEXT。
在 App Execution Environment(AEE)内部:
- 原样使用系统提供的 API host 与安全上下文。
- 不要把作业环境转发给不需要它的子进程。
- 如果某个子进程只需要本地计算,就传递一个最小化的、经过允许列表过滤的环境。
- 绝不上传环境转储、包含环境值的崩溃报告或 shell 追踪。
- 不要用用户可控的主机名覆盖内部 API host。
作业授权从根执行继承,且会过期:当前文档将作业认证令牌限制为 30 天,与正常的作业最长运行时间一致。这一点在排障时尤为重要——运行中的长作业若出现AuthError,往往意味着根授权过期或被撤销,而重新运行需要一次新的授权启动,无法复活旧作业(详见 skills/dnanexus-integration/references/job-execution.md)。
端点安全:只对官方端点使用凭证
对于正常的外部客户端,DNAnexus 使用以下官方主机:
api.dnanexus.com—— API 调用auth.dnanexus.com—— 认证platform.dnanexus.com—— Web 界面
在作业内部,平台可能提供一个私有 API 地址,此时只接受系统提供的值。绝不要编写把令牌与任意 URL 拼接的代码。自定义 API 服务器覆盖属于高级管理功能,只有在用户明确指明某个经过批准的 DNAnexus 部署并显式要求覆盖时才可以使用。
从源码层看,这一点同样是可验证的:validate_dxapp.py会检查access.network是否被设为通配符(broad-network告警),引导开发者使用窄化的网络允许列表。
轮换、登出与撤销
dx logout结束 CLI 会话;如果会话使用的是 API 令牌,按当前文档说明,登出会使该令牌失效。
出现以下情况时应撤销令牌:
- 可能已被暴露;
- 其用户或自动化不再需要访问权限;
- 关联的脚本或服务已被下线;
- 底层账户权限发生了实质性变化。
撤销具有破坏性:使用该令牌认证的运行中作业和进行中的上传/下载会立即以AuthError终止,且已产生的费用仍然计费。除非是紧急遏制场景,撤销前务必确认受影响的执行与传输。
疑似泄露后的处置流程:
- 立即停止暴露该凭证;
- 在不打印令牌的前提下识别活动的执行与传输;
- 轮换或撤销令牌;
- 审查项目成员关系与近期执行记录;
- 只重新签发短期有效的替代令牌。
认证失败排查清单
遇到AuthError、PermissionDenied或意外的项目可见性时,按以下顺序排查:
- 运行
dx whoami。 - 运行
dx pwd。 - 检查是否有 shell 环境变量覆盖了已保存的 CLI 状态。
- 确认对象存在于所声明的项目和区域中。
- 确认账户具备所需的项目访问级别:
| 项目级别 | 能力 |
|---|---|
VIEW | 读取 |
UPLOAD | 添加数据 |
CONTRIBUTE | 运行作业并修改项目内容 |
ADMINISTER | 成员管理与管理类操作 |
- 检查令牌过期或已被撤销。
- 检查组织/TRE 策略与下载限制。
- 在保留理解受影响作业/传输所需证据之后,再重新认证。
特别强调:不要通过自动放宽权限来应对认证失败。dxpy侧的配套建议还包括:捕获DXAPIError时打印error.name与 HTTP 状态码(如PermissionDenied、ResourceNotFound通常通过DXAPIError.name呈现,而非顶层异常类),并保留请求 ID 用于支持沟通,但要对对象元数据脱敏(见 skills/dnanexus-integration/references/python-sdk.md)。
与其他技能参考文档的配合
认证上下文贯穿整个技能体系,相关主题的完整资料还包括:
- skills/dnanexus-integration/references/operations-and-troubleshooting.md —— 认证症状(
AuthError/PermissionDenied/登录后用户异常)的深度排障,以及支持包(support bundle)中该包含和绝不该包含的内容。 - skills/dnanexus-integration/references/data-operations.md —— 传输工具各自的凭证变量(如 Upload Agent 的
--auth-token、Download Agent 的DX_API_TOKEN)与禁止将令牌写入 Docker 命令行或 compose 文件的约定。 - skills/dnanexus-integration/references/job-execution.md —— 作业/分析生命周期、
AuthError在长作业中的成因与 30 天作业时限。 - skills/dnanexus-integration/references/python-sdk.md ——
dxpy与dx共享的配置来源、永不打印的清单(DX_SECURITY_CONTEXT、API 令牌值、dxpy.SECURITY_CONTEXT、完整进程环境)。 - skills/dnanexus-integration/references/sources.md —— 版本基线与刷新流程,升级前后可用 skills/dnanexus-integration/scripts/inspect_dxpy.py 离线核对 API 符号。
小结:一条贯穿始终的安全主线
无论使用交互式登录还是秘密管理器注入,DNAnexus 认证实践可以浓缩为三条主线:令牌即用户身份,必须按最高秘密对待;环境变量优先级高于已保存 CLI 状态,必须用非秘密命令诊断;作业凭证自动继承且会过期,必须遵循最小作用域与最短有效期。将这些原则与dx whoami/dx pwd的安全验证习惯、DX_SECURITY_CONTEXT的 JSON 注入格式以及吊销前的破坏性评估相结合,就能在敏感基因组数据工作负载中既保证自动化效率,又守住合规与安全边界。
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考