私有安全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 對應的容器數是同樣的。

相關文章
相關標籤/搜索