软件供应链攻击近年来频繁出现在网络组件的分发链条中,一个被篡改的镜像或依赖包可能悄无声息地进入生产环境。Rekor是Sigstore项目下的透明日志服务,它接收构建系统提交的签名元数据,并将记录永久留存。rekor-cli则是官方提供的命令行客户端,能够让我们在不依赖中心数据库的情况下,验证并检索每一次构建的证据。对于负责网络组件(如代理、网关、负载均衡模块)发布的团队来说,掌握这款工具意味着可以在几秒内回答“这个二进制是谁、在什么时候、基于哪次提交构建的”。

rekor-cli的基础配置与日志结构解析
在开始查询之前,我们需要先让rekor-cli知道要对接哪一套透明日志实例。默认情况下,它指向公共的Rekor服务器,但在企业内网审计网络组件时,往往部署了私有化节点。通过环境变量REKOR_ADDR可以指定目标地址,例如export REKOR_ADDR=https://rekor.internal.corp。配置完成后,执行rekor-cli --version应正常返回客户端版本,这说明网络连通与证书信任链已就绪。
Rekor中的每一条日志都被称为一个“entry”,其结构包含全局索引、集成时间戳、以及被签名的透明日志证明(包括payload和签名)。对于网络组件构建,payload通常是in-toto物料清单或简易的构建声明,里面带有组件名称、版本、SHA256摘要。理解这个结构是写出精准查询条件的前提,因为rekor-cli的搜索参数实际上是在匹配这些嵌套字段。
很多团队误以为日志只能按UUID查,其实Rekor提供了丰富的索引类型。比如--sha可按工件哈希找记录,--email可按构建者身份找。在审计网络组件时,我们更关心--artifact与--public-key的组合,这能确认某次出问题的二进制是否确实由受信任的私钥签名并入库。下面是一段配置与连通性测试的参考代码:
# 配置私有Rekor地址 export REKOR_ADDR=https://rekor.internal.corp # 验证客户端可用 rekor-cli --version # 搜索特定网络组件哈希 rekor-cli search --sha 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
针对网络组件构建记录的精准查询实践
网络组件通常包括Nginx模块、Envoy过滤器、自研TCP代理等,它们的构建记录混杂在大量其他软件条目中。要提高查询效率,应当利用Rekor的索引扩展。以intoto类型为例,构建系统会在payload里写入subject数组,其中name字段常设为组件坐标。我们可以先用rekor-cli search --type intoto拿到大池子,再结合本地脚本过滤。但更直接的方式是使用--public-key限定仅显示由网络组件专用签名密钥提交的记录。
假设我们的网络组件构建流水线使用了一对专用Ed25519密钥,公钥已分发到审计机。执行以下命令即可列出该密钥签名的全部条目,输出中包含了条目的UUID与提交时间,审计人员能迅速圈定时间窗口。若进一步想知道某条记录里写了什么,用rekor-cli get --uuid <uuid>拉取完整JSON,里面能看到构建机的 hostname、CI 任务ID等上下文。
在真实排障中,我们曾遇到一个负载均衡组件在边缘节点表现异常。通过提取异常二进制的SHA256,运行下面指令,立即定位到是某次热修复构建,且签名者邮箱属于已离职员工账户,从而触发密钥轮换流程。这种从“现象”到“构建源头”的逆向追踪,正是rekor-cli的核心价值。
# 使用网络组件公钥过滤构建记录 rekor-cli search --type intoto --public-key ./netcomp_pub.pem # 获取某条记录详情 rekor-cli get --uuid 5a1b2c3d4e5f6789 # 验证本地二进制与日志声明一致 rekor-cli verify --artifact ./lb-agent --signature ./lb-agent.sig --public-key ./netcomp_pub.pem
将查询结果接入审计追踪与告警系统
单靠人工执行命令无法覆盖持续交付节奏,因此要把rekor-cli封装进审计脚本。一种常见做法是用crontab定时调用搜索接口,把新增的网络组件条目写入内部PostgreSQL,同时比对CMDB里的资产清单。若发现某组件的构建者不在白名单,就自动生成工单。这种机制让审计从“出事翻账”变成“持续盯防”。
在代码层面,我们可以用Python的子进程模块包装rekor-cli,解析其JSON输出。注意rekor-cli的get命令支持--format json,这比正则截取文本更稳定。下方示例展示了如何拉取最近一小时条目并做基础判断。实践中还应加上指数退避重试,因为私有Rekor节点在高峰时可能返回503。
除了存储,可视化也关键。不少团队把审计数据接进Grafana,画出每日网络组件构建量、签名密钥分布。当某个密钥突然签发大量非常规组件时,面板会变红。这种基于rekor-cli提取的真相数据建立的追踪体系,比单纯扫描运行中的进程更早发现问题,真正实现了供应链可追溯。
import subprocess, json, datetime
def fetch_recent_netcomp():
cmd = ["rekor-cli", "search", "--type", "intoto",
"--public-key", "./netcomp_pub.pem", "--format", "json"]
out = subprocess.check_output(cmd)
entries = json.loads(out)
now = datetime.datetime.utcnow()
for e in entries:
# 假设e含集成时间字段
if now - parse_time(e["integratedTime"]) < datetime.timedelta(hours=1):
yield e["uuid"]
for uid in fetch_recent_netcomp():
print("需要审计的构建:", uid)
通过上述配置、查询与系统化接入三步,网络组件构建记录不再是一堆难以关联的日志,而成了可检索、可验证、可告警的审计资产。当安全事件发生时,团队能用rekor-cli在分钟级给出构建溯源报告,大幅缩减处置时间。