搭建私有Docker仓库


下面是对这些私有 Docker 仓库工具的区别和优势的简要比较:

工具优势
Docker Registry官方支持,与 Docker 完美集成 简单易用,适合小规模部署 支持基本的认证和授权机制
Harbor开源项目,提供丰富的功能和管理工具 支持用户和角色管理、镜像复制和同步、安全扫描等 适用于组织内部的 Docker 镜像管理
Nexus Repository Manager通用的仓库管理软件,支持多种软件包类型 强大的权限控制和存储管理功能 适用于组织内部的软件包管理
GitLab Container Registry与 GitLab 集成,方便与代码仓库和 CI/CD 流程一起使用 可以创建私有项目,并使用 GitLab Container Registry 存储镜像
AWS ECR托管式服务,与 AWS 生态系统集成紧密 高可用性和可扩展性 适用于在 AWS 上部署应用程序的场景

这里选用Harbor。

1 简介

Harbor 是一个开源的企业级 Docker Registry 和镜像管理工具,它提供了丰富的功能和管理工具,用于帮助组织内部管理和存储 Docker 镜像。Harbor 提供了统一的 Docker 镜像存储、管理和分发平台,可以帮助企业内部更好地管理 Docker 镜像资源。它支持基于角色的访问控制、镜像复制和同步、安全漏洞扫描、基于 Web 的用户界面等功能,适用于组织内部的 Docker 镜像管理需求。

  • 官网地址

  • GitHub 仓库地址

  • 主要功能特点

    • 安全镜像管理:支持镜像签名和验证、漏洞扫描、RBAC(基于角色的访问控制)等安全功能。
    • 高性能存储:支持多种存储后端,包括本地存储、S3、Azure Blob、Google Cloud Storage 等,满足不同的存储需求。
    • 企业级身份认证:支持 LDAP、OIDC 等企业级身份认证方式,集成企业内部身份管理系统。
    • 易于扩展:支持多节点部署,可水平扩展,提供高可用性和可扩展性。
    • 图形化用户界面:提供基于 Web 的用户界面,方便用户管理和浏览镜像。

总的来说,Harbor 是一个功能强大、安全可靠的企业级 Docker Registry 和镜像管理工具,适用于组织内部的 Docker 镜像管理需求。

2 安装

2.1 安装条件:

  • 已安装Docker 和 Docker Compose
  • 至少2核4G,40G硬盘

详细要求参考:

https://goharbor.io/docs/2.10.0/install-config/installation-prereqs/

2.2 安装方式

安装方式主要有:

  • 在线安装
  • 离线安装
  • Docker容器安装

详细安装方法参考:

https://goharbor.io/docs/2.0.0/install-config/

2.3 安装步骤

本次安装基于CentOS 7.9,采用离线安装方式,截止当前版本为2.10.1。安装步骤:

  • 执行:wget https://github.com/goharbor/harbor/releases/download/v2.10.1/harbor-offline-installer-v2.10.1.tgz下载离线安装文件
  • 执行:tar -zxvf harbor-offline-installer-v2.10.1.tgz解压文件
  • 进入harbor目录后执行:cp harbor.yml.tmpl harbor.yml复制配置文件,然后编辑harbor.yml

    由于我在内网使用,因此直接使用openssl生成证书:

    # 第一步:生成私钥
    openssl genrsa -out key.pem 4096
    # 第二步:生成证书请求
    openssl req -new -key key.pem -out csr.pem
    # 第三步:签名证书请求
    openssl x509 -req -in csr.pem -out cert.pem -signkey key.pem -days 365

    设置hostname为本机IP地址,设置https端口为非443端口,

  • 执行:./prepare
  • 执行:./install.sh安装

    安装成功后如图:

3 使用

访问设置的域名和端口:

使用admin用户和配置文件中的密码登录

3.1 配置管理

3.1.1 身份认证管理

Harbor支持数据库、LDAP/AD、UAA和OIDC四种认证方式,但官方不建议使用此身份验证模式。

3.1.1.1 数据库认证

此认证方式下用户凭证存储在数据库中,默认情况下,只有Harbor系统管理员才能创建用户帐户以将用户添加到Harbor。您可以选择配置 Harbor 以允许自行注册:

3.1.1.2 LDAP/AD认证

由于用户凭证存储在外部LDAP或AD服务器中,此认证方式不支持自行注册、创建用户、删除用户、修改密码、重置密码。

3.1.1.3 OIDC认证

由于用户由OIDC提供商管理,OIDC认证方式不支持自行注册、创建用户、删除用户、修改密码、重置密码。

当 Harbor 系统管理员将 Harbor 配置为通过 OIDC 进行身份验证时,Harbor 登录页面上会出现LOGIN WITH ${your_oidc_provider_name}按钮。

注意:当Harbor通过OIDC配置身份验证时,LOGIN VIA LOCAL DB按钮供本地Harbor系统管理员登录。

3.1.2 系统设置

可设置仅管理员可创建项目:

可以将仓库设置为只读模式。在只读模式下,Harbor 允许docker pull但阻止docker push删除存储库和标签。

默认情况下,漏洞扫描器(例如 Trivy)将在扫描镜像时保留镜像的最后拉取时间。这会影响基于拉取时间的标签保留规则。如果您想消除这种影响,可以启用此选项以避免更新扫描拉取时间。

3.2 用户管理

数据库认证模式下创建用户,并设置是否为管理员:

然后就可以使用创建的账户登录此web服务。

3.3 项目管理

Harbor 通过项目来管理镜像。创建项目时可以设置访问级别和项目配额:

点击创建的项目后进入对应项目管理页面,右侧有镜像推送命令:

您可以添加和管理项目成员,通过将用户包含在项目中并向他们分配以下角色之一来向用户提供对这些镜像的访问权限:

  • 受限访客:受限访客没有项目的完全读取权限。他们可以拉取镜像但无法推送,并且看不到日志或项目的其他成员。例如,您可以为来自不同组织的共享项目访问权限的用户创建有限的来宾。
  • 访客:访客对指定项目具有只读权限。他们可以拉取和重新标记图像,但不能推送。
  • 开发者:开发者拥有项目的读写权限。
  • 维护人员:维护人员拥有比“开发人员”更高的权限,包括扫描镜像、查看复制作业以及删除镜像和控制图表的能力。
  • 项目管理员:创建新项目时,您将被分配给该项目“项目管理员”角色。除了读写权限外,“项目管理员”还具有一些管理权限,例如添加和删除成员、启动漏洞扫描等。

除了上述角色外,还有两个系统级角色:

  • Harbor系统管理员:“Harbor系统管理员”拥有最高权限。除了上述权限外,“Harbor系统管理员”还可以列出所有项目、将普通用户设置为管理员、删除用户以及为所有镜像设置漏洞扫描策略。公共项目“库”也归管理员所有。
  • 匿名:当用户未登录时,该用户被视为“匿名”用户。匿名用户无权访问私有项目,但对公共项目具有只读访问权限。

如果您在 LDAP/AD 或 OIDC 身份验证模式下运行 Harbor,则可以在 LDAP/AD 或 OIDC 提供商中创建和管理用户帐户。 Harbor从LDAP/AD或OIDC服务器获取用户并将其显示在Harbor界面的用户管理选项卡中

添加维护人员示例:

如果使用LDAP/AD或OIDC认证方式,可以添加组到项目中:

您还可以管理标签、扫描器、策略、机器人账户和Webhooks等其他内容。

此外,您还可以设置适用于所有项目的默认配额。默认配额仅会应用于更改默认配额后创建的项目。默认情况下,所有项目都具有无限的存储使用配额。

3.4 机器人账户

您可以创建机器人帐户来运行自动化操作。机器人帐户有以下限制:

  1. 机器人账号无法登录Harbor界面。
  2. 机器人帐户只能使用 Docker 和 Helm CLI 执行操作

3.4.1 添加机器人账户

  1. 使用至少具有项目管理员权限的帐户登录Harbor界面。
  2. 转到项目,选择一个项目,然后单击机器人帐户选项卡。

  3. 单击新建机器人帐户
  4. 输入此机器人帐户的名称和可选描述。
  5. 设置该机器人帐户的过期时间。您还可以选择“永不过期”复选框来创建永不过期的机器人帐户。如果不设置,则该机器人账号使用系统配置的过期时间。
  6. 根据需要向机器人帐户授予权限,以推送镜像或推送和拉取 Helm 图表。

    机器人帐户始终可以拉取图像,因此您无法取消选择此选项。

  7. 单击“保存”
  8. 在确认窗口中,单击导出到文件以将访问令牌下载为 JSON 文件,或单击剪贴板图标将其内容复制到剪贴板。

    Harbor 不存储机器人帐户令牌,因此您必须下载令牌 JSON 或将其内容复制并粘贴到文本文件中。创建机器人帐户后,无法从 Harbor 获取令牌。

    新的机器人帐户将显示robot$account_name在机器人帐户列表中。该robot$前缀使其很容易与普通的 Harbor 用户帐户区分开来。

  9. 要删除或禁用机器人帐户,请在列表中选择该帐户,然后从操作下拉菜单中选择禁用帐户删除。

3.4.2 使用机器人帐户进行身份验证

要在自动化流程(例如脚本)中使用机器人帐户,请使用docker login并提供机器人帐户的凭据。

docker login harbor_address
Username: robot$account_name
Password: robot_account_token

3.5 Webhooks

您可以配置 Webhook来通知Harbor 项目中发生的某些事件。 Webhook 允许您将 Harbor 与其他工具集成,以简化持续集成和开发流程。您可以自定义webhook服务端实现收到 Harbor 项目的通知后所采取的操作。如发送一个企业微信通知,执行后续的安装或运行流程等等。

您可以为每个项目定义多个 Webhook 端点。 Harbor目前支持两种端点, HTTPSLACK

配置一个HTTP类型的Webhook后:

当镜像推送成功后,服务端收到的推送内容如下:

POST / HTTP/1.1
Host: 192.168.102.91
User-Agent: Go-http-client/1.1
Content-Length: 363
Content-Type: application/json
Accept-Encoding: gzip

{
    "type": "PUSH_ARTIFACT",
    "occur_at": 1711965776,
    "operator": "user",
    "event_data": {
        "resources": [
            {
                "digest": "sha256:cc55c46451dcc00c09f19a01a75cf1d30f389432ee473b1b963ce40bfbe6cc84",
                "tag": "8.0",
                "resource_url": "192.168.102.98:9876/ag/mysql:8.0"
            }
        ],
        "repository": {
            "date_created": 1711965776,
            "name": "mysql",
            "namespace": "ag",
            "repo_full_name": "ag/mysql",
            "repo_type": "private"
        }
    }
}

详情参考:https://goharbor.io/docs/2.0.0/working-with-projects/project-configuration/configure-webhooks/

3.6 仓库管理

仓库允许用户在 Harbor 和非 Harbor Registry之间复制资源,即镜像和图表。要将镜像存储库从一个 Harbor 实例复制到另一个 Harbor 或非 Harbor Registry,您首先需要创建目标。

Harbor支持以下非 Harbor Registry:

  • Docker Hub
  • Docker registry
  • AWS Elastic Container Registry
  • Azure Container Registry
  • Ali Cloud Container Registry
  • Google Container Registry
  • Huawei SWR
  • Artifact Hub (Support added in v2.0.4)
  • Gitlab
  • Quay.io
  • Jfrog Artifactory

3.6.1 复制远程仓库到本地

选择仓库管理,添加一个目标,如Docker Hub,然后测试连接,连接成功后确定添加即可:

然后选择复制管理,新建复制规则,选择Pull-based和源仓库,填写必要信息即可:

然后选择对应的规则点击复制即可:

3.6.2 复制本地仓库到远程仓库

选择复制管理,新建复制规则,选择Push-based和源仓库,填写必要信息即可:

3.7 在 Docker 客户端中拉取和推送镜像

Harbor 可以选择支持 HTTP 连接,但是 Docker 客户端默认首先使用 HTTPS 连接到注册表。如果 Harbor 配置为 HTTP,则必须配置 Docker 客户端。如果未配置,则当您尝试将映像拉取或推送到 Harbor 时,您将看到以下错误:

Error response from daemon: Get https://myregistrydomain.com/v1/users/: dial tcp myregistrydomain.com:443 getsockopt: connection refused.

配置方法参考:https://goharbor.io/docs/2.0.0/install-config/run-installer-script/#connect-http

3.7.1 拉取镜像

如果该镜像所属的项目是私有的,则必须先登录:docker login <harbor_address>,然后再执行拉取命令:docker pull <harbor_address>/library/ubuntu:14.04

3.7.2 推送镜像

在将镜像推送到Harbor之前,您必须在Harbor界面中创建相应的项目。

首先,从Docker客户端登录:

如果发生错误:Error response from daemon: Get "https://x.x.x.x:xxxx/v2/": tls: failed to verify certificate: x509: cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs,则执行:docker login <harbor_address>

echo "{ \"insecure-registries\": [\"x.x.x.x:xxxx\"] }" | sudo tee /etc/docker/daemon.json
sudo systemctl restart docker

登录成功后执行:

# 在项目中标记镜像:
docker tag SOURCE_IMAGE[:TAG] x.x.x.x:xxxx/project/REPOSITORY[:TAG]
# 推送镜像到当前项目:
docker push x.x.x.x:xxxx/project/REPOSITORY[:TAG]

如果发生错误:unauthorized: project test not found: project test not found,说明Harbor中无相应的项目。

3.8 升级及数据迁移

  1. 登录到 Harbor 主机,如果仍在运行,请停止并删除现有的 Harbor 实例。

    cd harbor
    docker-compose down
  2. 备份Harbor的当前文件,以便您可以在必要时回滚到当前版本。

    mv harbor /my_backup_dir/harbor
  3. 备份数据库,默认位于目录中/data/database

    cp -r /data/database /my_backup_dir/
  4. 从https://github.com/goharbor/harbor/releases获取最新的 Harbor 发布包 。
  5. 升级Harbor之前,需要先进行迁移。

    迁移工具位于harbor-prepare作为 Docker 映像提供的工具中。您可以从 Docker Hub 拉取镜像。在以下命令中:

    docker pull goharbor/prepare:[tag]

    或者,如果您使用脱机安装程序包,则可以从脱机安装程序包中包含的映像 tarball 加载它。在以下命令中将_[version]_替换为新的 Harbor 版本(例如):v2.0.0

    tar zxf <offline package>
    docker image load -i harbor/harbor.[version].tar.gz
  6. 复制到/path/to/old/harbor.ymlharbor.yml升级它。

    docker run -it --rm -v /:/hostfs goharbor/prepare:[tag] migrate -i ${path to harbor.yml}

    注意:数据库的架构升级和数据迁移是在Harbor启动时由core执行的。如果迁移失败,请查看核心日志进行调试。

  7. 在该./harbor目录中,运行./install.sh脚本以安装新的 Harbor 实例。

    要使用 Notary、Clair 和 Chartmuseum 等组件安装 Harbor,请参阅 运行安装程序脚本以获取更多信息。

3.9 漏洞扫描

Harbor 通过开源项目 TrivyClair提供漏洞扫描服务。

要使用 Trivy 或 Clair ,您必须在安装 Harbor 时启用 Trivy或Clair(通过附加安装选项--with-trivy--with-clair)。

如果同时安装了 Trivy 和 Clair,则 Trivy 是系统默认扫描仪。

此外,Harbor 支持连接到其他漏洞扫描程序,但扫描器必须公开 API 接口,以允许 Harbor 触发扫描过程或获取报告。您可以部署多个不同的扫描仪以及同一类型扫描仪的多个实例。

3.10 构建和自定义开发

https://goharbor.io/docs/2.0.0/build-customize-contribute/

声明:Hack All Sec的博客|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 搭建私有Docker仓库


Hacker perspective for security