镜像签名与验证
Docker Content Trust (DCT) 确保镜像来源可信,防止篡改。
启用 DCT
Bash
# 启用内容信任
export DOCKER_CONTENT_TRUST=1
# 永久生效
echo 'export DOCKER_CONTENT_TRUST=1' >> ~/.bashrc
密钥管理
根密钥与仓库密钥
Bash
# 首次推送时自动生成
docker trust key generate my-key
# 输出
Generating key for my-key...
Enter passphrase for new my-key key:
Enter again:
# 密钥存储位置
~/.docker/trust/private/
密钥类型:
- 根密钥 (root key):首次使用生成,保护仓库
- 仓库密钥 (repository key):每个仓库独立
委派密钥
Bash
# 添加委派签名者
docker trust signer add --key cert.pem dev user/registry
# 委派签名权限,不暴露根密钥
签名镜像
Bash
# 推送并签名
docker push myregistry.com/my-app:v1.0
# 输出
Signing and pushing trust metadata
Enter passphrase for new my-app key:
Enter passphrase for new my-app key (again):
验证签名
Bash
# 拉取已签名镜像(DCT 启用时)
docker pull myregistry.com/my-app:v1.0
# 输出
Pull (1 of 1): myregistry.com/my-app:v1.0@sha256:abc123...
Pull complete
# 验证失败会拒绝拉取
查看签名
Bash
# 查看镜像签名状态
docker trust inspect myregistry.com/my-app:v1.0
# 输出
[
{
"Name": "myregistry.com/my-app:v1.0",
"SignedTags": [
{
"SignedTag": "v1.0",
"Digest": "sha256:abc123..."
}
]
}
]
签名工作流
Bash
1. 构建镜像
docker build -t my-app:v1.0 .
2. 推送并签名
docker push my-app:v1.0
(输入密钥)
3. 用户拉取验证
docker pull my-app:v1.0
(自动验证签名)
撤销签名
Bash
# 撤销标签
docker trust revoke myregistry.com/my-app:v1.0
# 撤销后拉取会失败(DCT 启用时)
Notary 服务器
text
# 配置 Notary 服务器
export DOCKER_CONTENT_TRUST_SERVER=https://notary.example.com
# 签名数据存储在 Notary 服务器
# 客户端验证时从 Notary 获取签名
最佳实践
- 生产环境启用
DOCKER_CONTENT_TRUST=1 - 根密钥离线存储,不要上传到服务器
- 使用委派密钥分工签名
- CI/CD 流水线中集成签名步骤
- 定期轮换密钥
要点总结
- Docker Content Trust 使用 Notary 实现镜像签名
- 启用
DOCKER_CONTENT_TRUST=1强制验证 - 推送时签名,拉取时验证,防止中间人攻击
- 根密钥保护仓库安全,委派密钥分工签名
- 生产环境必须启用,CI/CD 流水线集成签名
📝 发现内容有误?点击此处直接编辑