docker 内容安全签名之 notary

简介
在网络系统之间传输数据时, 信任是一个主要问题。特别是,当通过不受信任的媒体(例如Internet)进行通信时,确保系统所处理的所有数据的完整性和发布者至关重要。您可以使用Docker Engine将图像(数据)推入和拉入公共或私有注册表。内容信任使您能够验证通过任何渠道从注册表接收的所有数据的完整性和发布者。

安装使用

下载notary仓库
# 如果clone过慢可以使用gitclone.com 这个网站进行加速处理
git clone https://github.com/theupdateframework/notary.git
因为该项目是国外仓库,导致有部分资源无法下载,需要做一下特殊处理,所有的dockerfile
# 替换软件源 RUN apk add --update git gcc libc-dev 替换成
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 增加环境变量
ENV GOPROXY=https://goproxy.cn,direct
项目的证书已于2021-04-01T03:38:34Z已经过期了需要更新证书,更新需要下载cfssl 相关组件cfssljson、cfssl-certinfo、cfssl
https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
chmod +x cfssl*
mv cfssl* /usr/bin
进入项目fixtures 目录
cd fixtures
sh ./regenerateTestingCerts.sh
更新本地证书
cp ./fixtures/root-ca.crt /etc/pki/ca-trust/source/anchors/
update-ca-trust

启用服务端

docker-compose up -d

设置环境变量

export DOCKER_CONTENT_TRUST_ROOT_PASSPHRASE="sezg6ogsmylknht8"
export DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE="sezg6ogsmylknht8"
export DOCKER_CONTENT_TRUST_SERVER=https://127.0.0.1:4443
export DOCKER_CONTENT_TRUST=1

在Docker中进行镜像签名
要签名一个 Docker 镜像,需要一个密钥对,其可以使用命令在本地生成(默认情况下存储在 ~/.docker/trust/ 中),也可以由来自证书机构。

本地生成

$ docker trust key generate point_me
Generating key for point_me...
Enter passphrase for new point_me key with ID 9deed25:
Repeat passphrase for new point_me key with ID 9deed25:
Successfully generated and loaded private key.

使用已有

$ docker trust key load key.pem --name point_me
Loading key from "key.pem"...
Enter passphrase for new point_me key with ID 8ae710e:
Repeat passphrase for new point_me key with ID 8ae710e:
Successfully imported key from key.pem

接下来,我们将公钥添加到公证服务器上。如果是第一次执行的话,需要输入一些相关信息,才可以使用。

$ docker trust signer add --key cert.pem point_me registry.example.com/admin/demo
Adding signer "point_me" to registry.example.com/admin/demo...
Enter passphrase for new repository key with ID 10b5e94:

最后,我们将使用私钥对特定镜像文件的标签进行签名,并将其推到仓库中去。

签名

$ docker trust sign registry.example.com/admin/demo:1
Signing and pushing trust data for local image registry.example.com/admin/demo:1, may overwrite remote trust data
The push refers to repository [registry.example.com/admin/demo]
7bff100f35cb: Pushed
1: digest: sha256:3d2e482b82608d153a374df3357c0291589a61cc194ec4a9ca2381073a17f58e size: 528
Signing and pushing trust metadata
Enter passphrase for signer key with ID 8ae710e:
Successfully signed registry.example.com/admin/demo:1

查看签名

docker trust inspect --pretty registry.example.com/admin/demo:1

缺陷

目前使用docker trust sign image会出现一下错误

errors:
denied: requested access to the resource is denied
unauthorized: authentication required

你可能感兴趣的:(docker 内容安全签名之 notary)