Gitaly TLS 支持

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

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

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

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

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

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

证书要求

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

使用 TLS 配置 Gitaly

配置 Gitaly 之前,先配置 TLS 支持。

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

::Tabs

:::TabTitle 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 中的 git_data_dirs 如下:

    git_data_dirs({
      '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',
       },
    }
    
  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

:::TabTitle 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
    
    note /some/local/path 应设置为存在的本地文件夹,但不会在此文件夹中存储数据。
  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

::EndTabs

更新证书

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

::Tabs

:::TabTitle Linux package (Omnibus)

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

sudo gitlab-ctl restart gitaly

如果在 /etc/gitlab/trusted-certs 中更改或更新了证书而未对 /etc/gitlab/gitlab.rb 文件进行更改,您必须:

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

    sudo gitlab-ctl restart gitaly
    

:::TabTitle Self-compiled (source)

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

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

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

::EndTabs

观察 Gitaly 连接类型

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