企业内网如何搭建安全的Harbor服务?(超详细)_kubernetes

hallo!我是李大白,一名容器运维工程师,今天分享下企业内网环境下如何搭建安全的Harbor服务器。

更多Harbor的知识,可看我博客主页。

                                              企业内网如何搭建安全的Harbor服务?(超详细)_Harbor_02


1 部署环境

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


2 Harbor的5种安装方式

  • 在线安装:适合初学者快速搭建一个Harbor仓库,简单快速,安装过程需要从官方拉取镜像,资源包带online。
  • 离线安装​:适合公司内网环境,离线安装包装载了安装过程需要的镜像(自动导入),资源包带​offline
  • 源码安装:适合开发者对Harbor进行开发和测试,通过编译源码到本地进行安装,安装条件较苛刻,需要了解Harbor底层原理和实现方式的,可选择源码安装的方式;
  • Heml Chart:通过Heml安装Harbor到 kubernetes集群;

每种安装方式都可以实现Habor的高可用(高可用方案官方建议使用kubernetes的安装方式,其他方式官方并不维护),防止单点故障,楼主本篇分享的是【离线安装】的部署方式


3  相关软件包下载

因为是企业内网环境,相关的安装包需要用自己的电脑下载相关软件,然后上传到部署的主机上。

3.1、docker-ce安装包下载


3.2、docker-compose下载

  docker-compose的版本要在1.18.0以上,否则安装会报错,本处下载2.2.3版本。

wget https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64


3.3、Harbor离线安装包(官网下载)

官方下载地址: https://github.com/goharbor/harbor/releases 

      选择带有offline的安装包进行下载。

企业内网如何搭建安全的Harbor服务?(超详细)_Harbor_03



4 安装docker-ce和docker-compose

企业内网如何搭建安全的Harbor服务?(超详细)_docker_04

4.1、使用离线安装包安装docker并启动docker服务

# tar zxvf docker-ce-rpm.tar.gz 
# cd docker-ce-rpm/
# yum install -y ./*.rpm
# systemctl enable --now docker
# systemctl status docker

企业内网如何搭建安全的Harbor服务?(超详细)_运维_05

企业内网如何搭建安全的Harbor服务?(超详细)_Harbor_06


4.2 安装docker-compose

# mv docker-compose-linux-x86_64   /usr/local/bin/docker-compose
# ls -l /usr/local/bin/docker-compose
-rw-r--r-- 1 root root 24707072 17 16:08 /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# docker-compose --version
Docker Compose version v2.2.3

企业内网如何搭建安全的Harbor服务?(超详细)_docker_07


5 配置内核参数

5.1 临时加载内核模板

# modprobe br_netfilter

5.2 配置内核参数并生效

# 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  :开启路由转发,不配置该参数,当主机重启后,服务状态正常,却无法访问到服务器。

  企业内网如何搭建安全的Harbor服务?(超详细)_Harbor_08


6 配置安全访问证书

默认情况下,Harbor 不附带证书。可以在没有安全性的情况下部署 Harbor,以便您可以通过 HTTP 连接到它。在生产环境中,始终使用 HTTPS。如果启用 Content Trust with Notary 以正确签署所有图像,则必须使用HTTPS。

要配置 HTTPS,就必须要创建 SSL 证书。可以使用受信任的第三方 CA 签署的证书,也可以使用自签名证书。本篇文章介绍如何使用cfssl创建 CA,以及如何使用 CA 签署服务器证书和客户端证书。

有条件的企业也可使用购买的证书使用。


6.1 cfssl工具概述

CFSSL是CloudFlare公司提供的PKI/TLS工具,使用Go语言开发。开源并支持Windows、Linux、macos系统。


(1)cfssl有以下几个工具集:

  • multirootca:管理多个签名密钥的情形;使用多个签名密钥的证书颁发机构服务器
  • mkbundle:构建证书池;
  • cfssljson​:将从cfssl和multirootca等获得的json格式的输出转化为证书格式的文件(证书,密钥,CSR和bundle)进行存储;
  • cfssl-certinfo​:可显示CSR或证书文件的详细信息;可用于证书校验。


(2)证书文件说明

  • ca-config.json: 配置文件
  • ca-csr.json:证书请求文件
  • han-ca.csr:证书签名请求文件
  • han-ca.pem:公钥
  • han-key.pem:私钥


6.2 下载cfssl证书制作工具

  官方下载地址:​​https://github.com/cloudflare/cfssl/releases​

# 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

注:

  将下载好的cfssl、cfssljson、cfssl-certinfo工具移动并改名到/usr/local/bin/下,并给可执行权限。


6.3 生成并修改CA默认配置文件

  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"
]
}
}
}
}

expiry:证书过期时间(单位:h);

profiles.harbor:为服务使用该配置文件颁发证书的配置模块;

signing:签署,表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;

key encipherment:密钥加密;

profiles:指定了不同角色的配置信息;可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile。

server auth:服务器身份验证;表示 client 可以用该 CA 对 server 提供的证书进行验证;

client auth:客户端身份验证;表示 server 可以用该 CA 对 client 提供的证书进行验证;


6.4 生成并修改默认csr请求文件

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

hosts:包含的授权范围,不在此范围的的节点或者服务使用此证书就会报证书不匹配错误,证书如果不包含可能会出现无法连接的情况,此处需要改为本机的IP地址;

Key: 指定使用的加密算法,一般使用rsa非对称加密算法(algo:rsa;size:2048)

CN:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;CN是域名,也就是你现在使用什么域名就写什么域名

O:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);

企业内网如何搭建安全的Harbor服务?(超详细)_运维_09


6.5 初始化CA

#  cfssl  gencert  -initca  ca-csr.json  |  cfssljson  -bare   ca 
# ls
anaconda-ks.cfg ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem

会生成ca-key.pem、ca.pem两个文件,ca-key.pem、ca.pem这两个是CA相关的证书,通过这个CA来签署服务端证书。

企业内网如何搭建安全的Harbor服务?(超详细)_Harbor_10


6.6 生成服务器证书

(1)创建并修改服务端证书请求文件

# cfssl  print-defaults csr >  harbor-csr.json 
# vim harbor-csr.json
{
"CN": "harbor",
"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

-config:指定CA证书机构的配置文件;

-profile:指定使用CA配置文件中的哪个模块(此处harbor对应配置文件中的harbor);

harbor.pem:harbor服务的数字证书;

harbor-key.pem:harbor服务的私钥,注意保管,不可随意给别人;

企业内网如何搭建安全的Harbor服务?(超详细)_kubernetes_11


7 安装Harbor

企业内网如何搭建安全的Harbor服务?(超详细)_docker_12

7.1、创建Harbor工作目录

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

 ssl子目录用于存放Harbor相关的证书

7.2、将制作的证书放到/app/harbor/ssl/下

# mv ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem  /app/harbor/ssl/
# mv harbor.csr harbor-csr.json harbor-key.pem harbor.pem /app/harbor/ssl/

7.3、解压Harbor安装包

# # tar zxvf harbor-offline-installer-v2.3.5.tgz  -C    /app/harbor/
# cd /app/harbor/harbor/
# pwd
/app/harbor/harbor
[root@harbor harbor]# ls
common.sh harbor.v2.3.5.tar.gz harbor.yml.tmpl install.sh LICENSE prepare

harbor.v2.3.5.tar.gz:各个功能组件的镜像包,运行install.sh脚本会自动导入该镜像;

prepare:准备脚本,将harbor.yml配置文件的内容注入到各组件的配置文件中;

LICENSE:许可文件;

common.sh:安装脚本的工具脚本;

harbor.yml.tmpl:配置文件模板,需要复制为harbor.yml生成配置文件;

install.sh:安装脚本

  企业内网如何搭建安全的Harbor服务?(超详细)_运维_13  


7.4、使用模板文件创建配置文件

# cp harbor.yml.tmpl harbor.yml

7.5、修改配置文件(重点

# vim harbor.yml
hostname: 192.168.2.81 #Harbor主机名/IP地址,不能是127.0.0.1
http: //非安全访问
port: 80
https:
port: 443 //安全访问端口,默认443,建议修改,本处演示就不改了
certificate: /app/harbor/ssl/harbor.pem //填写制作好的证书文件
private_key: /app/harbor/ssl/harbor-key.pem //填写制作好的私钥文件
#Harbor管理员(admin)的密码,初次不可修改
harbor_admin_password: Harbor12345
database: # 数据配置部分
password: root123 #数据库密码
max_idle_conns: 100
max_open_conns: 900
data_volume: /app/harbor/data #容器存储卷数据存放位置
_version: 2.3.5 # harbor版本,需要改为当前版本,默认的2.3.0会安装失败


7.6、运行prepare脚本以启用 HTTPS

     确保配置文件中启用https模式,并配置好证书。执行期间会从harbor.v2.3.5.tar.gz镜像包中导入goharbor/prepare:v2.3.5镜像。

# ./prepare

企业内网如何搭建安全的Harbor服务?(超详细)_Harbor_14


7.7、执行install.sh脚本安装Habor

       在线安装方式会从网上自动下载需要的镜像,离线安装是自动将harbor.v2.3.5.tar.gz镜像包导入到 本地镜像。

安装脚本支持Harbor组件选装,除核心组件外,其他功能组件可通过对应参数指定安装。


  • 安装参数

--with-notary:安装镜像签名组件Notary(包括Notary Server和Notary Singer),必须配置HTTPS方可指定该参数;

--with-clair:安装镜像扫描工具Clair;(2.3.1已弃用)

--with-trivy:安装镜像扫描工具Trivy;

--with-chartmuseum:安装Char文件管理组件ChartMuseum;harbor基于该插件可当Helm Chart仓库。(哈哈哈!不用自己再搭helm Chart仓库了)


  • 安装脚本的执行流程:

[1]-环境检查,主要检查主机的docker和docker-compose版本;

[2]-载入离线镜像文件;

[3]-准备配置文件并生成docker-compose.yml文件;

[4]-通过docker-compose启动Harbor各组件的容器;


  • 执行命令
[root@harbor harbor]# ./install.sh  --with-notary  --with-trivy  --with-chartmuseum

企业内网如何搭建安全的Harbor服务?(超详细)_运维_15企业内网如何搭建安全的Harbor服务?(超详细)_云原生_16

安装过程无报错!接下来需要验证服务了。


8  查看服务状态

install完成后,会自动启动相关服务。

# docker-compose ps

企业内网如何搭建安全的Harbor服务?(超详细)_运维_17

当state(状态)为Up时,表示容器正常运行。


9  服务启停管理

9.1、服务停止运行

# docker-compose down -v

企业内网如何搭建安全的Harbor服务?(超详细)_云原生_18

9.2、重新启动服务

企业内网如何搭建安全的Harbor服务?(超详细)_kubernetes_19


10  Harbor界面管理

10.1、登录Harbor UI界面

登录地址: https://192.168.2.81:443

企业内网如何搭建安全的Harbor服务?(超详细)_运维_20

企业内网如何搭建安全的Harbor服务?(超详细)_docker_21

输入用户名和密码(admin/Harbor12345),点击“登录”

企业内网如何搭建安全的Harbor服务?(超详细)_docker_22

企业内网如何搭建安全的Harbor服务?(超详细)_docker_23


10.2、创建项目

创建项目给某个系统使用。

【项目】——【新建项目】:

企业内网如何搭建安全的Harbor服务?(超详细)_Harbor_24

企业内网如何搭建安全的Harbor服务?(超详细)_Harbor_25


10.3、新建用户

给开发人员新建一个用户。

【系统管理】——【用户管理】——【新建用户】

企业内网如何搭建安全的Harbor服务?(超详细)_Harbor_26

填写用户信息,然后点击“确定”

企业内网如何搭建安全的Harbor服务?(超详细)_kubernetes_27

企业内网如何搭建安全的Harbor服务?(超详细)_docker_28


10.4、给创建的用户访问新建项目的角色

企业内网如何搭建安全的Harbor服务?(超详细)_云原生_29

企业内网如何搭建安全的Harbor服务?(超详细)_云原生_30


11 Harbor命令行管理

11.1、docker配置文件中配置Harbor地址

harbor的客户端想要拉取/推送Harbor中的镜像,需要在主机上安装docker,并在docker配置文件中指定Harbor服务器地址。

# cat /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors":["https://registry.docker.cn.com"],
"insecure-registries":["192.168.2.81:443"] # 添加该行内容
}

然后需要重启docker服务

# systemctl daemon-reload 
# systemctl restart docker && systemctl status docker

企业内网如何搭建安全的Harbor服务?(超详细)_docker_31


11.2、命令行登录Harbor

# docker login https://192.168.2.81:443 -u admin -p Harbor12345

企业内网如何搭建安全的Harbor服务?(超详细)_运维_32

如果报错:

企业内网如何搭建安全的Harbor服务?(超详细)_docker_33

在/etc/hosts添加:

# vim  /etc/hosts
...
192.168.2.81 harbor # 这里的harbor是配置文件中的hostname的值


11.3、上传镜像到Harbor

将本地的goharbor/harbor-exporter:v2.3.5上传到library项目下。

# docker tag  https://192.168.2.81:443/library/harbor-exporter:v2.3.5  goharbor/harbor-exporter:v2.3.5
# docker push https://192.168.2.81:443/library/harbor-exporter:v2.3.5

11.4、从Harbor拉取镜像

# docker pull https://192.168.2.81:443/library/harbor-exporter:v2.3.5


企业内网如何搭建安全的Harbor服务?(超详细)_Harbor_34