65.9K
CodeProject 正在变化。 阅读更多。
Home

如何保护您的私有 Docker Registry?

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (1投票)

2018 年 10 月 17 日

CPOL

5分钟阅读

viewsIcon

20767

将 SSL 和基本身份验证应用于 Docker Registry 的分步指南。

引言

在我上一篇文章中,我解释了如何使用 Docker Registry 工具在本地计算机上设置私有 Docker 仓库。当从主机使用私有仓库时,所有功能都正常工作,但当您尝试从远程计算机访问时,问题就会开始出现,Docker 会抛出有关 https 连接的错误。此外,当私有仓库可以通过公共网络访问时,必须对其进行保护。在这篇文章中,我们将了解我们有哪些可能的选项以及如何使用它们。

这是我的私有 Docker 仓库系列文章的第二部分,以下列表显示了该系列的提纲

保护私有仓库

我们有三种安全选项来保护您的私有仓库,并且我们将在本文中介绍所有这三个选项。可用的选项是

  • 使用 CA 证书启用 SSL
  • 使用自签名证书启用 SSL
  • 基本身份验证

CA 证书

要为 Web 服务器启用 https,我们需要针对我们的域名(在我们的示例中是 hub.docker.local)获取 SSL 证书。市场上有很多 CA 可以提供这些证书。对于生产环境,建议使用 CA 提供的 SSL 证书,而不是自己创建。Docker 仓库支持使用 Let's Encrypt (开源 CA),因此您也可以考虑使用它。假设您已从 CA 供应商处收到了 hub.docker.local 域所需的 SSL 证书(hub.docker.local.crt、hub.docker.local.key),现在您已准备好为您的私有仓库配置 SSL。

请执行以下步骤将 SSL 配置到您的私有仓库

  • 打开 PowerShell 控制台(Linux 中的终端)
  • 导航到 C:\localhub 文件夹(请记住我们在上一篇文章中创建了此文件夹)。对于 Linux,请转到 /home/localhub
  • 创建 certs 文件夹
  • 将您的证书文件 hub.docker.local.crthub.docker.local.key 复制到 certs 文件夹
  • 使用您的 SSL 证书启动一个仓库容器
    Windows:
    docker run -d -p 443:443 --name local.hub -v C:/localhub/certs:/certs 
    -v C:/localhub/registry:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/hub.docker.local.crt 
    -e REGISTRY_HTTP_TLS_KEY=/certs/hub.docker.local.key registry
    
    Linux:
    docker run -d -p 443:443 --name local.hub -v /home/localhub/certs:/certs 
    -v /home/localhub/registry:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/hub.docker.local.crt 
    -e REGISTRY_HTTP_TLS_KEY=/certs/hub.docker.local.key registry
  • 确保您的仓库容器正在运行
    Windows/Linux:
    docker container ls
  • 重复上一篇文章中的相同步骤,从您的私有仓库推送和拉取镜像
    Windows/Linux:
    docker pull alpine
    docker tag alpine hub.docker.local/alpine
    docker push hub.docker.local/alpine
    docker rmi hub.docker.local/alpine
    docker images
    docker pull hub.docker.local/alpine
    docker images

  • 另外,用浏览器检查目录 URL https://hub.docker.local/v2/_catalog,以确保您的仓库返回元数据

自签名证书

强烈不建议在生产环境中使用自签名证书,但是,我们可以将其用于测试目的和理解 SSL 的功能。要使用自签名证书,我们需要执行以下操作

  • 配置本地 DNS 条目
  • 生成自签名证书
  • 将自签名证书应用到仓库

配置本地 DNS 条目

在上一篇文章的开头,我们已经看到了如何配置 hub.docker.local 的本地 DNS 条目。请参考它,我们将使用相同的设置。

生成自签名证书

我们将使用 OpenSSL 来生成自签名证书。对于 Linux,OpenSSL 是应用程序仓库的一部分,因此如果尚未安装,您可以轻松地通过 apk 进行安装。对于 Windows,您需要从以下链接下载并手动安装:64 位/32 位

Windows 安装
下载适合您 CPU 架构的 OpenSSL 安装程序,建议选择 bin 文件夹来提取二进制文件,而不是 System 32 文件夹。安装完成后,将 openssl 安装的 bin 文件夹添加到 PATH 环境变量。

请执行以下步骤来生成自签名证书

  • 打开 PowerShell 控制台(Linux 中的终端)。
  • 导航到 C:\localhub 文件夹(请记住我们在上一篇文章中创建了此文件夹)。对于 Linux,请转到 /home/localhub
  • 创建 certs 文件夹。
  • 键入以下命令来生成自签名证书
    Windows/Linux:
    openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/localhub.key -x509 
    -days 365 -out certs/localhub.crt
  • 按下回车键后,它会问您一系列问题。回答所有问题,但“通用名称”除外。“通用名称”应与您的本地域名完全匹配,在我们的示例中是 hub.docker.local

  • 恭喜!您已为本地域名创建了自签名证书。

将自签名证书应用到仓库

只需重复您在应用 CA 证书时遵循的相同步骤,但使用新创建的证书文件。

  • 使用您的自签名 SSL 证书启动一个仓库容器
    Windows:
    docker run -d -p 443:443 --name local.hub -v C:/localhub/certs:/certs 
    -v C:/localhub/registry:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/localhub.crt 
    -e REGISTRY_HTTP_TLS_KEY=/certs/localhub.key registry
    
    Linux:
    docker run -d -p 443:443 --name local.hub -v /home/localhub/certs:/certs 
    -v /home/localhub/registry:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/localhub.local.crt 
    -e REGISTRY_HTTP_TLS_KEY=/certs/localhub.key registry
  • 确保您的仓库容器正在运行
    Windows/Linux:
    docker container ls
  • 使用以下命令从您的私有仓库推送/拉取镜像
    Windows/Linux:
    docker pull alpine
    docker tag alpine hub.docker.local/alpine
    docker push hub.docker.local/alpine
    docker rmi hub.docker.local/alpine
    docker images
    docker pull hub.docker.local/alpine
    docker images

  • 用浏览器检查目录 URL https://hub.docker.local/v2/_catalog,以确保您的仓库返回元数据。这次,您会收到一个关于无效证书的警告。

基本身份验证

到目前为止,我们已经了解了如何在网络上安全地共享私有仓库镜像,同时限制对内容的访问也很重要。在本节中,我们将介绍如何为您的私有仓库设置用户身份验证。请执行以下步骤以启用对您的私有仓库的用户身份验证,

  • 打开 PowerShell 控制台(Linux 中的终端)
  • 导航到 C:\localhub 文件夹(请记住我们在上一篇文章中创建了此文件夹)。对于 Linux,请转到 /home/localhub
  • 创建 auth 文件夹
  • 键入以下命令来生成用户配置文件
    Windows/Linux:
    docker run --entrypoint htpasswd registry -Bbn iniyan pass123
    
    It seems windows docker having issue when directly write the output into a file, 
    to avoid the issue copy the console output of above command without any space 
    and paste to a notepad, save to htpasswd(without any extension) file under C:\localhub\auth. 
    
    Linux:
    docker run --entrypoint htpasswd registry -Bbn iniyan pass123 > auth/htpasswd
  • 停止已在运行的仓库容器
    Windows/Linux:
    docker container stop local.hub
    docker container rm local.hub
  • 使用以下参数启动一个新的仓库容器
    Windows:
    docker run -d -p 443:443 --name local.hub -v C:/localhub/certs:/certs 
    -v C:/localhub/registry:/var/lib/registry -v C:/localhub/auth:/auth 
    -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" 
    -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/localhub.crt 
    -e REGISTRY_HTTP_TLS_KEY=/certs/localhub.key registry
    
    Linux:
    docker run -d -p 443:443 --name local.hub -v /home/localhub/certs:/certs 
    -v /home/localhub/registry:/var/lib/registry -v /home/localhub/auth:/auth 
    -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" 
    -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/localhub.crt 
    -e REGISTRY_HTTP_TLS_KEY=/certs/localhub.key registry
  • 确保您的仓库正在运行
    Windows/Linux:
    docker container ls
  • 现在,如果您尝试从私有仓库推送/拉取一个包,它将抛出连接被拒绝的错误
    Windows/Linux:
     docker pull hub.docker.local/alpine
  • 要修复上述错误,您需要使用 hub.docker.local 登录
    Windows/Linux:
     docker login hub.docker.local

  • 现在,如果您再次尝试相同的命令,它将完美运行

  • 当您尝试访问目录 URL https://hub.docker.local/v2/_catalog 时,它也会提示您登录

结论

在本文中,我们涵盖了如何使用 SSL 和用户身份验证来保护我们的私有仓库。感谢您阅读本文,希望您有所收获。请在下方分享您的宝贵意见。在下一篇文章中,我计划撰写关于“如何将您的仓库注册为服务?”的内容。

历史

  • 2018 年 10 月 17 日:初始版本
© . All rights reserved.