李大白

V1

2022/07/16阅读:20主题:自定义主题1

离线安装:如何搭建安全的企业级Harbor服务?内容太过详细。

安全搭建一套企业级的Harbor服务,


1 Harbor简介


Harbor 是个开源云原生制品(artifact)仓库,是首个原创于中国、并且成为 CNCF 第11个毕业级的开源项目。用户可通过策略和基于角色的访问控制来保护制品(如容器镜像、Helm Chart 等),扫描镜像并避免受安全漏洞的危害。
Harbor 扩展了开源项目 Docker Distribution,添加了用户所需的功能(例如安全性,身份,漏洞扫描和管理)。
在环境中部署 Harbor 可以提高镜像传输效率,便于就近构建和运行容器应用。
Harbor 支持在制品仓库之间复制镜像、Chart 等制品,并提供高级安全功能,例如用户管理、访问控制和操作审计等。\


2 Harbor几种安装方式

Harbor提供以下几种安装方式,以适应不同的安装环境。

  • 在线安装:适合初学者快速搭建一个Harbor仓库,简单快速,安装过程需要从官方拉取镜像,资源包带online

  • 离线安装:适合公司内网环境,离线安装包装载了安装过程需要的镜像(自动导入),资源包带offline

  • 源码安装:适合开发者对Harbor进行开发和测试,通过编译源码到本地进行安装,安装条件较苛刻,需要了解Harbor底层原理和实现方式的,可选择源码安装的方式

  • Heml Chart:通过Heml安装Harbor到kubernetes集群;

  • Operater安装Harbor Operator提供了可深度定制的能力,用户通过配置顶级 CRD HarborCluster,根据实际需要定义和配置自己的 Harbor 组件。

每种安装方式都可以实现Habor的高可用(高可用方案官方建议使用kubernetes的安装方式,其他方式官方并不维护),防止单点故障。
基于离线安装方式的高可用方案见公众号《Harbor进阶实战》的另外一篇文章!


3 部署环境

  • 操作系统:CentOS-7.5\
  • Harbor版本:2.3.5\
  • 主机配置:2C、4G内存\
  • 主机IP:192.168.2.22\
  • 安装软件:docker-ce-19.03.8、docker-compose-2.2.3、cfssl、cfssl-json

4 Harbor主机初始化

Harbor部署需要主机有一定的环境,主要有以下几个点对主机进行初始化操作。

4.1 安装docker-ce

Harbor不论是以哪一种方式安装,每个组件都是以容器的方式运行的,所以需要安装docker-ce来启动容器。 本处安装的是Harbor v2.3.5,对应的docker版本是17.06.0-ce+都可以,本处安装19.03.8的。
1)配置repo源

$ wget  https://download.docker.com/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
$ yum clean alll && yum makecache

2)安装docker

$ yum  install -y docker-ce-19.03.8

3)启动docker并设置为开机自启

$ systemctl start docker.service 
$ systemctl enable  docker.service

4)添加docker配置文件

$ cat <<EOF > /etc/docker/daemon.json 
{
   "registry-mirrors": ["https://xcg41ct3.mirror.aliyuncs.com"],
   "exec-opts": ["native.cgroupdriver=systemd"],     # 驱动器
   "insecure-registries": ["192.168.2.22:443"],   #Harbor服务的URL
   "registry-mirrors": ["https://3hjcmqfe.mirror.aliyuncs.com"],   # 镜像加速
   "log-driver""json-file",
   "log-opts": {
            "max-size""500m",   #定义log最大500m
            "max-file""2"     #log最多保留数量
        },
    "live-restore"true      #重启docker不重启容器,多用于k8s上
}
EOF

5)重启docker服务

$ systemctl start docker.service 

4.2 安装docker-compose

docker-compose的版本在1.18.0+

$ mv docker-compose-linux-x86_64   /usr/local/bin/docker-compose
$ chmod +x   /usr/local/bin/docker-compose
$ docker-compose -v
docker-compose version 1.29.2, build 5becea4c

4.3 配置内核参数

$ modprobe br_netfilter     //加载内核模块(临时)
$ cat > /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF 
$ sysctl -p

net.ipv4.ip_forward=1 :开启路由转发
不配置该参数,当主机重启后,服务状态正常,却无法访问到服务器。


4.4 下载并解压安装包

$ mkdir  /app
$ wget https://github.com/goharbor/harbor/releases/download/v2.3.5/harbor-offline-installer-v2.3.5.tgz
$ tar zxvf harbor-offline-installer-v2.3.5.tgz -C  /app
$ ls  /app/harbor
harbor.v2.5.1.tar.gz  harbor.yml  harbor.yml.tmpl  install.sh  LICENSE  prepare

common.sh: 环境检测脚本,在安装过程中会运行该脚本来检测docker、docker-compose、golang等是否符合要求;
harbor.v2.3.5.tar.gz: Harbor各个组件的镜像包,可先手动导入到本地,安装过程等待的时间会少些!
harbor.yml.tmpl: Harbor的配置文件模板,可根据该文件生成Harbor的配置文件;
install.sh: Harbor的安装脚本;


4.5 创建Harbor工作目录

$ mkdir -p /app/harbor/ssl/    #存放harbor证书
$ mkdir -p /app/data/   # 创建harbor数据目录(配置文件中指定该目录)

4.6 下载并安装cfssl证书制作工具

在线安装,离线安装到官网下载安装包即可。

$ wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl_1.6.0_linux_amd64 \
 -O   /usr/local/bin/cfssl
$ wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssljson_1.6.0_linux_amd64 \
 -O  /usr/local/bin/cfssljson
$ wget https://github.com/cloudflare/cfssl/releases/download/v1.6.0/cfssl-certinfo_1.6.0_linux_amd64   \
 -O  /usr/local/bin/cfssl-certinfo 
$ chmod +x  /usr/local/bin/cfssl*      #给这几个工具执行权限

cfssljson: 将从cfssl和multirootca等获得的json格式的输出转化为证书格式的文件(证书,密钥,CSR和bundle)进行存储;
cfssl-certinfo:可显示CSR或证书文件的详细信息;可用于证书校验。


5 制作Harbor安全证书

使用刚才安装好的cfssl工具为harbor制作颁发证书。

5.1 生成证书颁发机构证书(CA)

(1)生成并修改CA默认配置文件

$ cfssl print-defaults  config > ca-config.json            #生成默认配置文件
$ vim ca-config.json
{
    "signing": {
        "default": {
            "expiry""87600h"  
        },
        "profiles": {
            "harbor": {
                "expiry""87600h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}

default.expiry:默认证书有效期(单位:h)
profiles.harbor:为服务使用该配置文件颁发证书的配置模块;
signing:签署,表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
key encipherment:密钥加密;
profiles:指定了不同角色的配置信息;可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile。
server auth:服务器身份验证;表示 client 可以用该 CA 对 server 提供的证书进行验证;
client auth:客户端身份验证;表示 server 可以用该 CA 对 client 提供的证书进行验证;

(2)生成并修改默认csr请求文件

$ cfssl  print-defaults csr  > ca-csr.json
$ vim ca-csr.json
{
    "CN""harbor",
    "hosts": [
    ],
    "key": {
        "algo""rsa",
        "size": 2048
    },
    "names": [
        {
            "C""CN",
            "ST""Beijing",
            "L""Beijing"
        }
    ]
}

hosts:包含的授权范围,不在此范围的的节点或者服务使用此证书就会报证书不匹配错误,证书如果不包含可能会出现无法连接的情况(此处是CA机构的可为空);
Key: 指定使用的加密算法,一般使用rsa非对称加密算法(algo:rsa;size:2048)
CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
CN是域名,也就是你现在使用什么域名就写什么域名;
O:Organization,从证书中提取该字段作为请求用户所属的组 (Group);

(3)初始化CA

$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca 
2022/15/05 17:45:13 [INFO] generating a new CA key and certificate from CSR
2022/15/05 17:45:13 [INFO] generate received request
2022/15/05 17:45:13 [INFO] received CSR
2022/15/05 17:45:13 [INFO] generating key: rsa-2048
2022/15/05 17:45:13 [INFO] encoded CSR
2022/15/05 17:45:13 [INFO] signed certificate with serial number 569300079190788296339255431042064535929535986620
$ ls 
ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem

可以看到,当前目录下新生成了ca.csrca-key.pemca.pem这3个文件。 ca-key.pem、ca.pem这两个是CA相关的证书,通过这个CA来签署服务端证书。


5.2 CA给Harbor颁发证书文件

(1)创建并修改Harbor证书请求文件

$ cfssl  print-defaults csr >  harbor-csr.json 
$ vim  harbor-csr.json
{
    "CN""192.168.2.22",  #Harbor主机IP
    "hosts": [],
    "key": {
        "algo""rsa",
        "size": 2048
    },
    "names": [
        {
            "C""CN",
            "ST""Beijing",
            "L""Beijing"
        }
    ]
}

(2)使用请求文件根据CA配置颁发证书

$ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \
-config=ca-config.json \
-profile=harbor  harbor-csr.json | cfssljson -bare  harbor 
$ ls
ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem  harbor.csr  harbor-csr.json  harbor-key.pem  harbor.pem
$ cp harbor.pem harbor-key.pem  /app/harbor/ssl/

-config:指定CA证书机构的配置文件;
-profile:指定使用CA配置文件中的哪个模块(此处harbor对应配置文件中的harbor);
harbor.pem:harbor服务的数字证书;
harbor-key.pem:harbor服务的私钥;


六、离线部署Harbor

6.1 创建并修改配置文件

需要将根据配置文件模板手动生成配置文件。

cd /app/harbor     #进入到Harbor安装目录
$ cp harbor.yml.tmpl  harbor.yml   

修改配置文件(重要)

$ vim /app/harbor/harbor.yml
hostname: 192.168.2.22   #本机IP或域名
http:
  port: 80
https:       #启用https安全访问
  port: 443    #Https安全端口(默认443)
  certificate: /app/harbor/ssl/harbor.pem    #Harbor的证书
  private_key: /app/harbor/ssl/harbor-key.pem  #Harbor的证书私钥
data_volume: /app/data     #Harbor的数据存储目录
metric:    #Metrics组件:收集Harbor服务的一些指标信息,可以通过Prometheus等实现对Harbor的监控;
  enabled: True   #启用Metrics组件
  port: 9090
  path: /metrics

关于Harbor配置文件每个参数的详细含义,可查看官方文档,或可在【Harbor进阶实战】微信公众号找到,本处仅修改一些必须的参数。

6.2 执行./prepare

$ ./prepare 

细心的你想必已经发现,在执行完./prepare后Harbor的安装目录下多了个common 目录和docker-compose.yml文件(通过与刚解压时对比可看出)。 再继续看下comman目录下的内容,不难看出:在执行./prepare过程中,会根据harbor的配置文件在common目录下生成Harbor每个组件的配置文件组件间通信的证书环境变量等!
~如果你在执行./prepare会报错,请检查配置文件及环境是有问题!~

6.3 运行install.sh安装脚本

1)查看install.sh的参数

install.sh为Harbor的安装脚本,并提供了3个安装参数来安装对应的插件。

$ ./install.sh  -h
Note: Please set hostname and other necessary attributes in harbor.yml first. DO NOT use localhost or 127.0.0.1 for hostname, because Harbor needs to be accessed by external clients.
Please set --with-notary if needs enable Notary in Harbor, and set ui_url_protocol/ssl_cert/ssl_cert_key in harbor.yml bacause notary must run under https. 
Please set --with-trivy if needs enable Trivy in Harbor
Please set --with-chartmuseum if needs enable Chartmuseum in Harbor

--with-notary: 安装镜像签名组件Notary(包括Notary Server和Notary Singer),必须配置HTTPS方可指定该参数;
--with-clair:安装镜像扫描工具Clair;(2.3.1已弃用);
--with-trivy:安装镜像扫描工具Trivy;
--with-chartmuseum:安装Char文件管理组件ChartMuseum;

2)执行 ./install.sh安装harbor

$ ./install.sh  --with-notary --with-trivy  --with-chartmuseum 

在install.sh执行会经过以下过程:

  • (1)调用common.sh脚本检查dockerdocker-composegolang的版本号、是否安装等是否符合安装环境;
  • (2)导入/拉取镜像;
  • (3)根据镜像,使用docker运行每个组件的容器;
  • (4)启动Harbor中的每个组件(服务);

安装成功图
安装成功图

6.4 查看服务状态

查看Harbor每个组件的服务状态是否正常!

$ docker-compose ps
Harbor服务状态图
Harbor服务状态图

NAME列: Harbor的组件服务名称;
COMMAND:启动Harbor组件的命令;
STATUS: Harbor组件服务的状态(running正常);
harbor-exporter组件是刚才我们在配置文件中启用的metrics组件监控服务。


七、Harbor的简单应用

7.1 命令行登录Harbor

如果客户端想要使用Harbor服务,则需要有docker环境且在docker的配置文件中指定harbor的地址。
1) 通过insecure-registries参数指定Harbor地址!

$ vim  /etc/docker/daemon.json 

{
   "registry-mirrors": ["https://xcg41ct3.mirror.aliyuncs.com"],
   "exec-opts": ["native.cgroupdriver=systemd"],
   "insecure-registries": ["192.168.2.22:443","lidabai.harbor.com:443"],
   "registry-mirrors": ["https://192.168.2.22:443"],
   "log-driver""json-file",
   "log-opts": {
            "max-size""500m"
        }
}

2)命令行登录Harbor

$ docker login https://192.168.2.22:443  -u admin  -p Harbor12345

-u 指定Harbor的用户名(admin为超级管理员);
-p 指定用户的密码; docker登录Harbor成功图

PS: 命令行推送/拉取Harbor中的镜像本处不详细说明,如果你对docker有一定的了解,相信这不是个问题!

浏览器登录Harbor UI管理界面

在浏览器输入harbor的主机名和端口号,再输入用户名(刚安装使用admin超级管理员用户)和密码(默认为Harbor12345)

Harbor登录界面
Harbor登录界面
Harbor管理界面
Harbor管理界面

总结

本篇详细分享了基于离线安装包,在企业环境中部署安全的Harbor服务器。从操作到原理进行了详细的阐述,如果你对Harbor的备份、升级、监控、镜像迁移、高可用方案等感兴趣,可到公众号【Harbor进阶实战】进行阅读,如果在操作过程遇到问题,请留言!

分类:

后端

标签:

运维部署

作者介绍

李大白
V1