15.9.6 仓库安全与漏洞扫描
仓库安全与漏洞扫描的目标是防止镜像被篡改、阻断漏洞镜像进入生产、满足审计合规。需要形成“认证与授权→传输安全→镜像可信→漏洞扫描→准入控制→审计追踪”的闭环。
原理草图(访问控制+扫描准入):
一、安装与基础安全配置(Harbor + Trivy)
1)使用 Harbor 内置扫描器(Trivy)
说明:Harbor 会自动集成 Trivy,启用后可在项目级设置扫描策略。
# 1. 安装 docker-compose(以 Ubuntu 为例)
sudo apt-get update
sudo apt-get install -y docker-compose
# 2. 解压 Harbor 安装包
tar -zxvf harbor-offline-installer-*.tgz
cd harbor
# 3. 修改配置(harbor.yml)
# hostname: harbor.example.com
# https:
# port: 443
# certificate: /data/cert/harbor.crt
# private_key: /data/cert/harbor.key
# trivy:
# enabled: true
# vuln_type: "os,library"
# severity: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL"
# 4. 安装
sudo ./install.sh
# 预期效果:访问 https://harbor.example.com,进入管理页面可看到“漏洞扫描”功能。
2)启用 HTTPS(示例:自签证书)
# 生成证书
mkdir -p /data/cert
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /data/cert/harbor.key \
-out /data/cert/harbor.crt \
-subj "/C=CN/ST=BJ/L=BJ/O=Ops/OU=IT/CN=harbor.example.com"
# Docker 信任证书(客户端)
sudo mkdir -p /etc/docker/certs.d/harbor.example.com
sudo cp /data/cert/harbor.crt /etc/docker/certs.d/harbor.example.com/ca.crt
sudo systemctl restart docker
# 预期效果:docker login 时不再报 x509 错误。
二、镜像签名与可信分发(cosign)
1)安装 cosign 并签名镜像:
# 下载并安装 cosign(示例:Linux)
curl -L https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64 \
-o /usr/local/bin/cosign
chmod +x /usr/local/bin/cosign
# 生成签名密钥
cosign generate-key-pair
# 签名镜像
cosign sign --key cosign.key harbor.example.com/proj/app:1.0.0
# 验证镜像签名
cosign verify --key cosign.pub harbor.example.com/proj/app:1.0.0
# 预期效果:verify 返回签名通过,输出签名者与摘要信息。
三、漏洞扫描示例(命令行 + Harbor)
1)命令行扫描(Trivy 独立使用)
# 安装 trivy(示例:Ubuntu)
sudo apt-get install -y wget
wget https://github.com/aquasecurity/trivy/releases/latest/download/trivy_0.50.0_Linux-64bit.deb
sudo dpkg -i trivy_0.50.0_Linux-64bit.deb
# 扫描镜像(同时扫描 OS 与应用依赖)
trivy image --severity HIGH,CRITICAL harbor.example.com/proj/app:1.0.0
# 预期效果:输出漏洞清单与 CVE,非 0 退出码可用于 CI 阻断。
2)Harbor 项目级扫描策略
操作路径:Project → Configuration → Vulnerability Scanning
建议设置:
- 扫描级别:CRITICAL/HIGH
- 扫描时机:Push 时自动扫描
- 准入策略:阻断高危/严重漏洞镜像
四、准入控制与不可变标签
1)不可变标签策略(避免覆盖同标签)
# Harbor 项目设置:
# Project → Configuration → Tag Immutability
# 规则示例:regexp: ^(prod|release)-.*
# 预期效果:生产标签不可被覆盖,防止“同名新镜像”投毒。
2)CI/CD 阻断示例(GitLab CI)
# .gitlab-ci.yml 片段
stages: [build, scan]
build_image:
stage: build
script:
- docker build -t harbor.example.com/proj/app:${CI_COMMIT_SHA} .
- docker push harbor.example.com/proj/app:${CI_COMMIT_SHA}
scan_image:
stage: scan
script:
- trivy image --severity HIGH,CRITICAL --exit-code 1 \
harbor.example.com/proj/app:${CI_COMMIT_SHA}
说明:--exit-code 1 表示发现高危漏洞即返回 1,流水线失败。
五、访问控制与审计示例
1)细粒度权限(Harbor)
- 管理员:全局管理
- 维护者:项目内推/删/配
- 只读:仅拉取
2)审计日志查看(Harbor UI)
路径:Administration → Audit Log
建议定期导出并接入 ELK/审计平台。
六、常见问题与排错
1)x509 证书错误
现象:docker login 报证书无效
处理:
# 确认证书路径正确
ls /etc/docker/certs.d/harbor.example.com/ca.crt
# 重新加载 Docker
sudo systemctl restart docker
2)扫描失败或超时
现象:Harbor 扫描卡住或报错
处理:
# 查看 trivy 日志
docker logs -f harbor-trivy
# 清理数据库缓存(谨慎)
docker exec -it harbor-trivy rm -rf /home/scanner/.cache/trivy
3)镜像拉取被拒绝
现象:403/denied
处理:检查项目权限、账号角色、是否启用准入策略阻断高危漏洞。
七、练习
1)搭建 Harbor 并启用 HTTPS,完成一次 docker login 与 docker push。
2)使用 Trivy 扫描一个存在漏洞的镜像(如较旧的 nginx),观察报告与退出码。
3)启用不可变标签策略,验证对 prod-1.0 的覆盖是否被阻止。
4)在 CI 中加入漏洞扫描步骤,确保高危漏洞导致流水线失败。