解决 GitLab 在启用 SELinux 时无法使用 SSH 密钥拉取和推送的问题
后知后觉 暂无评论

在 Self-Managed GitLab 环境中,在启用了 Fast lookup of authorized SSH keys 的情况下,依然无法使用 SSH 密钥进行推送和拉取代码。

配置密钥也依然无法推送,会继续提示输入密码:

$ git push --set-upstream origin --all
git@git-hk.vvave.net's password:

最初是怀疑环境配置错误,在反复检查后并未发现问题,此时想到此环境是使用官方镜像全新安装的 AlmaLinux 9 实例,和云镜像不同的是,SELinux 等并不会被默认关闭。

问题溯源

命令查询 SELinux 状态,结果确实是没有关闭。

$ sudo sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      33

那么可以继续查看审查日志 /var/log/audit/audit.log,看看是不是请求被拦截导致的,可以看到大量类似:

type=AVC msg=audit(1745223505.142:944): avc:  denied  { connectto } for  pid=22062 comm="gitlab-shell-au" path="/var/opt/gitlab/gitlab-workhorse/sockets/socket" scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:system_r:unconfined_service_t:s0 tclass=unix_stream_socket permissive=0
type=SYSCALL msg=audit(1745223505.142:944): arch=c000003e syscall=42 success=no exit=-13 a0=7 a1=c0001fea90 a2=32 a3=0 items=0 ppid=22060 pid=22062 auid=4294967295 uid=994 gid=991 euid=994 suid=994 fsuid=994 egid=991 sgid=991 fsgid=991 tty=(none) ses=4294967295 comm="gitlab-shell-au" exe="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell-authorized-keys-check" subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 key=(null)ARCH=x86_64 SYSCALL=connect AUID="unset" UID="git" GID="git" EUID="git" SUID="git" FSUID="git" EGID="git" SGID="git" FSGID="git"
type=PROCTITLE msg=audit(1745223505.142:944): proctitle=2F6F70742F6769746C61622F656D6265646465642F736572766963652F6769746C61622D7368656C6C2F62696E2F6769746C61622D7368656C6C2D617574686F72697A65642D6B6579732D636865636B0067697400676974004141414143334E7A6143316C5A4449314E544535414141414946687049434B3452454556707472
type=AVC msg=audit(1745223507.144:945): avc:  denied  { connectto } for  pid=22062 comm="gitlab-shell-au" path="/var/opt/gitlab/gitlab-workhorse/sockets/socket" scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:system_r:unconfined_service_t:s0 tclass=unix_stream_socket permissive=0
type=SYSCALL msg=audit(1745223507.144:945): arch=c000003e syscall=42 success=no exit=-13 a0=7 a1=c0000ca690 a2=32 a3=0 items=0 ppid=22060 pid=22062 auid=4294967295 uid=994 gid=991 euid=994 suid=994 fsuid=994 egid=991 sgid=991 fsgid=991 tty=(none) ses=4294967295 comm="gitlab-shell-au" exe="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shell-authorized-keys-check" subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 key=(null)ARCH=x86_64 SYSCALL=connect AUID="unset" UID="git" GID="git" EUID="git" SUID="git" FSUID="git" EGID="git" SGID="git" FSGID="git"
type=PROCTITLE msg=audit(1745223507.144:945): proctitle=2F6F70742F6769746C61622F656D6265646465642F736572766963652F6769746C61622D7368656C6C2F62696E2F6769746C61622D7368656C6C2D617574686F72697A65642D6B6579732D636865636B0067697400676974004141414143334E7A6143316C5A4449314E544535414141414946687049434B3452454556707472
type=USER_AUTH msg=audit(1745223507.145:946): pid=22060 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:sshd_t:s0-s0:c0.c1023 msg='op=pubkey acct="git" exe="/usr/sbin/sshd" hostname=? addr=172.16.16.213 terminal=ssh res=failed'UID="root" AUID="unset"

可以看到确实为 SSH 请求被拦截导致的。

解决问题

参考红帽官方文档,可以使用 audit2allow 工具生成自定义 SELinux 规则:

sudo -i
cat /var/log/audit/audit.log | audit2allow -a -M gitlab

小贴士:需要注意看到类似下方的提示才可以继续操作

******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i gitlab.pp

如果看到类似报错:

compilation failed:
gitlab.te:6:ERROR 'syntax error' at token '' on line 6:


/usr/bin/checkmodule:  error(s) encountered while parsing configuration

需要在测试环境多推送几次代码,采集一些错误日志,然后使用命令生成规则。

然后应用规则:

semodule -i gitlab.pp

附录

参考链接

如果遇到问题或者对文章内容存疑,请在下方留言,博主看到后将及时回复,谢谢!
回复 / 查看「历史评论
回答49+37=