关于 tenantguard
TenantGuard 是用于审计自托管多租户 AI Agent 部署的命令行工具。它依据 16 条失败关闭的租户隔离规则检查配置,并可为运维和安全审查生成终端、JSON 或 SARIF 结果。
主要功能
- 01按 16 条规则审计配置
- 02检查租户边界与网络暴露
- 03生成终端、JSON 和 SARIF 报告
- 04扫描内置演示部署
- 05可选的临时 HIPAA 引用
适用场景
- 01审计自托管 Agent 部署
- 02为代码扫描生成 SARIF
- 03向脚本或 Agent 提供结构化结果
- 04使用内置演示测试扫描器
MCP 相关
TenantGuard 可通过标准输入输出运行 MCP 服务,将扫描引擎作为工具提供给 AI Agent。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
TenantGuard
安装 • 快速入门 • 功能 • CLI 参考 • MCP 服务 • 对比 • 常见问题
在审计人员或攻击者发现问题之前,找出可自托管、多租户 AI Agent 平台中的租户隔离漏洞。

安装
npm install -g tenantguard-cli
这是推荐的安装方式。tenantguard-cli npm 软件包(当前版本为 0.2.0,由旧版纯 tenantguard 更名而来;旧版已弃用)会作为 npm optionalDependency 引入匹配的平台二进制文件(发布时已通过 cosign 验证,因此你无需单独验证),并在你的 PATH 中提供 tenantguard 命令。
平台支持范围:macOS(Intel 和 Apple Silicon)、Linux(x64 和 arm64)以及 Windows(x64 和 arm64)。
go install github.com/RudrenduPaul/TenantGuard/cmd/[email protected]
go install 适用于 Go 支持的所有平台,且不依赖任何软件包仓库的发布状态,因此如果你的平台不在上述支持范围内,可以使用此方式作为备用方案。
你也可以跳过顶层软件包,直接安装单个平台的二进制软件包:
npm install tenantguard-darwin-arm64 # swap for your platform: darwin-x64, linux-x64, linux-arm64, win32-x64, win32-arm64
./node_modules/tenantguard-darwin-arm64/bin/tenantguard scan --demo
Python(pip / uvx)
pip install tenantguard-cli
uvx --from tenantguard-cli tenantguard scan --demo
PyPI 软件包 tenantguard-cli 位于此仓库的 python/ 目录下,并在 CI 中构建和测试。其当前版本为 0.1.6,会下载并运行与 npm 软件包使用的同一 GitHub Releases 二进制文件的 v0.2.0 版本;首次运行时会验证发布版本的 SHA-256 checksums.txt(在信任其中的任何摘要之前,还会先验证其 Sigstore 签名),之后会在本地缓存已验证的二进制文件。这与 npm 软件包的信任边界不同:npm 软件包在发布时嵌入了经过 cosign 验证的二进制文件,运行时完全不需要下载;对于必须在最终用户机器上获取二进制文件的路径,PyPI 封装程序的校验和验证提供了等效的保障。
版本号不高于 0.1.2 的 PyPI 软件包存在一个缺陷:pip install tenantguard-cli 虽然能够成功,但首次运行 tenantguard scan --demo 时会失败,并显示 could not parse checksums.txt.pem as a PEM certificate(封装程序在解析由 cosign 生成的证书和签名发布资源前,没有对其进行 base64 解码)。此问题已在 tenantguard-cli 0.1.3 中修复,该版本于 2026-08-03 发布到 PyPI;现在运行 pip install tenantguard-cli 即可安装可正常使用的工具,无需额外步骤。
快速入门
tenantguard scan --demo
实际捕获的输出:
TenantGuard: Tenant-Isolation Audit
Target: /var/folders/m0/5tzdd47n6znb166d4w3m2q0c0000gn/T/tenantguard-demo-488625596
[FAIL] TA01 sandbox/workspace mount path is not scoped per-tenant (no ${TENANT_ID} placeholder and no explicit scoped_per_tenant declaration)
.../deployment.yaml:12
Maps to: goclaw#1163 | HIPAA Sec164.312(a)(1) Access Control (provisional)
[FAIL] TA02 MCP tool URL targets a private/loopback/reserved address (via real CIDR containment on a literal or DNS-resolved IP) without a verified, IP-pinned SSRF validator or an explicit host allowlist entry. CAVEAT: a PASS trusts the deployment's own pins_resolved_ip/validates_private declaration -- TenantGuard cannot verify the real validator actually pins the resolved IP for the connection itself, so DNS-rebinding/TOCTOU risk persists if that declaration is inaccurate
.../deployment.yaml:22
Maps to: goclaw#1070 | HIPAA Sec164.312(e)(1) Transmission Security (provisional)
[FAIL] TA03 cron binding's target agent does not belong to the declaring tenant
.../deployment.yaml:35
Maps to: goclaw#1217 | HIPAA Sec164.312(a)(1) Access Control (provisional)
[FAIL] TA04 exec tool denies direct env dump but not indirect env reads (e.g. jq $ENV), or allows credential-chain leakage via allow_chain_exec (goclaw#1033)
.../deployment.yaml:25
Maps to: goclaw#1227 | HIPAA Sec164.312(a)(2)(iv) Encryption/Decryption (provisional)
[FAIL] TA05 exec-approval allow-always entry is keyed on basename only, not a full path scope
.../deployment.yaml:30
Maps to: goclaw#1216 | HIPAA Sec164.312(a)(1) Access Control (provisional)
[FAIL] TA09 sandbox fail-closed posture not declared (sandbox.on_unavailable must be "fail_closed")
.../tenantguard-demo-488625596:0
Maps to: goclaw#246 | HIPAA Sec164.312(a)(1) Access Control (provisional)
[FAIL] TA10 agent does not explicitly declare a per-agent config override (workspace restriction or sandbox config), risking silent inheritance of an undeclared global default
.../deployment.yaml:40
Maps to: goclaw#145 | HIPAA Sec164.312(a)(1) Access Control (provisional)
[FAIL] TA13 MCP/CLI bridge does not declare HMAC-signed context headers (bridge.hmac_enabled and bridge.context_headers_signed)
.../tenantguard-demo-488625596:0
Maps to: goclaw#91 | HIPAA Sec164.312(e)(1) Transmission Security (provisional)
[FAIL] TA06 cron binding does not declare that its store layer captures/replays the human creator's sender identity at fire time
.../deployment.yaml:35
Maps to: goclaw#1129 | HIPAA Sec164.312(b) Audit Controls (provisional)
[FAIL] TA07 sandbox container privilege is not hardened (root user by default, full host-env passthrough, tmpfs missing noexec/nosuid/nodev, or a dangerous Linux capability added)
.../deployment.yaml:12
Maps to: goclaw#1014 | HIPAA Sec164.312(a)(1) Access Control (provisional)
[FAIL] TA11 channel/session device identity is shared across channel_instances declaring different tenants
.../deployment.yaml:54
Maps to: goclaw#1064 | HIPAA Sec164.312(a)(1) Access Control (provisional)
[FAIL] TA11 channel/session device identity is shared across channel_instances declaring different tenants
.../deployment.yaml:57
Maps to: goclaw#1064 | HIPAA Sec164.312(a)(1) Access Control (provisional)
[FAIL] TA15 channel_instances entry does not declare reload_strategy: differential, so any single create/update/delete on that entry triggers a full stop/restart of every running channel instance across all tenants (no per-instance fingerprint/diff step). CAVEAT: a PASS trusts the deployment's own reload_strategy declaration -- TenantGuard cannot verify the real InstanceLoader actually performs a differential (fingerprint-diffed) reload rather than the destructive full rebuild, so a mismatched declaration would still scan clean
.../deployment.yaml:54
Maps to: goclaw#1147 | HIPAA Sec164.312(a)(1) Access Control (provisional)
[FAIL] TA15 channel_instances entry does not declare reload_strategy: differential, so any single create/update/delete on that entry triggers a full stop/restart of every running channel instance across all tenants (no per-instance fingerprint/diff step). CAVEAT: a PASS trusts the deployment's own reload_strategy declaration -- TenantGuard cannot verify the real InstanceLoader actually performs a differential (fingerprint-diffed) reload rather than the destructive full rebuild, so a mismatched declaration would still scan clean
.../deployment.yaml:57
Maps to: goclaw#1147 | HIPAA Sec164.312(a)(1) Access Control (provisional)
[PASS] 1 check(s) clear
Summary: 14 FAIL, 1 PASS
Findings map to confirmed open goclaw issues where applicable. HIPAA citations are provisional, see README.
捆绑的测试样例刻意设置得很复杂:它旨在同时测试几乎所有规则。TA08(凭据存储加密)和 TA14(按 Agent 隔离资源配置)是针对扫描配置中 providers 和 resource_profiles 条目的逐项检查,而此测试样例这两类条目均为零,因此这两条规则都无内容可评估,不会产生任何发现,既不会 PASS,也不会 FAIL。TA16(提供方连接 SSRF)也是针对 providers 条目的同类逐项检查,因此在此测试样例中同样不会产生任何结果。显示为通过的那一行“1 check(s) clear”对应 TA12(所有者/系统管理员恢复),测试样例中的 owner_ids 和 has_recovery_command 值是特意设置为满足该规则的。退出代码为 1,因为存在发现;完整的退出代码约定请参阅 CLI 参考。
扫描真实部署,并生成供代码扫描使用的 SARIF:
tenantguard scan --target ./deployment --format sarif --sarif-out tenantguard-report.sarif

或者生成纯 JSON,供偏好解析扁平发现数组而非 SARIF 文档的脚本或 Agent 使用:
tenantguard scan --target ./deployment --format json

功能
TenantGuard 会根据 16 条规则扫描可自托管、多租户 AI Agent 部署的配置,每条规则都源自一种真实且已确认的租户隔离故障模式。每条规则都采用失败即关闭原则:未声明或含糊不清的设置属于违规,而非默许通过。
租户隔离边界
| 规则 | 检查内容 |
|---|---|
| TA01 | 沙箱/工作区挂载会被视为违规,除非其路径包含 ${TENANT_ID} 作用域占位符,或明确声明 scoped_per_tenant 为 true。对应 goclaw#1163。 |
| TA03 | 定时任务绑定的 target_agent 必须属于声明该绑定的租户;悬空引用或跨租户引用都会失败关闭。对应 goclaw#1217。 |
| TA11 | 如果两个 channel_instances 条目共享同一个 device_session_id,却声明了不同的租户,则会发出标记(例如,共享的 WhatsApp 设备条目)。对应 goclaw#1064/#1065。 |
| TA14 | 按 Agent 配置的资源配置(浏览器/容器)会被视为违规,除非其路径包含 ${TENANT_ID} 占位符。对应 goclaw#778。 |
| TA15 | 如果 channel_instances 条目未明确声明 reload_strategy: differential,则会发出标记;未声明该值或设置为 full,都意味着对该条目的任何单次创建/更新/删除操作,都会触发破坏性的完整停止/重启,影响所有租户中正在运行的每个渠道实例。此规则信任部署自身的声明(TenantGuard 无法验证实际加载器是否确实按指纹进行差异比较)。对应 goclaw#1147。 |
网络与凭据暴露
| 规则 | 检查内容 |
|---|---|
| TA02 | 标记已保存的 MCP 工具 URL 是否指向私有、环回或保留地址;通过对字面 IP 或 DNS 解析出的 IP 实际调用 net.cidr_contains 检查,而非字符串匹配。除非部署同时声明 validates_private 和 pins_resolved_ip(或主机已明确列入允许列表)。明确记录 DNS 重绑定/TOCTOU 的限制。对应 goclaw#1070。 |
| TA04 | 标记 exec 工具是否禁止直接读取环境变量转储,却未禁止间接读取(例如 jq $ENV);并独立标记任何设置了 allow_chain_exec: true 的工具,因为凭据环境变量会泄露给 shell 运算符链中的每条命令。对应 goclaw#1227 和 goclaw#1033。 |
| TA08 | 除非提供方配置声明了用于加密存储的 OAuth/凭据令牌的已认可强加密算法(目前仅 aes-256-gcm),否则视为违规。对应 goclaw#65。 |
| TA16 | 标记提供方(例如 litellm、bifrost)的连接 URL 是否指向私有、环回或保留地址;使用 TA02 对 MCP 工具采用的相同、基于 net.cidr_contains 的逻辑检查。除非部署同时声明 validates_private 和 pins_resolved_ip(或主机已明确列入允许列表)。对应 goclaw#1430。 |
执行与审批强化
| 规则 | 检查内容 |
|---|---|
| TA05 | 如果“始终允许”执行审批仅按基本文件名授权,而非完整路径,则视为违规,因为该授权可能被用于共享相同基本文件名的其他可执行文件。对应 goclaw#1216。 |
| TA07 | 标记默认以 root 身份执行、完整传递主机环境、tmpfs 挂载缺少 noexec/nosuid/nodev,或添加了任何危险的 Linux 能力(SETUID、SETGID、CHOWN、SYS_ADMIN、DAC_OVERRIDE、NET_ADMIN、SYS_PTRACE)。对应 goclaw#1014、#1015、#524。 |
| TA09 | 部署必须明确声明 sandbox.on_unavailable: fail_closed;未声明的值将视为违规,而非默许通过。对应 goclaw#246。 |
身份、审计与恢复
| 规则 | 检查内容 |
|---|---|
| TA06 | 如果某个 cron 绑定的配置未声明 captures_creator_identity,则视为违规;否则,群组上下文作业会以 system 身份运行,而不是以实际创建者的身份运行。对应 goclaw#1129。 |
| TA12 | 部署级检查:如果 owner_ids 为空,或未声明恢复/重置命令,则视为违规,可能导致操作员永久无法访问。对应 goclaw#954。 |
| TA13 | 部署级检查:如果未声明 bridge_hmac_enabled 或 bridge_context_headers_signed 为 true,则视为违规;缺少声明时默认未签名并判定失败,绝不会静默通过。对应 goclaw#91。 |
| TA10 | 尽力而为的静态配置代理检查:如果某个 Agent 的条目未明确声明 has_workspace_restriction_override 或 has_sandbox_config_override,则发出标记。对应 goclaw#145。 |
其他已验证功能:
- SARIF 2.1.0 输出(
--format sarif),符合架构规范,包含真实的字节/行位置和消息,可直接用于github/codeql-action/upload-sarif和 GitHub 代码扫描。 - 纯 JSON 输出(
--format json),这是 SARIF 的轻量架构替代方案,适合只需要原始rule_id/status/file/line结果,而不需要 SARIF 的工具/运行/规则/分类对象模型的脚本或 Agent。与 SARIF(只将 FAIL 报告为“结果”)不同,JSON 模式还会包含所有 PASS,以及summary.fail/summary.pass计数。v0.2.0 起提供。请参阅CLI 参考中的说明。 - 每条发现均包含临时 HIPAA 引用(
--control hipaa),按规则映射,并标记为临时(请参阅常见问题)。 - 零配置演示模式(
--demo),可扫描随附的合成部署,无需目标配置。 - GitHub Action(
action/action.yml),通过go install安装固定版本,并自动上传 SARIF 报告。 - MCP 服务模式(
tenantguard mcp),将同一套扫描引擎作为工具公开,让 AI Agent 可通过标准输入/输出直接调用,而不必仅限于由人工输入tenantguard scan来运行。v0.2.0 起提供。请参阅下文的 MCP 服务(面向 Agent 的用法)。
CLI 参考
TenantGuard 有两个子命令:scan(执行审计)和 mcp(通过标准输入/输出将同一套扫描引擎作为 MCP 服务运行,请参阅 MCP 服务(面向 Agent 的用法))。没有顶层的 --help 或 --version 标志;不带参数运行 tenantguard、运行 tenantguard --help,或使用 scan 或 mcp 以外的任何首个参数时,都会将以下用法说明输出到标准错误并以 2 退出。
说明
**版本说明:**以下展示的
--format json和mcp子命令自 v0.2.0 起提供。npm install -g tenantguard-cli(0.2.0)、pip install tenantguard-cli(0.1.6,会下载 v0.2.0 二进制文件)和go install .../cmd/[email protected]均会安装该版本。早期版本(0.1.x 的 npm 包和v0.1.1Go 标签)不包含这些功能:--format json会被忽略,且无法识别mcp子命令。
usage: tenantguard scan [--target DIR | --demo] [--format terminal|sarif|json] [--control hipaa]
tenantguard mcp
tenantguard scan --help 输出:
Usage of scan:
-control string
compliance framework to cite (hipaa)
-demo
scan a bundled synthetic deployment instead of --target (zero setup)
-format string
output format: terminal, sarif, or json (default "terminal")
-sarif-out string
file to write SARIF output to when --format=sarif (default "tenantguard-report.sarif")
-target string
path to the deployment config directory to scan
退出代码(定义于 cmd/tenantguard/main.go):
| 代码 | 含义 |
|---|---|
0 | 扫描干净,未发现问题 |
1 | 扫描成功完成,存在发现 |
2 | 扫描或用法错误 |
MCP 服务(面向 Agent 的用法)
说明
自 v0.2.0 起可用。
mcp子命令随 安装 中列出的 npm、PyPI 和go install版本一起发布。v0.2.0 之前的版本不包含此命令,尝试运行时会输出用法错误。
以上内容都假设有人在终端中输入 tenantguard scan。TenantGuard 也可以作为 MCP 服务运行,因此 AI Agent(编码助手、运维 Agent,或任何支持 Model Context Protocol 的程序)可以直接通过工具调用扫描引擎,而不必通过 shell 调用 CLI 并解析文本。
tenantguard mcp
这会通过 stdio 启动 MCP 服务,并一直运行,直到客户端断开连接;这与其他基于 stdio 的 MCP 服务在客户端的进程监管下运行的方式相同。该命令不接受任何标志或位置参数。在底层,它只是一个轻量级协议适配器(internal/mcpserver),封装了 CLI 的 scan 子命令所运行的同一条 internal/collector -> internal/policy -> internal/compliance -> internal/report 流水线;无需维护单独的规则评估逻辑来确保同步。
它只公开一个工具 scan,包含三个与 CLI 自身标志对应的参数:
| 参数 | 对应项 | 说明 |
|---|---|---|
target | --target | 必填。要扫描的部署配置目录路径。 |
format | --format | 可选。json、sarif 或 terminal。MCP 默认使用 json(CLI 本身默认使用 terminal),因为调用它的 Agent 几乎总是需要结构化输出,而不是面向人类的格式化报告。 |
control | --control | 可选。目前只识别 hipaa;空值也会默认设为 hipaa,与 CLI 一致。 |
对于 json 和 sarif 输出,结果会同时以文本和 MCP StructuredContent 的形式返回,因此希望直接读取字段(rule_id、status、file、line)的客户端无需自行重新解析文本块。工具级故障(如目标路径错误、策略加载错误)会作为普通 MCP 错误结果返回,而非协议级故障,因此调用它的 Agent 可以像处理其他工具调用失败一样处理“扫描失败”。
要将 TenantGuard 注册到 Claude Desktop 等兼容 MCP 的客户端,请将其添加到客户端的服务配置中:
{
"mcpServers": {
"tenantguard": {
"command": "tenantguard",
"args": ["mcp"]
}
}
}
这假设 tenantguard 已位于你的 PATH 中(参见安装)。如果你将它安装到了其他位置,请将 "command" 替换为二进制文件的完整路径。
在此功能发布之前,运行扫描的唯一方式是由人直接调用 CLI。使用 tenantguard mcp 后,Agent 可以将 scan 作为工具调用,获取结构化的检查结果,并在同一会话中据此采取行动,无需有人阅读终端输出再手动输入下一条命令。
TenantGuard 的对比
| 工具 | 关注重点 | 是否针对多租户 AI Agent 场景设计 | SARIF 输出 | 规则数量 | 项目成熟度 |
|---|---|---|---|---|---|
| TenantGuard | 面向可自托管多 Agent 平台的租户隔离配置审计 | 是,专为这一领域打造 | 是,已验证(SARIF 2.1.0) | 16 条,全部针对租户隔离 | 已在 npm/PyPI 上发布(见上方徽章);GitHub 上有 3 个带标签的版本(v0.1.0、v0.1.1、v0.2.0) |
| Checkov | 通用 IaC/云配置错误扫描器(Terraform、CloudFormation、Kubernetes、Dockerfile 等) | 否,README 未提及多租户 AI Agent 平台或租户隔离检查 | 是,已验证(-o sarif) | 1,000+ 条通用云/IaC 策略 | GitHub 上有 8.9k 个星标,历史悠久,维护活跃 |
| Conftest | 面向结构化配置数据的 OPA/Rego 策略测试参考工具(支持 18+ 种输入格式) | 否,它是通用 Rego 测试框架,其他工具基于它构建策略包;没有内置的租户隔离或 AI Agent 规则包 | 是,已验证(-o sarif,SARIF 2.1.0) | 内置 0 条(它是策略测试引擎,而非规则包) | 历史悠久的 OPA 参考项目,维护活跃 |
| PolicyGuard | Terraform/OpenTofu AWS/Azure 配置错误扫描器(Go + OPA/Rego、Cobra 命令行、沙盒化 OPA 引擎) | 否,范围仅限 Terraform/OpenTofu AWS/Azure 资源;未提及多租户系统或 AI Agent 平台 | 是,已验证(SARIF 2.1.0,带稳定指纹和 CWE 标签) | 15+ 条 AWS/Azure 资源检查 | 1 个星标,2 个分支,4 个版本(v0.3.1) |
| AgentShield | AI Agent 安全扫描器(密钥、权限、钩子、MCP 服务安全、Agent 配置审查) | 否,明确限定于单个 Claude Code 用户的本地 .claude/ 目录(单用户/团队开发环境),不涵盖多租户 SaaS 隔离 | 是,已验证(--format sarif,SARIF 2.1.0) | 102 条,分属 5 个类别 | GitHub 上有 1,000+ 个星标,维护活跃(始于 2026 年 2 月的一场黑客马拉松) |
TenantGuard 以牺牲广度换取深度:16 条规则只是 Checkov 1,000+ 条规则的一小部分,而且 TenantGuard 只有 3 个带标签的版本,远不如 Checkov、Conftest 和 PolicyGuard 的项目历史悠久。TenantGuard 独有的优势,是一套专为可自托管 AI Agent 部署中的跨租户隔离打造的规则包;通用 IaC 扫描器都不覆盖这一领域,而最接近的同领域工具 AgentShield 也未涵盖这一点:它审计的是单个开发者的本地配置,而非可自托管、多租户部署中的跨租户隔离。这正是 TenantGuard 有意针对的细分领域。
目前尚未发布针对 TenantGuard 自身规则集、基于已标注样例的精确率/召回率基准;若上文的竞品公布了相关数据(例如 PolicyGuard 的精确率/召回率),此处引用的数字来自该项目自己的 README,未在此独立复核。
TenantGuard 是什么,为什么要开发它
TenantGuard 是一款命令行策略即代码扫描器,使用 Go 编写,基于 OPA/Rego 构建,用于审计可自托管的多租户 AI Agent 平台配置中的租户隔离缺陷:也就是某个租户的 Agent、沙箱、定时任务或凭据能够访问或影响其他租户的这类漏洞。
TenantGuard 的开发缘于一个真实且已确认的多租户 AI Agent 平台(goclaw)中,存在多个尚未解决的公开问题,且都属于这一类,包括未按租户隔离的沙箱挂载、跨 Agent 授权缺口、通过间接路径泄露机密的 exec 工具、基于文件名而非真实路径范围的审批绕过,以及对已保存工具 URL 和大模型提供商连接的 SSRF 验证不匹配。目前没有通用 IaC 扫描器(Checkov、Conftest、PolicyGuard)或 AI Agent 安全扫描器(AgentShield)会检查这一特定故障类别:可自托管的多 Agent 部署中的跨租户隔离问题。TenantGuard 通过 16 条默认拒绝规则填补了这一空白,每条规则都可追溯到一个真实且有引用的问题。
TenantGuard 不是通用的 Terraform/Kubernetes 扫描器,也不能替代 Checkov 或 Conftest 来检查一般的云基础设施配置错误。它专门针对可自托管的多租户 Agent 部署中的租户隔离问题。
常见问题
TenantGuard 与 Checkov 或 Conftest 这类通用 IaC 扫描器有何不同? Checkov 和 Conftest 会扫描 Terraform、Kubernetes、CloudFormation 等通用基础设施即代码,检查各类配置错误。它们都没有为多租户 AI Agent 部署提供规则集。TenantGuard 的 16 条规则专为这一特定场景设计,涵盖沙箱挂载、定时任务/Agent 绑定、MCP 工具注册、大模型提供商连接、exec 审批以及频道/会话身份,每条规则都源自一个真实且有引用的缺陷。
TenantGuard 会取代 OPA 或 Conftest 吗? 不会。TenantGuard 的规则以 Rego 编写,并集成了自己的评估流程;它是一套专用策略包和 CLI,而不是通用的 Rego 测试框架。如果你需要用任意 Rego 策略测试任意结构化配置,Conftest 才是合适的通用工具。对于多 Agent 部署中的租户隔离检查,TenantGuard 才是合适的工具。
每条发现项中的 HIPAA 引用是什么意思? 每条发现项都附有相关的 HIPAA 安全规则引用(例如 Sec164.312(a)(1) 访问控制),帮助将技术发现映射到审查人员可能已在跟踪的合规控制项。这些引用标记为暂定:它们表示技术控制与所引用 HIPAA 条款之间可能存在对应关系,并非法律意见或经审计的合规结论。请将其视为你自行进行合规审查的起点,而非替代方案。
TA02(SSRF)检查通过是否意味着 MCP 工具 URL 确实不会受到 DNS 重绑定攻击?
并不完全是。TA02 会针对字面 IP 或 DNS 解析得到的 IP 执行真实的 CIDR 范围包含检查,而不是进行字符串匹配,但检查通过时会信任部署自身的 pins_resolved_ip/validates_private 声明。TenantGuard 无法独立验证实际验证器是否会为真实连接固定已解析的 IP,因此,如果该声明不准确,DNS 重绑定/TOCTOU 风险仍然存在。TA02 规则中直接记录了这一限制。
我可以扫描真实部署,而不是随附的演示配置吗?
可以:tenantguard scan --target <path-to-deployment-config-dir>。--demo 旨在让你无需任何设置即可查看工具运行情况,然后再将其用于真实配置。
TenantGuard 会生成 CI 流水线或 GitHub 代码扫描可读取的输出吗?
会。--format sarif --sarif-out <file> 会生成符合架构规范的 SARIF 2.1.0 文档,其中包含真实的结果位置和消息。随附的 GitHub Action(action/action.yml)会在一个步骤中运行扫描,并通过 github/codeql-action/upload-sarif 上传 SARIF 报告。
为什么 TenantGuard 同时支持 --format sarif 和 --format json?SARIF 不就是结构化输出吗?
是的,SARIF 是一种真正的标准机器可解析格式,也是 CI/代码扫描集成的正确选择。--format json 面向的是另一类使用者:希望直接解析 rule_id/status/file/line 的脚本或 Agent,无需先遍历 SARIF 的工具/运行/规则/分类对象模型。它还会同时报告每一项 PASS 和 FAIL,而 SARIF 刻意不这样做(SARIF 结果表示发现的问题,而不是完整清单),因此调用方可以从一份文档中了解“检查了什么”,而不仅仅是“标记了什么”。注意:--format json 从 v0.2.0 起提供,详见 CLI 参考 下方的说明。
CLI 退出代码是什么意思?
0 表示扫描干净,没有发现问题;1 表示扫描成功完成并发现违规;2 表示扫描或用法错误(包括在没有子命令的情况下运行 tenantguard,或运行 scan、mcp 以外的任何子命令)。
有 npm 包吗?
有,npm install -g tenantguard-cli 已发布(目前为 0.2.0),也是推荐的安装方式(从旧的纯 tenantguard 包更名而来,旧包已弃用)。它通过 npm optionalDependency 依赖匹配的平台二进制包;六个平台包均已发布(macOS x64/arm64、Linux x64/arm64、Windows x64/arm64)。请参阅上方的 安装。
有 PyPI 包吗?
有,tenantguard-cli 已在 PyPI 发布(目前为 0.1.6,会下载 v0.2.0 二进制文件;源码位于 python/,并在 CI 中构建和测试)。截至 0.1.2 的版本存在首次运行错误,该问题已在 0.1.3 中修复(请参阅上方的 安装);现在,pip install tenantguard-cli 开箱即用。
AI Agent 能否直接运行 TenantGuard,而不需要人手动输入 CLI 命令?
可以,通过 tenantguard mcp 启动一个基于 stdio 的 MCP 服务,将扫描引擎作为 scan 工具公开。有关准确的客户端配置和工具参数,以及包含此功能的版本,请参阅上方的 MCP 服务(Agent 原生用法)。
TenantGuard 是可以导入我自己的 Go 程序的库吗?
目前不是。cmd/tenantguard 之外的所有内容(收集器、合规映射、演示样例、策略引擎和报告格式化)都位于 internal/ 下,Go 自带的工具会使其无法从此模块之外导入。TenantGuard 以 CLI 二进制文件和 GitHub Action 的形式分发,并不是可导入的 Go 包。
我可以在商业或闭源产品中使用 TenantGuard 吗? 可以。TenantGuard 根据 Apache License 2.0 授权,允许商业使用、修改、私下使用和再分发,包括用于专有产品或 SaaS 产品,但须遵守许可证的标准声明和署名条款(保留版权声明和许可证副本,并标明任何修改过的文件)。如许可证所述,本软件不提供任何保证。完整且权威的条款请参阅 LICENSE。
贡献
欢迎贡献。请参阅 CONTRIBUTING.md,了解如何添加新规则;每条规则发布前都需要同时提供易受攻击和安全的样例。
许可证
Apache License 2.0。请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。