Trivy 客户端-服务器模式下多个 server 如何用 Redis 共享缓存并配置 --token 鉴权
【免费下载链接】trivyFind vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more项目地址: https://gitcode.com/GitHub_Trending/tr/trivy
当你同时运行多个 Trivy server(例如为不同集群或主机上的扫描客户端提供服务)时,客户端扫描可能失败并报出类似下面的错误:
$ trivy image --server http://xxx.com:xxxx test-image ... - twirp error internal: failed scan, test-image: failed to apply layers: layer cache missing: sha256:*****原因是各 server 默认使用本地文件系统(fs)作为 scan cache,A server 写入的层分析结果对 B server 不可见,B 扫描时就会找不到 layer cache。解决办法是让所有 server 使用同一个 Redis 作为 cache backend,使多个 server 共享扫描分析结果;同时按文档的安全要求,为 server 配置--token鉴权再暴露给客户端。完成本文操作后,多个 server 共用一份 Redis 缓存、客户端通过 token 访问任一 server 均可完成扫描。
前置条件:各 server 主机上已安装 Trivy,并且每台 server 都能访问同一个 Redis 实例(文档给出的地址格式为redis://[HOST]:[PORT])。
启动使用 Redis 共享缓存的多个 Trivy server
在每台 server 上运行trivy server,并通过--cache-backend指向同一个 Redis 实例。注意客户端要远程连接 server,因此监听地址不能是localhost,需指定0.0.0.0或主机 IP:
$ trivy server --listen 0.0.0.0:8080 \ --cache-backend redis://<REDIS_HOST>:6379 \ --token dummy命令中各参数的依据:
--listen 0.0.0.0:8080:server 默认只监听localhost:4954;要接受其他主机的连接,必须指定0.0.0.0或 IP 地址。--cache-backend redis://<REDIS_HOST>:6379:将 scan cache 后端从默认的fs切换为 Redis,<REDIS_HOST>替换为你可访问的 Redis 地址。该参数属于 EXPERIMENTAL 特性,文档提示其行为可能在不保持向后兼容的情况下变化。--token dummy:开启 client/server 模式鉴权,token 值可自定义,但 server 与所有客户端必须一致。
多个 server 使用同一命令(各自主机上运行)指向同一个 Redis 后,任一台 server 写入的层分析结果,其他 server 都能从 Redis 读到,从而避免layer cache missing错误。
如果 Redis 启用了 TLS,可加--redis-tls使用公共证书;使用自签证书时改用--redis-ca、--redis-cert、--redis-key指定文件路径:
$ trivy server --cache-backend redis://<REDIS_HOST>:6379 --redis-tls$ trivy server --cache-backend redis://<REDIS_HOST>:6379 \ --redis-ca /path/to/ca-cert.pem \ --redis-cert /path/to/cert.pem \ --redis-key /path/to/key.pem可选地,Redis 缓存条目的过期时间用--cache-ttl配置;默认值见trivy clean/server 帮助,文档未给出具体默认时长,按需指定即可。
如果你倾向用配置文件而不是命令行参数,trivy.yaml中对应的项与上述参数一一对应(配置文件路径通过--config指定,默认为trivy.yaml):
cache: backend: "redis://<REDIS_HOST>:6379" redis: tls: false ca: "" cert: "" key: "" ttl: 0s server: listen: "0.0.0.0:8080" token: "dummy"客户端通过 --token 连接 server
在客户端所在主机上,--server指定 server 地址,--token填入与 server 相同的值。文档特别强调:server 地址必须带协议(http 或 https):
$ trivy image --server http://<SERVER_HOST>:8080 --token dummy alpine:3.10token 的传输 header 名称默认为Trivy-Token,两端都可用--token-header修改为其他名称。
验证配置是否生效
文档提供了两个不需要鉴权的 server 端点,可用于先确认 server 本身已起来:
curl -s 0.0.0.0:8080/healthz ok/healthz返回ok且状态为200 OK表示 server 在运行。/version端点返回 server 版本和漏洞库元数据:
curl -s 0.0.0.0:8080/version | jq文档示例输出(示例结果,数值以你实际环境为准):
{ "Version": "dev", "VulnerabilityDB": { "Version": 2, "NextUpdate": "2023-07-25T14:15:29.876639806Z", "UpdatedAt": "2023-07-25T08:15:29.876640206Z", "DownloadedAt": "2023-07-25T09:36:25.599004Z" } }随后用客户端对同一镜像分别从不同 server 发起扫描。如果各 server 都基于本地fs缓存时出现的layer cache missing错误不再出现、扫描正常返回漏洞列表,说明 Redis 共享缓存已生效。扫描成功时的表格输出形如(文档示例):
alpine:3.10 (alpine 3.10.2) =========================== Total: 3 (UNKNOWN: 0, LOW: 1, MEDIUM: 2, HIGH: 0, CRITICAL: 0)此外可验证 token 鉴权:不带--token或使用错误 token 的客户端请求无法通过鉴权,只有--token与 server 一致时扫描请求才生效。
限制与安全边界
--token同时控制扫描 API 和缓存 API 的访问,但不提供按客户端的权限区分或租户隔离:持有 token 的客户端可以写入和删除共享缓存条目,从而影响其他客户端的扫描结果。文档明确建议:互不信任的客户端应使用相互独立的 server 实例和独立的缓存存储,即使使用 Redis 后端也不例外。- Trivy server 本身只提供 HTTP。对外暴露时,除配置
--token和限制网络访问范围外,文档建议通过 TLS 终结的反向代理或等效安全传输来保护连接。 - Redis 缓存后端是 EXPERIMENTAL 特性,升级 Trivy 版本时留意行为变化。
- client/server 模式本身不影响扫描职责划分:漏洞、License 扫描在 server 端执行,misconfiguration 与 secret 扫描仍在 client 端本地执行。
相关文档:client-server 模式、缓存配置、故障排查、trivy server 参数。
【免费下载链接】trivyFind vulnerabilities, misconfigurations, secrets, SBOM in containers, Kubernetes, code repositories, clouds and more项目地址: https://gitcode.com/GitHub_Trending/tr/trivy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考