Help us learn about your current experience with the documentation. Take the survey.

Gitaly TLS 支持

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

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

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

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

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

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

证书要求

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

为 Gitaly 配置 TLS

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

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

  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',
         ## 可选配置 Gitaly 向客户端提供的最小 TLS 版本。
         ##
         ## 默认值:"TLS 1.2"
         ## 选项:["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
  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,将 gitaly_address 更改为使用 TLS 地址。例如:

    gitlab:
      repositories:
        storages:
          default:
            gitaly_address: tls://gitaly1.internal:9999
            gitaly_token: AUTH_TOKEN_1
          storage1:
            gitaly_address: tls://gitaly1.internal:9999
            gitaly_token: AUTH_TOKEN_1
          storage2:
            gitaly_address: tls://gitaly2.internal:9999
            gitaly_token: AUTH_TOKEN_2
  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

更新证书

初始配置后更新 Gitaly 证书:

如果 /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

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

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

  1. 运行 sudo update-ca-certificates 更新系统信任存储。
  2. 重启 GitLab 以使证书被 Gitaly 进程加载。

观察 Gitaly 连接类型

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