1. 程式人生 > >Docker registry ssl認證和訪問控制

Docker registry ssl認證和訪問控制

一:實驗環境以及需求

實驗環境:兩臺cnetos7.2版本虛擬機器。(資源允許最好準備三臺,一臺做私有倉庫,一臺做上傳映象伺服器,一臺做下載映象伺服器)

虛擬機器1:192.168.1.200 

虛擬機器2:192.168.1.201

伺服器防火牆和selinux關閉。hosts根據實際情況做解析,每臺都需要解析。

本實驗hosts解析為:192168.1.201 hub.com

此文件預設在Registry上操作,client上操作時會紅色標記。

二:自建證書CA

要實現ssl認證就需要證書支援,證書最好是服務商提供的證書,比如阿里雲,騰訊雲等等。這裡由於做實驗,使用自建證書。

官方文件
得知需要實驗ssl認證,只需要.key 和 .crt。

建立.key和.crt

openssl req -newkey rsa:2048 -nodes -sha256 -keyout /docker/cert/ca.key -x509 -days 365 -out /docker/cert/ca.crt
Country Name (2 letter code) [AU]:CN                                 #國家程式碼,中國CN
State or Province Name (full name) [Some-State]:Sichuan              #
省份全拼 Locality Name (eg, city) []:Chengdu #城市 Organization Name (eg, company) [Internet Widgits Pty Ltd]:registry #組織名,公司名 Organizational Unit Name (eg, section) []:CA #部門名稱 Common Name (e.g. server FQDN or YOUR name) []:hub.com         #
這裡必須填寫Docker Registry使用的域名 Email Address []:[email protected] #電子郵件

三:ssl認證

1:將ca.crt內容放入系統的CA bundle檔案當中,使作業系統信任我們的自簽名證書。然後重啟docker

CentOS 6 / 7中bundle檔案的位置在/etc/pki/tls/certs/ca-bundle.crt

cat /docker/cert/ca.crt >> /etc/pki/tls/certs/ca-bundle.crt
systemctl restart docker

2:使用Docker Registry的Docker機需要將ca.crt拷貝到 /etc/docker/certs.d/[docker_registry_domain]/ca.crt

mkdir /etc/docker/certs.d/hub.com/              #在client上操作(200)
scp  /docker/cert/ca.crt  192.168.1.200:/etc/docker/certs.d/hub.com/

3:Registry端和client端重啟docker。

systemctl restart docker

四:啟動Registry

1:啟動

docker run -d -p 5000:5000 --restart=always --name registry \
    -v /registry:/var/lib/registry \
    -v `pwd`/cert/:/certs \
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/ca.crt \
    -e REGISTRY_HTTP_TLS_KEY=/certs/ca.key \
    -e REGISTRY_STORAGE_DELETE_ENABLED=true \
    registry

 解釋:將宿主機的cert/目錄對映到容器中的/certs目錄中。指定registry啟動使用/certs中的證書。`pwd` :當前目錄,也可以使用絕對路徑:/docker/cert/

2:瀏覽器驗證

沒使用證書的時候時走的http,使用證書後走的是https。

3:client端上傳映象驗證(client端)。

docker tag mariadb  hub.com:5000/db:2.0
docker push hub.com:5000/db:2.0

  

五:訪問限制

通過basic authentication 實現簡單的訪問限制。

1:建立使用者名稱和密碼檔案

cd /docker
mkdir auth
docker run --entrypoint htpasswd registry:2 -Bbn testuser testpassword > auth/htpasswd

  注:紅色部分需改為你的使用者名稱和密碼

2:使用密碼檔案啟動registry

docker run -d -p 5000:5000 --restart=always --name registry \
  -v /registry:/var/lib/registry \
  -v `pwd`/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -v `pwd`/cert:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/ca.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/ca.key \
  -e REGISTRY_STORAGE_DELETE_ENABLED=true \
  registry:2

  注:如果你registry正在執行,需要關閉。由於加了引數--restart=always,當你關閉registry容器時,會自動重啟registry容器,所以只有使用 docker rm -f registry 強制刪除registry容器。

3:瀏覽器驗證

 

使用你剛剛建立的使用者和密碼就可以登入了。

4:client驗證(client端

docker tag mariadb  hub.com:5000/db:3.0
docker push hub.com:5000/db:3.0

  

由於沒有登入剛剛的賬戶,所以沒有許可權上傳。

通過使用者登入

docker login hub.com:5000
docker push hub.com:5000/db3.0

  

六:總結

1:用引數`pwd`時一定要注意啟動時的目錄是否對應。

2:刪除registry'容器時記得刪除掛載卷,不然上傳的映象還存在。docker stop registry && docker rm -v registry

3:訪問失敗時檢視容器日誌:docker logs registry -f       加上-f  實時檢視。