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

关于私有安全docker registry的实验

实验环境

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

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

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

并启动:

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的话也会提示:

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。

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

此时测试:

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

提示禁止访问:

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 对应的容器数是一样的。


转载于:https://my.oschina.net/yyflyons/blog/656280

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值