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 logindocker push
2)使用 Trivy 扫描一个存在漏洞的镜像(如较旧的 nginx),观察报告与退出码。
3)启用不可变标签策略,验证对 prod-1.0 的覆盖是否被阻止。
4)在 CI 中加入漏洞扫描步骤,确保高危漏洞导致流水线失败。