本文最后更新于 550 天前,其中的信息可能已经有所发展或是发生改变。
在使用gitea的ssh协议操作远程仓库时,出现协议错误,报行长度字符串错误,展示的行长度字符串是This,这是nologin shell的输出,也就是运行gitea的用户使用的shell是禁止登录的nologin,所以无法使用ssh协议登录至系统。将shell改为sh后可以正常操作。
但是引入了一个问题,在gitea的web页面中,每一个用户都可以配置自己的ssh公钥,gitea会将这些公钥写入到gitea用户的.ssh/authorized_keys文件中,这意味着系统将会接受用户的公钥,允许它登录至系统。如果gitea用户的shell是交互式的shell,则任何人都可以得到交互式的shell,影响服务器安全。
深入了解之后,我发现这个问题是不存在的。因为gitea写入的公钥,带有一些修饰符:
command="/gitea/gitea-1.22.0-linux-amd64 --config=/gitea/custom/conf/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict
这些内容被gitea添加在公钥的前方,command中的内容是通过此公钥登录后将会执行的命令,这里执行了gitea的可执行文件,并传入了一些参数,应该是用于区分不同的用户。
而在这之后,则对此公钥施加了一些限制。
阻止了用户在登录时执行端口转发、X11 转发、代理转发和为 SSH 会话分配伪终端。
no-user-rc 禁止了用户的 shell 初始化文件(例如 .bashrc)的执行。
restrict 指定了这个密钥只能用于执行指定的命令,而不能进行一般的 shell 登录。
同时使用ssh来登录到gitea用户,被系统拒绝:

至此,所有疑惑已经全部解开。