{{< 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
- OpenSSH
你可以通过为每个服务使用单独的端口来同时运行这两个服务。
使用 gitlab-sshd
要设置 gitlab-sshd
,请参阅 gitlab-sshd
文档。启用 gitlab-sshd
后,极狐GitLab Shell 和 gitlab-sshd
被自动配置为使用快速查找。
使用 OpenSSH
前提条件:
- 需要 OpenSSH 6.9 或更高版本,因为
AuthorizedKeysCommand
必须接受指纹。要检查你的版本,请运行sshd -V
。
要使用 OpenSSH 设置快速查找:
-
将以下内容添加到你的
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
升级期间进行临时所有权更改。
- Linux 软件包安装:
-
重新加载 OpenSSH:
# Debian 或 Ubuntu 安装 sudo service ssh reload # CentOS 安装 sudo service sshd reload
-
确认 SSH 正常工作:
- 在
authorized_keys
文件中注释掉用户的密钥。为此,请以#
开始行。 -
从本地机器,尝试拉取一个仓库或运行:
ssh -T git@gitlab.example.com
成功的拉取或欢迎消息意味着极狐GitLab 在数据库中找到了密钥,因为文件中没有该密钥。
- 在
如果存在查找失败,authorized_keys
文件仍然会被扫描。对于许多用户,Git SSH 性能可能仍然缓慢,只要大文件存在。
为了解决这个问题,你可以禁用对 authorized_keys
文件的写操作:
- 确认 SSH 工作。这一步很重要,因为否则文件会迅速过时。
-
禁用对
authorized_keys
文件的写操作:- 在左侧边栏底部,选择 管理员。
- 选择 设置 > 网络。
- 展开 性能优化。
- 清除 使用
authorized_keys
文件认证 SSH 密钥 复选框。 - 选择 保存更改。
-
验证更改:
- 在 UI 中移除你的 SSH 密钥。
- 添加一个新密钥。
- 尝试拉取一个仓库。
- 备份并删除你的
authorized_keys
文件。当前用户的密钥已经存在于数据库中,因此不需要迁移或用户重新添加他们的密钥。
如何恢复使用 authorized_keys
文件
此概述简短。请参考以上说明以获取更多上下文。
-
重建
authorized_keys
文件。 - 启用对
authorized_keys
文件的写操作。- 在左侧边栏底部,选择 管理员。
- 在左侧边栏,选择 设置 > 网络。
- 展开 性能优化。
- 选择 使用
authorized_keys
文件认证 SSH 密钥 复选框。
- 从
/etc/ssh/sshd_config
或/assets/sshd_config
中移除AuthorizedKeysCommand
行(如果你使用 Docker 从 Linux 软件包安装)。 - 重新加载
sshd
:sudo 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
进程上运行 strace
和 lsof
返回调试信息。要获取 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#/.*##')