一、 實驗背景
docker中要使用鏡像,一般會從本地、docker Hup公共倉庫和其它第三方公共倉庫中下載鏡像躏仇,一般出于安全和外網(wǎng)(墻)資源下載速率的原因考慮企業(yè)級上不會輕易使用。
那么有沒有一種辦法可以存儲自己的鏡像又有安全認證的倉庫呢??
?企業(yè)級環(huán)境中基于Harbor搭建自己的安全認證倉庫腺办。
Harbor是VMware公司最近開源的企業(yè)級Docker Registry項目, 其目標(biāo)是幫助用戶迅速搭建一個企業(yè)級的Docker registry服務(wù)焰手。
*提供了管理UI
*基于角色的訪問控制(Role Based Access Control)
*AD/LDAP集成
*審計日志(Audit logging)
*原生支持中文
二、 相關(guān)介紹
Harbor在架構(gòu)上主要由五個組件構(gòu)成:
*Proxy:Harbor的registry, UI, token等服務(wù)怀喉,通過一個前置的反向代理統(tǒng)一接收瀏覽器书妻、Docker客戶端的請求,并將請求轉(zhuǎn)發(fā)給后端不同的服務(wù)躬拢。
*Registry: 負責(zé)儲存Docker鏡像躲履,并處理docker push/pull 命令。由于我們要對用戶進行訪問控制聊闯,即不同用戶對Docker image有不同的讀寫權(quán)限工猜,Registry會指向一個token服務(wù),強制用戶的每次docker pull/push請求都要攜帶一個合法的token, Registry會通過公鑰對token 進行解密驗證菱蔬。
*Core services: 這是Harbor的核心功能域慷,主要提供以下服務(wù):
*UI:提供圖形化界面,幫助用戶管理registry上的鏡像(image), 并對用戶進行授權(quán)。
*webhook:為了及時獲取registry 上image狀態(tài)變化的情況犹褒, 在Registry上配置webhook,把狀態(tài)變化傳遞給UI模塊弛针。
*token 服務(wù):負責(zé)根據(jù)用戶權(quán)限給每個docker push/pull命令簽發(fā)token. Docker 客戶端向Registry服務(wù)發(fā)起的請求,如果不包含token叠骑,會被重定向到這里,獲得token后再重新向Registry進行請求削茁。
*Database:為core services提供數(shù)據(jù)庫服務(wù)宙枷,負責(zé)儲存用戶權(quán)限、審計日志茧跋、Docker image分組信息等數(shù)據(jù)慰丛。
*Log collector:為了幫助監(jiān)控Harbor運行,負責(zé)收集其他組件的log瘾杭,供日后進行分析诅病。
各個組件之間的關(guān)系如下圖所示:
Harbor的每個組件都是以Docker容器的形式構(gòu)建的,所以使用Docker Compose來對它進行部署粥烁。
用于部署Harbor的Docker Compose 模板位于 /Deployer/docker-compose.yml. 打開這個模板文件贤笆,會發(fā)現(xiàn)Harbor由5個容器組成:
*proxy: 由Nginx 服務(wù)器構(gòu)成的反向代理。
*registry:由Docker官方的開源registry 鏡像構(gòu)成的容器實例讨阻。
*ui: 即架構(gòu)中的core services, 構(gòu)成此容器的代碼是Harbor項目的主體芥永。
*mysql: 由官方MySql鏡像構(gòu)成的數(shù)據(jù)庫容器。
*log: 運行著rsyslogd的容器钝吮,通過log-driver的形式收集其他容器的日志埋涧。
這幾個容器通過Docker link的形式連接在一起,這樣奇瘦,在容器之間可以通過容器名字互相訪問棘催。對終端用戶而言,只需要暴露proxy (即Nginx)的服務(wù)端口链患。
Harbor的認證流程
A巧鸭、首先,請求被代理容器監(jiān)聽攔截麻捻,并跳轉(zhuǎn)到指定的認證服務(wù)器纲仍。
B、如果認證服務(wù)器配置了權(quán)限認證贸毕,則會返回401郑叠。通知dockerclient在特定的請求中需要帶上一個合法的token。而認證的邏輯地址則指向架構(gòu)圖中的core services明棍。
C乡革、 當(dāng)docker client接受到錯誤code。client就會發(fā)送認證請求(帶有用戶名和密碼)到coreservices進行basic auth認證。
D沸版、 當(dāng)C的請求發(fā)送給ngnix以后嘁傀,ngnix會根據(jù)配置的認證地址將帶有用戶名和密碼的請求發(fā)送到core serivces。
E视粮、 coreservices獲取用戶名和密碼以后對用戶信息進行認證(自己的數(shù)據(jù)庫或者介入LDAP都可以)细办。成功以后,返回認證成功的信息蕾殴。
Harbor的安裝方式
*在線online安裝 ?--> 由于國內(nèi)墻和網(wǎng)速率的原因笑撞,體驗不好
*離線offline安裝 ?--> 下載包較大 [ 包含了相關(guān)依賴鏡像 ],從官網(wǎng)下載效果不理想
三钓觉、實驗準(zhǔn)備
操作系統(tǒng): CentOS7.3 Minimal
HarborServer:192.168.1.102
Client(docker):192.168.1.109
harbor-offline-installer-v1.1.1.tgz
百度云:https://pan.baidu.com/s/1o7LC2d8
Harbor 主機
IP:192.168.1.102
Hostname:www.michael.com
# cat /etc/hosts
192.168.1.102 www.michael.com
docker主機(用來實驗向Harbor registry拉取和推送鏡像)
IP:192.168.1.109
四茴肥、搭建CA,創(chuàng)建相關(guān)證書
在Harbor 主機:
1.搭建CA荡灾,實現(xiàn)加密傳輸
安裝openssl相關(guān)包
# yum?-y?install pcre pcre-devel zlib-devel openssl openssl-devel
2.創(chuàng)建證書
創(chuàng)建證書存放目錄
# mkdir -p /data/cert
# cd /data/cert/
3.創(chuàng)建 CA 根證書
#openssl req? -newkey rsa:4096 \
> -nodes -sha256 -keyout ca.key -x509 -days 365 \
> -out ca.crt -subj "/C=CN/L=Shenzhen/O=Harbor/CN=www.harbor.com"
# ?ls
ca.crt ? ?ca.key
4.生成證書簽名, 設(shè)置訪問域名為 www.michael.com
openssl req -newkey rsa:4096 \
> -nodes -sha256 -keyout www.michael.com.key \
> -out www.michael.com.csr -subj "/C=CN/L=Shenzhen/O=XXX/CN=www.michael.com"
# ls
ca.crt? ca.key?www.michael.com.csr? www.michael.com.key
5.生成主機的證書
# openssl x509 -req -days 365 -in www.michael.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out www.michael.com.crt
Signature ok
subject=/C=CN/L=Shenzhen/O=XXX/CN=www.michael.com
Getting CA Private Key
# ls
ca.crt??
ca.key??
ca.srl?
www.michael.com.crt
www.michael.com.key
www.michael.com.csr??
五瓤狐、Harbor安裝部署
在Harbor 主機:
1.安裝docker?
# yum ?-y install docker?
# systemctl start ?docker.service
# systemctl enable docker.service
2.安裝 docker-compose
# ?yum -y ?install python-setuptools
# easy_install pip?
# ?pip?install?docker-compose
# ?pip?install backports.ssl_match_hostname
3.將 harbor-offline-installer-v1.1.1.tgz 上傳至 /root
# tar zxf? harbor-offline-installer-v1.1.1.tgz
# cd harbor
4.修改habor配置文件 ? harbor.cfg?
# vim? harbor.cfg
hostname= www.michael.com ? ? ? # 指定私有倉庫的主機名,可以是IP地址,也可以是域名
ui_url_protocol?=?https ? ? ? ? ? ? ? ? ? #?用戶訪問私倉時使用的協(xié)議卧晓,默認時http芬首,配置成https
db_password?=?root123 ? ? ? ? ? ? ? ? #?指定mysql數(shù)據(jù)庫管理員密碼
harbor_admin_password:Harbor12345 ? ? ? ? ? ? ?#?harbor的管理員賬戶密碼
ssl_cert?=/data/cert/www.michael.com.crt ? ? ? ? ? ? ?#?設(shè)置證書文件路徑
ssl_cert_key?=/data/cert/www.michael.com.key ? ? ?#?設(shè)置證書密鑰文件路徑
5.執(zhí)行自帶腳本一鍵安裝
# ./install.sh
6.WEB訪問
https://192.168.1.102
https://www.michael.com
默認用戶名:admin
默認密碼:Harbor12345?
?[可通過安裝前 harbor.cfg 配置文件修改?harbor_admin_password?指定 ]
*通過 admin 賬戶登陸創(chuàng)建 test 用戶?
*退出 admin 賬戶登陸 test 用戶
*創(chuàng)建 test 項目, 訪問級別選擇公開
六、客戶端(docker機)測試
在 docker機:
1.安裝docker
# yum -y isntall docker
2.創(chuàng)建倉庫證書存放目錄
# mkdir /etc/docker/certs.d/www.michael.com
3.從harbor服務(wù)器獲取證書至倉庫證書目錄
# scp root@192.168.1.102:/data/cert/ca.crt /etc/docker/certs.d/www.michael.com/ca.crt
# update-ca-trust
# systemctl restart docker
4.添加 192.168.1.102(www.michael.com)域名解析
# vim ? /etc/hosts
192.168.1.102 www.michael.com
5. 用戶登陸
# docker login? www.michael.com? -u admin ?-p? "XXX"
# docker login ?www.michael.com ?-u test ? ? ?-p ? "XXX"
# docker pull ubuntu:14.04
# docker tag ubuntu:17.04? www.michael.com/test/ubuntu:17.04
# docker push www.michael.com/test/ubuntu:17.04
關(guān)于倉庫逼裆、用戶的 push 和pull權(quán)限控制郁稍,請上官網(wǎng)查看相關(guān)教程
七、關(guān)于停止和啟動 Harbor(修改配置文件需重啟)
在 Harbor 機:
# docker-compose? -f? /root/harbor/docker-compose.yml ?down
# ?docker-compose? -f? /root/harbor/docker-compose.yml ?up ?-d
八胜宇、參考
企業(yè)級Registry開源項目Harbor
http://dockone.io/article/1179;
http://www.cnblogs.com/jicki/p/5737369.html
http://www.jiagoumi.com/work/1221.html
Docker實踐:使用Harbor搭建Docker私有倉庫
http://www.jiagoumi.com/work/1221.html
http://www.jiagoumi.com/category/work
企業(yè)級Docker Registry開源工具Harbor的介紹以及使用指南
https://my.oschina.net/xxbAndy/blog/786712
Docker Harbor registry(http)私有倉庫搭建
http://lisea.blog.51cto.com/5491873/1934750
Docker Harbor registry(https)安全認證搭建
https://github.com/vmware/harbor
https://github.com/vmware/harbor/blob/master/docs/installation_guide.md