仓库安全配置 #

安全概述 #

安全威胁 #

text
┌─────────────────────────────────────────────────────┐
│                   安全威胁                           │
├─────────────────────────────────────────────────────┤
│                                                     │
│  1. 镜像篡改 - 恶意修改镜像内容                     │
│  2. 中间人攻击 - 传输过程被窃听                     │
│  3. 未授权访问 - 无认证访问仓库                     │
│  4. 镜像漏洞 - 镜像包含安全漏洞                     │
│  5. 数据泄露 - 敏感信息泄露                         │
│                                                     │
└─────────────────────────────────────────────────────┘

安全措施 #

措施 说明
TLS加密 传输层加密
认证 用户身份验证
授权 访问权限控制
镜像签名 镜像完整性验证
漏洞扫描 安全漏洞检测

TLS配置 #

使用Let’s Encrypt证书 #

bash
# 安装certbot
sudo apt-get install certbot

# 获取证书
sudo certbot certonly --standalone -d registry.example.com

# 证书位置
# /etc/letsencrypt/live/registry.example.com/fullchain.pem
# /etc/letsencrypt/live/registry.example.com/privkey.pem

配置Registry TLS #

bash
docker run -d \
  --name registry \
  -p 443:443 \
  -v /data/registry:/var/lib/registry \
  -v /etc/letsencrypt/live/registry.example.com:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem \
  -e REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem \
  registry:2

自签名证书 #

bash
# 生成CA私钥
openssl genrsa -out ca.key 4096

# 生成CA证书
openssl req -new -x509 -days 365 -key ca.key -out ca.crt \
  -subj "/CN=Docker Registry CA"

# 生成服务器私钥
openssl genrsa -out server.key 2048

# 生成CSR
openssl req -new -key server.key -out server.csr \
  -subj "/CN=registry.example.com"

# 签名证书
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key \
  -CAcreateserial -out server.crt

# 配置Registry
docker run -d \
  --name registry \
  -p 443:443 \
  -v /data/registry:/var/lib/registry \
  -v /certs:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
  registry:2

客户端信任证书 #

bash
# 复制CA证书到客户端
sudo mkdir -p /etc/docker/certs.d/registry.example.com
sudo cp ca.crt /etc/docker/certs.d/registry.example.com/ca.crt

# 重启Docker
sudo systemctl restart docker

认证配置 #

Basic认证 #

bash
# 创建密码文件
mkdir -p /etc/docker/registry/auth
docker run --rm --entrypoint htpasswd httpd:2 \
  -Bbn admin password > /etc/docker/registry/auth/htpasswd

# 添加更多用户
docker run --rm --entrypoint htpasswd httpd:2 \
  -Bbn user1 password >> /etc/docker/registry/auth/htpasswd

启动带认证的Registry #

bash
docker run -d \
  --name registry \
  -p 443:443 \
  -v /data/registry:/var/lib/registry \
  -v /certs:/certs \
  -v /etc/docker/registry/auth:/auth \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
  -e REGISTRY_AUTH=htpasswd \
  -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  registry:2

Token认证 #

yaml
# config.yml
auth:
  token:
    realm: https://auth.example.com/auth
    service: registry.example.com
    issuer: auth.example.com
    rootcertbundle: /certs/auth.crt

访问控制 #

Harbor RBAC #

text
┌─────────────────────────────────────────────────────┐
│                   Harbor角色权限                     │
├─────────────────────────────────────────────────────┤
│                                                     │
│  访客:                                              │
│  - 拉取镜像                                         │
│                                                     │
│  开发者:                                            │
│  - 拉取镜像                                         │
│  - 推送镜像                                         │
│                                                     │
│  管理员:                                            │
│  - 拉取镜像                                         │
│  - 推送镜像                                         │
│  - 删除镜像                                         │
│  - 管理项目                                         │
│                                                     │
└─────────────────────────────────────────────────────┘

项目隔离 #

bash
# 创建项目
# 在Harbor中创建不同项目

# 开发项目
docker push harbor.example.com/dev/myapp:v1.0

# 生产项目
docker push harbor.example.com/prod/myapp:v1.0

镜像签名 #

Docker Content Trust #

bash
# 启用内容信任
export DOCKER_CONTENT_TRUST=1

# 推送签名镜像
docker push registry.example.com/myapp:v1.0

# 拉取签名镜像
docker pull registry.example.com/myapp:v1.0

# 查看签名
docker trust inspect registry.example.com/myapp:v1.0

Notary服务 #

yaml
# docker-compose.yml
version: '3.8'

services:
  notary-server:
    image: notary:server
    ports:
      - "4443:4443"
    volumes:
      - ./notary-server.config.json:/etc/notary/server-config.json
      - ./notary.crt:/etc/notary/notary.crt
      - ./notary.key:/etc/notary/notary.key

  notary-signer:
    image: notary:signer
    volumes:
      - ./notary-signer.config.json:/etc/notary/signer-config.json

漏洞扫描 #

Harbor扫描 #

bash
# Harbor内置Clair扫描器
# 推送镜像后自动扫描

# 手动触发扫描
# 在Harbor UI中点击 Scan

Trivy扫描 #

bash
# 安装trivy
brew install trivy

# 扫描镜像
trivy image registry.example.com/myapp:v1.0

# 只扫描高危漏洞
trivy image --severity HIGH,CRITICAL registry.example.com/myapp:v1.0

# 输出JSON格式
trivy image --format json --output results.json registry.example.com/myapp:v1.0

Docker Scout #

bash
# 扫描镜像
docker scout quickview registry.example.com/myapp:v1.0

# 查看CVE
docker scout cves registry.example.com/myapp:v1.0

# 比较镜像
docker scout compare myapp:v1.0 myapp:v2.0

安全最佳实践 #

1. 使用TLS #

bash
# 始终使用HTTPS
docker push https://registry.example.com/myapp:v1.0

2. 强认证 #

bash
# 使用强密码
# 定期更换密码
# 使用访问令牌

3. 最小权限 #

bash
# 只授予必要权限
# 使用项目隔离
# 定期审计权限

4. 镜像签名 #

bash
# 启用内容信任
export DOCKER_CONTENT_TRUST=1

# 验证签名
docker trust inspect registry.example.com/myapp:v1.0

5. 定期扫描 #

bash
# CI/CD集成扫描
trivy image --exit-code 1 --severity HIGH,CRITICAL myapp:v1.0

6. 审计日志 #

bash
# 启用审计日志
# Harbor自动记录所有操作
# 定期审查日志

安全配置清单 #

text
┌─────────────────────────────────────────────────────┐
│                   安全配置清单                       │
├─────────────────────────────────────────────────────┤
│                                                     │
│  [ ] 启用TLS加密                                    │
│  [ ] 配置用户认证                                   │
│  [ ] 设置访问控制                                   │
│  [ ] 启用镜像签名                                   │
│  [ ] 配置漏洞扫描                                   │
│  [ ] 启用审计日志                                   │
│  [ ] 定期备份数据                                   │
│  [ ] 定期更新证书                                   │
│  [ ] 定期审查权限                                   │
│  [ ] 制定安全策略                                   │
│                                                     │
└─────────────────────────────────────────────────────┘

小结 #

本节学习了Docker仓库的安全配置:

  • TLS证书配置
  • 用户认证配置
  • 访问控制管理
  • 镜像签名验证
  • 漏洞扫描配置
  • 安全最佳实践

下一步 #

接下来,让我们学习 多阶段构建,了解Docker的高级构建技术。