仓库安全配置 #
安全概述 #
安全威胁 #
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的高级构建技术。