{{< details >}}

  • Tier: 基础版,专业版,旗舰版
  • Offering: 私有化部署

{{< /details >}}

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

对标准化用户,您还可以使用SSH 证书。它们比数据库查找速度更快,但并不能直接替代authorized_keys文件。

{{< /alert >}}

当用户数量增加时,SSH 操作会变慢,因为 OpenSSH 进行线性搜索 authorized_keys 文件以认证用户。这个过程需要大量时间和磁盘 I/O,导致用户在尝试推送或拉取到仓库时产生延迟。如果用户频繁添加或移除密钥,操作系统可能无法缓存 authorized_keys 文件,这导致重复的磁盘读取。

与其使用 authorized_keys 文件,你可以配置极狐GitLab Shell 查找 SSH 密钥。因为查找在极狐GitLab 数据库中进行了索引,所以速度更快。

快速查找是 Geo 所需的

{{< details >}}

  • Tier: Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

{{< /details >}}

云原生 GitLab 不同,默认情况下 Linux 软件包安装会管理位于 git 用户主目录中的 authorized_keys 文件。对于大多数安装,这个文件位于 /var/opt/gitlab/.ssh/authorized_keys 下,但你可以使用以下命令在你的系统上定位 authorized_keys

getent passwd git | cut -d: -f6 | awk '{print $1"/.ssh/authorized_keys"}'

authorized_keys 文件包含所有允许访问极狐GitLab 的用户的公有 SSH 密钥。然而,为了保持单一的事实来源,Geo 必须配置为使用数据库查找执行 SSH 指纹查找。

当你设置 Geo 时,你必须遵循以下步骤来配置主节点和辅助节点。不要在主节点上选择 Write to authorized keys file,因为如果数据库复制正常工作,它会自动反映在辅助节点上。

设置快速查找

极狐GitLab Shell 提供了一种通过快速、索引查找极狐GitLab 数据库来授权 SSH 用户的方法。极狐GitLab Shell 使用 SSH 密钥的指纹来检查用户是否被授权访问极狐GitLab。

可以使用以下 SSH 服务器启用快速查找:

你可以通过为每个服务使用单独的端口来同时运行这两个服务。

使用 gitlab-sshd

要设置 gitlab-sshd,请参阅 gitlab-sshd 文档。启用 gitlab-sshd 后,极狐GitLab Shell 和 gitlab-sshd 被自动配置为使用快速查找。

使用 OpenSSH

前提条件:

  • 需要 OpenSSH 6.9 或更高版本,因为 AuthorizedKeysCommand 必须接受指纹。要检查你的版本,请运行 sshd -V

要使用 OpenSSH 设置快速查找:

  1. 将以下内容添加到你的 sshd_config 文件:

    Match User git    # 仅应用 AuthorizedKeysCommands 到 git 用户
      AuthorizedKeysCommand /opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell-authorized-keys-check git %u %k
      AuthorizedKeysCommandUser git
    Match all    # 结束匹配,设置重新应用到所有用户
    

    这个文件通常位于:

    • Linux 软件包安装:/etc/ssh/sshd_config
    • Docker 安装:/assets/sshd_config
    • 自编译安装:如果你遵循了从源码安装极狐GitLab Shell 的说明,命令应该位于 /home/git/gitlab-shell/bin/gitlab-shell-authorized-keys-check。考虑在别处创建一个包装脚本,因为这个命令必须由 root 拥有,并且不能被群组或其他人写入。此外,根据需要考虑更改该命令的所有权,但这可能需要在 gitlab-shell 升级期间进行临时所有权更改。
  2. 重新加载 OpenSSH:

    # Debian 或 Ubuntu 安装
    sudo service ssh reload
    
    # CentOS 安装
    sudo service sshd reload
    
  3. 确认 SSH 正常工作:

    1. authorized_keys 文件中注释掉用户的密钥。为此,请以 # 开始行。
    2. 从本地机器,尝试拉取一个仓库或运行:

      ssh -T git@gitlab.example.com
      

      成功的拉取或欢迎消息意味着极狐GitLab 在数据库中找到了密钥,因为文件中没有该密钥。

如果存在查找失败,authorized_keys 文件仍然会被扫描。对于许多用户,Git SSH 性能可能仍然缓慢,只要大文件存在。

为了解决这个问题,你可以禁用对 authorized_keys 文件的写操作:

  1. 确认 SSH 工作。这一步很重要,因为否则文件会迅速过时。
  2. 禁用对 authorized_keys 文件的写操作:

    1. 在左侧边栏底部,选择 管理员
    2. 选择 设置 > 网络
    3. 展开 性能优化
    4. 清除 使用 authorized_keys 文件认证 SSH 密钥 复选框。
    5. 选择 保存更改
  3. 验证更改:

    1. 在 UI 中移除你的 SSH 密钥。
    2. 添加一个新密钥。
    3. 尝试拉取一个仓库。
  4. 备份并删除你的 authorized_keys 文件。当前用户的密钥已经存在于数据库中,因此不需要迁移或用户重新添加他们的密钥。

如何恢复使用 authorized_keys 文件

此概述简短。请参考以上说明以获取更多上下文。

  1. 重建 authorized_keys 文件
  2. 启用对 authorized_keys 文件的写操作。
    1. 在左侧边栏底部,选择 管理员
    2. 在左侧边栏,选择 设置 > 网络
    3. 展开 性能优化
    4. 选择 使用 authorized_keys 文件认证 SSH 密钥 复选框。
  3. /etc/ssh/sshd_config/assets/sshd_config 中移除 AuthorizedKeysCommand 行(如果你使用 Docker 从 Linux 软件包安装)。
  4. 重新加载 sshdsudo service sshd reload

SELinux 支持

极狐GitLab 支持通过 SELinux 执行 authorized_keys 数据库查找。

由于 SELinux 策略是静态的,极狐GitLab 不支持更改内部 Web 服务器端口。管理员必须为环境创建一个特殊的 .te 文件,因为它不是动态生成的。

附加文档

关于 gitlab-sshd 的附加技术文档可以在极狐GitLab Shell 文档中找到。

故障排除

SSH 流量慢或 CPU 负载高

如果你的 SSH 流量慢或导致 CPU 负载高:

  • 检查 /var/log/btmp 的大小。
  • 确保它定期旋转,或者达到一定大小后旋转。

如果这个文件非常大,极狐GitLab SSH 快速查找可能会导致瓶颈更频繁地被击中,从而进一步降低性能。考虑禁用 sshd_config 中的 UsePAM 以避免完全读取 /var/log/btmp

在运行的 sshd: git 进程上运行 stracelsof 返回调试信息。要获取 IP x.x.x.x 上进行中的 Git over SSH 连接的 strace,运行:

sudo strace -s 10000 -p $(sudo netstat -tp | grep x.x.x.x | egrep 'ssh.*: git' | sed -e 's/.*ESTABLISHED *//' -e 's#/.*##')

或者获取运行中的 Git over SSH 进程的 lsof

sudo lsof -p $(sudo netstat -tp | egrep 'ssh.*: git' | head -1 | sed -e 's/.*ESTABLISHED *//' -e 's#/.*##')