我需要让不受信任的用户、陌生人将其上传id_rsa.pub
到我的服务器和给定用户authorized_keys
(git
在我的例子中是用户)。无需手动执行任何操作即可实现这一目标的最安全方法是什么?
我特别考虑网络界面,但如果另一种方法有很强的优势,我愿意接受想法。
http 守护进程以 user 身份运行http
,并且git
不得容易受到用户的攻击http
,以防http
受到损害。
答案1
使用另一个进程作为中间人。您的网络服务(或其他服务)将新请求写入某处的假脱机中。中间人监视假脱机,删除新条目并进行健全性检查,并将有效内容附加到git
的authorized_keys 文件中。同一个中间人可以提供 Web 服务可以读取的反馈。但受感染的http
用户无法操纵中间人或 git 用户。你的中间人可以是一个守护进程,甚至是一个 cron 作业。
或者,由于您显然有坏主意:),我们可以利用以下事实:1)无论如何,用户git
都将拥有对其自己authorized_keys
文件的写访问权限,2)您对任何拥有 SSH 的人都可以接受访问用户git
。因此,由于您的http
用户属于“任何人”,因此请为您的http
用户提供一个 ssh 密钥对并将公钥添加到git
用户的授权密钥文件中。现在,您的 Web 服务可以简单地执行一个ssh -n git@localhost echo $key >> ~/.ssh/authorized_keys
.这里没有安全漏洞,因为具有 SSH 访问权限的陌生人无论如何都可以做到这一点。
如果您不希望您的开放访问git
用户能够获得 shell(因为安全性很重要,您知道),但如果您仍然允许git push
通过 SSH 发布,那么您可以通过以下方式获得真正的元数据:仅为公钥提交创建一个存储库。您的http
用户将拥有此存储库的克隆,并且您的 Web 服务将发出提交和推送。然后,服务器端挂钩可以对提交中的密钥进行健全性检查,并git
在验证后将其添加到用户的authorized_keys 文件中。
但我们假设这一切都以某种方式完成。您将拥有一个任何人都可以为您的用户授予自己 SSH 访问权限的系统git
。那么 SSH 身份验证到底有什么意义呢?你想让陌生人有 shell 访问权限吗?为什么不直接将git
用户密码清空并允许空密码呢?或者,如果您不希望这些用户除了通过 SSH 进行克隆的能力之外拥有任何其他功能,那么为什么不通过 http 或 git 协议为您的存储库提供服务来避免整个混乱呢?
答案2
既然您可以让不受信任的用户将其公钥添加到用户authorized_keys
的文件中git
,那么您不妨让他们知道 的密码git
。