极狐GitLab 的 Gitaly 支持 TLS 加密。要与监听安全连接的 Gitaly 实例通信,请在极狐GitLab 配置的相应存储项的 gitaly_address 中使用 tls:// URL 方案。

极狐GitLab 的 Gitaly 在 TLS 连接中提供与客户端证书相同的服务器证书。当与验证客户端证书以授予访问极狐GitLab 权限的反向代理(例如 NGINX)结合使用时,这可以用作双向 TLS 身份验证策略的一部分。

您必须自行提供证书,因为这不是自动提供的。对应每个 Gitaly 服务器的证书必须安装在该 Gitaly 服务器上。

此外,证书(或其证书颁发机构)必须安装在所有:

  • Gitaly 服务器。
  • 与其通信的 Gitaly 客户端。

如果使用负载均衡器,它必须能够使用 ALPN TLS 扩展协商 HTTP/2。

证书要求

  • 证书必须指定用于访问 Gitaly 服务器的地址。您必须将主机名或 IP 地址作为证书的主题备用名称添加。
  • 您可以同时使用未加密的监听地址 listen_addr 和加密的监听地址 tls_listen_addr 配置 Gitaly 服务器。这允许您在必要时逐步从未加密流量过渡到加密流量。
  • 证书的公共名称字段被忽略。

使用 TLS 配置 Gitaly

{{< history >}}

  • 极狐GitLab 17.11 中引入了最小 TLS 版本配置选项。

{{< /history >}}

在配置 TLS 支持之前,配置 Gitaly

配置 TLS 支持的过程取决于您的安装类型。

{{< tabs >}}

{{< tab title=”Linux package (Omnibus)” >}}

  1. 为 Gitaly 服务器创建证书。
  2. 在 Gitaly 客户端上,将证书(或其证书颁发机构)复制到 /etc/gitlab/trusted-certs

    sudo cp cert.pem /etc/gitlab/trusted-certs/
    
  3. 在 Gitaly 客户端上,编辑 /etc/gitlab/gitlab.rb 中的 gitlab_rails['repositories_storages'] 如下:

    gitlab_rails['repositories_storages'] = {
      'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
      'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
      'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
    }
    
  4. 保存文件并重新配置极狐GitLab
  5. 在 Gitaly 服务器上,创建 /etc/gitlab/ssl 目录并将您的密钥和证书复制到那里:

    sudo mkdir -p /etc/gitlab/ssl
    sudo chmod 755 /etc/gitlab/ssl
    sudo cp key.pem cert.pem /etc/gitlab/ssl/
    sudo chmod 644 /etc/gitlab/ssl/cert.pem
    sudo chmod 600 /etc/gitlab/ssl/key.pem
    # 对于 Linux 包安装,'git' 是默认用户名。如果已从默认更改,请修改以下命令
    sudo chown -R git /etc/gitlab/ssl
    
  6. 将所有 Gitaly 服务器证书(或其证书颁发机构)复制到所有 Gitaly 服务器和客户端上的 /etc/gitlab/trusted-certs,以便 Gitaly 服务器和客户端在调用自身或其他 Gitaly 服务器时信任证书:

    sudo cp cert1.pem cert2.pem /etc/gitlab/trusted-certs/
    
  7. 编辑 /etc/gitlab/gitlab.rb 并添加:

    gitaly['configuration'] = {
       # ...
       tls_listen_addr: '0.0.0.0:9999',
       tls: {
         certificate_path: '/etc/gitlab/ssl/cert.pem',
         key_path: '/etc/gitlab/ssl/key.pem',
         ## Optionally configure the minimum TLS version Gitaly offers to clients.
         ##
         ## Default: "TLS 1.2"
         ## Options: ["TLS 1.2", "TLS 1.3"].
         #
         # min_version: "TLS 1.2"
       },
    }
    
  8. 保存文件并重新配置极狐GitLab
  9. 在 Gitaly 客户端(例如 Rails 应用程序)上运行 sudo gitlab-rake gitlab:gitaly:check 以确认它可以连接到 Gitaly 服务器。
  10. 通过观察 Gitaly 连接的类型验证 Gitaly 流量是否通过 TLS 传输。
  11. 可选。通过以下方式提高安全性:
    1. 通过注释或删除 /etc/gitlab/gitlab.rb 中的 gitaly['configuration'][:listen_addr] 来禁用非 TLS 连接。
    2. 保存文件。
    3. 重新配置极狐GitLab

{{< /tab >}}

{{< tab title=”Self-compiled (source)” >}}

  1. 为 Gitaly 服务器创建证书。
  2. 在 Gitaly 客户端上,将证书复制到系统信任证书中:

    sudo cp cert.pem /usr/local/share/ca-certificates/gitaly.crt
    sudo update-ca-certificates
    
  3. 在 Gitaly 客户端上,编辑 /home/git/gitlab/config/gitlab.yml 中的 storages 如下:

    gitlab:
      repositories:
        storages:
          default:
            gitaly_address: tls://gitaly1.internal:9999
            path: /some/local/path
          storage1:
            gitaly_address: tls://gitaly1.internal:9999
            path: /some/local/path
          storage2:
            gitaly_address: tls://gitaly2.internal:9999
            path: /some/local/path
    

    {{< alert type=”note” >}}

    /some/local/path 应设置为存在的本地文件夹,但该文件夹中不存储数据。

    {{< /alert >}}

  4. 保存文件并重启极狐GitLab
  5. 在 Gitaly 服务器上,创建或编辑 /etc/default/gitlab 并添加:

    export SSL_CERT_DIR=/etc/gitlab/ssl
    
  6. 在 Gitaly 服务器上,创建 /etc/gitlab/ssl 目录并将您的密钥和证书复制到那里:

    sudo mkdir -p /etc/gitlab/ssl
    sudo chmod 755 /etc/gitlab/ssl
    sudo cp key.pem cert.pem /etc/gitlab/ssl/
    sudo chmod 644 /etc/gitlab/ssl/cert.pem
    sudo chmod 600 /etc/gitlab/ssl/key.pem
    # 将所有权设置为运行 Gitaly 的相同用户
    sudo chown -R git /etc/gitlab/ssl
    
  7. 将所有 Gitaly 服务器证书(或其证书颁发机构)复制到系统信任证书文件夹,以便 Gitaly 服务器在调用自身或其他 Gitaly 服务器时信任证书。

    sudo cp cert.pem /usr/local/share/ca-certificates/gitaly.crt
    sudo update-ca-certificates
    
  8. 编辑 /home/git/gitaly/config.toml 并添加:

    tls_listen_addr = '0.0.0.0:9999'
    
    [tls]
    certificate_path = '/etc/gitlab/ssl/cert.pem'
    key_path = '/etc/gitlab/ssl/key.pem'
    
  9. 保存文件并重启极狐GitLab
  10. 通过观察 Gitaly 连接的类型验证 Gitaly 流量是否通过 TLS 传输。
  11. 可选。通过以下方式提高安全性:
    1. 通过注释或删除 /home/git/gitaly/config.toml 中的 listen_addr 来禁用非 TLS 连接。
    2. 保存文件。
    3. 重启极狐GitLab

{{< /tab >}}

{{< /tabs >}}

更新证书

在初始配置后更新 Gitaly 证书:

{{< tabs >}}

{{< tab title=”Linux package (Omnibus)” >}}

如果 /etc/gitlab/ssl 目录下的 SSL 证书内容已更新,但未对 /etc/gitlab/gitlab.rb 进行任何配置更改,则重新配置极狐GitLab 不会影响 Gitaly。相反,您必须手动重新启动 Gitaly,以便证书由 Gitaly 进程加载:

sudo gitlab-ctl restart gitaly

如果您在不更改 /etc/gitlab/gitlab.rb 文件的情况下更改或更新 /etc/gitlab/trusted-certs 中的证书,您必须:

  1. 重新配置极狐GitLab,以便更新信任证书的符号链接。
  2. 手动重新启动 Gitaly,以便证书由 Gitaly 进程加载:

    sudo gitlab-ctl restart gitaly
    

{{< /tab >}}

{{< tab title=”Self-compiled (source)” >}}

如果 /etc/gitlab/ssl 目录下的 SSL 证书内容已更新,您必须重启极狐GitLab,以便证书由 Gitaly 进程加载。

如果您更改或更新 /usr/local/share/ca-certificates 中的证书,您必须:

  1. 运行 sudo update-ca-certificates 以更新系统的信任存储。
  2. 重启极狐GitLab,以便证书由 Gitaly 进程加载。

{{< /tab >}}

{{< /tabs >}}

观察 Gitaly 连接的类型

有关观察提供的 Gitaly 连接类型的信息,请参阅相关文档