私有安全docker registry受权访问实验

关于私有安全docker registry的实验

实验环境

服务器端:使用registry v2.1启动容器。
客户端:安装了Docker的机器,准备pull/push操做html

实验条件:
registry端生成私钥以及证书:
node

1
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt

并启动:
docker

1
2
3
4
5
6
docker run -d -p 5000:5000 --restart=always \ 
--name registry  -v `pwd`/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-v /images/:/var/lib/registry \
registry:2.1

实验一

测试不安全的访问:
docker端不存放证书。直接下载镜像
安全

1
docker pull registry.test.com:5000/test-busybox:v1

提示错误:服务器

Error response from daemon: unable to ping registry endpoint https://registry.test.com:5000/v0/
v2 ping attempt failed with error: Get https://registry.test.com:5000/v2/: x509: certificate signed by unknown authority
v1 ping attempt failed with error: Get https://registry.test.com:5000/v1/_ping: x509: certificate signed by unknown authority

表示访问的是安全仓库,可是禁止访问。一样若是docker push的话也会提示:dom

The push refers to a repository     [registry.test.com:5000/test-busybox] (len: 1)
unable to ping registry endpoint https://registry.test.com:5000/v0/
v2 ping attempt failed with error: Get https://registry.test.com:5000/v2/: x509: certificate signed by unknown authority
v1 ping attempt failed with error: Get https://registry.test.com:5000/v1/_ping: x509: certificate signed by unknown authority

这个时候能够开启docker daemon的不安全访问,即在/etc/defaults/docker文件里,找到DOCKER_OPT参数,在后面追加–insecure-registry registry.test.com:5000。并重启docker daemon。curl

再次测试docker push 和 docker pull。成功。测试

此时测试:
this

1
curl -XGET https://registry.test.com:5000/v2/_catalog

提示禁止访问:url

curl: (60) SSL certificate problem: self signed certificate
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
of Certificate Authority (CA) public keys (CA certs). If the default
bundle file isn't adequate, you can specify an alternate file using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
the bundle, the certificate verification probably failed due to a
problem with the certificate (it might be expired, or the name might
not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
the -k (or --insecure) option.

若是使用-k 或者 –insecure参数的话能够访问到registry的相应内容。

实验二

测试安全访问,证书存放在/etc/docker/certs.d/registry.test.com:5000/下面。

实验条件,首先使用scp命令将registry端前面生成的domain.crt拷贝到docker端。而后建立路径:/etc/docker/certs.d/registry.test.com:5000/,并将domain.crt复制过去。

测试docker pull / docker push。可成功。说明此证书是即刻生效的。

若是将domain.crt从该路径移走,docker pull / docker push失败。

对于curl的测试:
curl -XGET方式提示禁止访问
curl –insecure方式可访问
而使用证书的访问:

1
curl --cacert /etc/docker/certs.d/registry.test.com\:5000/domain.crt -XGET https://registry.test.com:5000/v2/_catalog

是成功的。

实验三

测试安全访问,证书放在/usr/local/share/ca-certificate/domain.crt。

实验条件,首先使用scp命令将registry端前面生成的domain.crt拷贝到docker端,而后再移动到路径:/usr/local/share/ca-certificate/下。

此时进行docker push / docker pull是失败的。须要更新证书。

使用命令更新证书:

1
update-ca-certificate

如今再docker push / docker pull仍失败。还须要重启docker daemon。
重启以后的docker push / docker pull是成功的。

测试curl,若是不带证书的访问,一样能够正常访问。

一样,再移除了/usr/local/share/ca-certificate/domain.crt以后,更新update-ca-certificate以后,docker pull / docker push仍成功。

在重启了docker daemon以后,docker push / docker pull失败。

实验结论

对于使用了SSL方式进行受权访问的私有docker registry。对于它的访问,有3种方式:

1. 修改docker daemon的配置,添加--insecure-registry ...的形式访问。
2. 将证书拷贝到docker的certs.d路径下,证书只对docker daemon生效,当即生效
3. 将证书拷贝到/usr/local/share/ca-certificate/....的路径里,证书在更新update-ca-certificate以后全局生效,docker daemon需重启

小问题

经过将拥有证书的一方视为可信的一方来受权访问是没有问题的。在这种形式里,双方都认为对方是可信的。

但前面也提示了能够加–insecure参数进行不安全访问,这表示docker端不在乎registry是否可信,而registry端也并不阻拦docker端的访问。这样安全性就下降了不少。

关于update-ca-certificates

经过update-ca-certificates的man page能够了解到,

它会更新/etc/ssl/certs,并读取/etc/ca-certificates.conf,这个文件中每行都是在/usr/share/ca-certificates的文件都是可信的。

而在/usr/local/share/ca-certificates下的.crt文件也视做可信

通常ca-certificate路径有:

/etc/ca-certificates
/usr/share/ca-certificates
/usr/share/doc/ca-certificates
/usr/local/share/ca-certificates

来源:http://man.he.net/man8/update-ca-certificates

存疑

docker 运行以后会在/var/lib/docker/aufs/diff/UID/xxx/ca-certificates,这样的路径,是指运行的容器?UID数量和docker ps 对应的容器数是同样的。

相关文章
相关标签/搜索