我在虚拟机中运行 gitea,并在网络中使用 kerberos 进行 SSH 身份验证。 就目前情况而言:
foo
)foo
和gitea
。后者是运行gitea进程的用户。为了 ssh 进入服务器,我获得一个 TGT 作为主体
foo@LOCALDOMAIN
,这允许我以 foo
的身份 ssh 进入 gitea 服务器。我还在 .k5login
用户的主目录中添加了一个 gitea
文件,将 foo@LOCALDOMAIN
指定为有效主体,这意味着我还可以使用此主体作为 gitea
用户向服务器进行身份验证。
因此,我希望能够与上游 URL 为:
[email protected]:foo/repo_name.git
的 gitea 存储库进行交互。相反,在获取 TGT 之前,错误是:
[email protected]: Permission denied (publickey,gssapi-with-mic).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
并且获取TGT后,错误是:
fatal: 'foo/repo_name.git' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
在获取TGT之前,错误是:
[email protected]: Permission denied (publickey,gssapi-with-mic).
这很正常,因为您没有 TGT(以及 host/gitea.localdomain 的服务票证),因此无法通过 Kerberos 进行身份验证。
并且获取TGT后,错误是:
fatal: 'foo/repo_name.git' does not appear to be a git repository
发生这种情况是因为这些存储库实际上并不直接存在于
~gitea/
主目录中。公钥身份验证在这里还有一个额外的目的:~gitea/.ssh/authorized_keys
文件的每个密钥都有一个自定义命令,这会强制您的远程“git”命令通过包装脚本 - 该脚本将 Git 操作重定向到另一个位置,并且当不同的 Gitea 用户都通过相同的 SSH 帐户进入时,服务器如何区分这些用户(即包装器脚本强制执行每个存储库的权限)。
但是当您使用 GSSAPI 身份验证时,这一切都被绕过了。
为了在这里使用 Kerberos,您需要一个自定义包装器 - 通过全局
sshd_config
为 gitea 用户定义 - 它将查看 $SSH_USER_AUTH
并相应地运行 Gitea 包装器。
GSSAPIAuthentication yes
ExposeAuthInfo yes
[...]
Match user gitea
ForceCommand /usr/local/bin/kerbgitea
(就我个人而言,在单用户系统中,我不使用 Gitea 或类似的东西;只是直接访问存储库。)