Harbor 完全定制手册 – 制作一个更好用的registry

Harbor 完全定制手册 – 制作一个更好用的registry

纯干货分享
http://jiangjiang.space 回忆书签,转载请注明出处,谢谢

1.1 Harbor

1.1.1 功能全面的registry:Harbor

vmware harbor 是VMware公司开源的一套docker registry方案。内置集成了很多企业应用的特性:

  • RBAC 基于角色的权限控制
  • 基于策略的镜像复制
  • 漏扫
  • LDAP/AD支持
  • 镜像删除和垃圾清理
  • Notary 镜像签名
  • 用户界面
  • 审计
  • RESTful api
  • 安装简单(基于compose)

1.1.2 Harbor 和 Clair , Notray

Clair

clair 是 coreos 开源的容器漏洞扫描工具,在容器逐渐普及的今天,容器镜像安全问题日益严重。clair 是目前少数的开源安全扫描工具,主要提供OS(centos,debian,ubuntu等)的软件包脆弱性扫描。

clair的可以单机部署也可以部署到k8s上,可以与现有的registry集成。架构如下:

harbor 很好的整合了 clair ,通过简单的UI就可以对上传的镜像扫描,还可以通过每天的定时扫描对所有镜像进行统一扫描。

关于 Clair 请浏览: https://github.com/coreos/clair

Notray

Notary
是一套docker镜像的签名工具, 用来保证镜像在pull,push和传输工程中的一致性和完整性。
避免中间人攻击,避免非法的镜像更新和运行。

ps: Notray 可能是 no Troy 的变体,我自己YY的

其工作流程如下:
Notray工作流程

Harbor也集成了Notray, 但是目前集成的并不全面, 在删除已经签名的镜像时仍然需要手工执行notray命令行,期待更进一步的简化流程。

关于Notray请浏览 https://github.com/docker/notary

1.2 Harbor安装

以下步骤是harbor离线安装,HTTPS协议

1.2.1 下载包

从如下地址
https://github.com/vmware/harbor/releases
下载离线包
harbor-offline-installer-v1.2.2.tgz

解包

tar -xvf  harbor-offline-installer-v1.2.2.tgz

安装docker-compose

sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo cp /usr/local/bin/docker-compose /bin && chmod u+x docker-compose

1.2.2 编辑harbor.cfg

参数:

hostname = 域名  # 设置正式启用时的域名
ui_url_protocol = https  # http 或 https,如果启用https则hostname必须是域名
ssl_cert = /svr/xxx.pem   # 证书的位置
ssl_cert_key = /svr/xxx.key # 证书位置
secretkey_path -   # 按需要设置路径
auth_mode  #  db_auth  是自己维护一个数据库认证,可以开启用户自注册功能
           #   ldap_auth  设置是启用openldap或者ad域
self_registration = on  # 是否运行用户自己注册, 如果用ldap就设置为no
project_creation_restriction = adminonly   #  adminonly只允许admin创建项目
                                # everyone 为任何人都能创建
verify_remote_cert = off  # 启用同步的时候,是否检查远端的https证书, 如果是自己签发的证书这里就选择off

其他的配置包括ldap具体参数等需要根据本地具体的设置来配置, 这里给个例子不一定适用。

ldap_url = ldaps://adldapsever

#ldap_searchdn = uid=searchuser,ou=people,dc=mydomain,dc=com
ldap_searchdn = CN=员工,DC=emp,DC=xxxcop,DC=com

#the password of the ldap_searchdn
ldap_search_pwd = paasss

#The base DN from which to look up a user in LDAP/AD
#ldap_basedn = ou=people,dc=mydomain,dc=com
ldap_basedn = 

# The attribute used in a search to match a user, it could be uid, cn, email, sAMAccountName or other attributes depending on your LDAP/AD  
ldap_uid = sAMAccountName

#the scope to search for users, 1-LDAP_SCOPE_BASE, 2-LDAP_SCOPE_ONELEVEL, 3-LDAP_SCOPE_SUBTREE
ldap_scope = 3 

#Timeout (in seconds)  when connecting to an LDAP Server. The default value (and most reasonable) is 5 seconds.
ldap_timeout = 5

1.2.3 编辑compose文件 (可选)

以下步骤全部可选,请酌情选择。

1.2.3.1 修改数据目录

compose文件默认将数据安装到/data,如果需要手动修改如下:

sed -i 's/- \/data/- \/somedir\/harbor-data/g' docker-compose.yml
sed -i 's/- \/data/- \/somedir\/harbor-data/g' docker-compose.clair.yml
sed -i 's/- \/data/- \/somedir\/harbor-data/g' docker-compose.notary.yml

1.2.3.2 设置网络ip段(可选,按照实际情况)

如需要限定网段,或者你的组织有明确的docker网络规范,请修改如下部分

# docker-compose.yml
networks:
    harbor:
        external: false
        ipam:
            config:
                - subnet: xxx.xxx.xxx.xxx/27 
# docker-compsoe.clair.yml 
networks:
  harbor-clair:
    external: false
    ipam:
       config:
         - subnet: xxx.xxx.xxx.xxx/27
docker-compose.notary.yml:
networks:
  harbor-notary:
    external: false
    ipam:
        config:
          - subnet: xxx.xxx.xxx.xxx/27
  notary-mdb:
    external: false
    ipam:
        config:
          - subnet: xxx.xxx.xxx.xxx/27
  notary-sig:
    external: false
    ipam:
        config:
          - subnet: xxx.xxx.xxx.xxx/27

1.2.3.3 修改harbor文本显示(本地定制化)

修改 docker-compose.yml
找到ui部分

ui:
    image: vmware/harbor-ui:v1.2.2
    container_name: harbor-ui
    env_file:
      - ./common/config/ui/env
    restart: always
    volumes:
        - /harbor-data/custom/ui-lang:/harbor/static/i18n/lang

ui-lang 文件制作:

mkdir -p  /harbor-data/custom/ui-lang  && cd /harbor-data/custom/ui-lang 
wget https://github.com/vmware/harbor/blob/master/src/ui_ng/src/i18n/lang/zh-cn-lang.json

编辑这个文件,按照你需要的文本修改。

1.2.3.4 修改标题颜色(区分不同环境)

修改 docker-compose.yml
找到ui部分

ui:
    image: vmware/harbor-ui:v1.2.2
    container_name: harbor-ui
    env_file:
      - ./common/config/ui/env
    restart: always
    volumes:
       - /harbor-data/xdf/ui/clarity-ui.min.css:/harbor/static/clarity-ui.min.css:z

将原来容器中的/harbor/static/clarity-ui.min.css文件下载出来,修改如下样式:
找到CSS类: header.header-5

header.header-5,.header.header-5{background-color:#CE0606}

本人美感不足,因此选色诡异,请自行找UI设计配色。

1.2.3.5 修改默认网络端口

按需修改端口,格式是 HOST:CONTAINER , 前面是主机的端口,后面是容器的端口。
只需要改HOST端口即可

 docker-compose.yml 
  proxy:
  # 其他略
    ports:
      - 80:80
      - 443:443
      - 4443:4443

1.2.4 编辑配置模板 (可选)

1.2.4.1 设置registry为ceph存储

解压harbor包后找到common目录下的templates,这里是全部的配置文件模板,直接修改配置文件是无效的,只要一允许prepare就会覆盖。

cd  common/templates/registry  
vi  config.yml
## 找到下面行,注释filesystem 加入 swift
storage:
    cache:
        layerinfo: inmemory
    #filesystem:
    #    rootdirectory: /storage
    swift:
        username: xxx
        password: xxx
        authurl: http://xxxxxx/auth/v1.0
        tenant: xxxxx
        container: docker-image-registry-test-1 

具体参数请参见我的另一篇文档:
harbor/registry设置Ceph对象存储

1.2.5 执行安装脚本

$ sudo ./install.sh –with-notary –with-clair

http://jiangjiang.space 回忆书签,转载请注明出处,谢谢

1.2.6 设置HTTPS

1.2.6.1 正式签发的证书

直接放到harbor.cfg 对应的位置

ssl_cert = /svr/xxx.pem   # 证书的位置
ssl_cert_key = /svr/xxx.key # 证书位置

1.2.6.2 自签发的证书

自签发证书

## 生成证书
 openssl req \
    -newkey rsa:4096 -nodes -sha256 -keyout ca.key \
    -x509 -days 365 -out /svr/ca.crt

## 修改 harbor.cfg

ssl_cert = /svr/ca.crt   #  刚刚创建的证书
ssl_cert_key = /svr/ca.key  # 刚刚创建的key

注意在CN 那里要填写一个标准域名比如 reg.aaa.com , 如果是自己测试,可以自己搭dnsmasq 或者直接在访问的机器hosts文件上劫持即可。
如果是正式环境,要写实际发布时候的域名,不能乱写,也不可以写ip。

详细步骤可以参考:
https://github.com/vmware/harbor/blob/master/docs/configure_https.md

1.2.7 重新配置

注意以下操作会删除掉之前所有的容器。
如果不想干掉容器可以手动修改配置,比如registry的存储路径等其实可以不执行down这步,直接到容器里面修改配置文件即可。

export  HARBOR_HOME=/home/harbor
cd $HARBOR_HOME
sudo docker-compose -f ./docker-compose.yml -f ./docker-compose.notary.yml -f ./docker-compose.clair.yml down -v   ## 这里会干掉所有已有容器,包括已经下载了漏洞库的clair
vim harbor.cfg
sudo ./prepare --with-notary --with-clair
sudo docker-compose -f ./docker-compose.yml -f ./docker-compose.notary.yml -f ./docker-compose.clair.yml up -d

1.2.7 启动停止

在之前的版本如果不按照compose文件顺序起停harbor会出问题,现在貌似没有这样的问题了,不过最好还是按照compose顺序启停,做两个脚本如下:

harbor-stop.sh

export  HARBOR_HOME=/home/harbor
cd $HARBOR_HOME
/bin/docker-compose -f ./docker-compose.yml -f ./docker-compose.notary.yml -f ./docker-compose.clair.yml stop

harbor-start.sh

export  HARBOR_HOME=/home/harbor
cd $HARBOR_HOME
/bin/docker-compose -f ./docker-compose.yml -f ./docker-compose.notary.yml -f ./docker-compose.clair.yml stop

1.2.8 附录

1.2.8.1 clair 不同步漏洞特征问题

请检查容器的dns设置,如果需要可以将主机的/etc/resolve 文件挂到容器内
另外默认clair配置为12小时同步一次,因此出现同步失败后并不会马上启动下一次同步。
http://jiangjiang.space 回忆书签,转载请注明出处,谢谢