![确定使用 AuthorizedKeyCommands 进行身份验证成功使用的密钥](https://linux22.com/image/654741/%E7%A1%AE%E5%AE%9A%E4%BD%BF%E7%94%A8%20AuthorizedKeyCommands%20%E8%BF%9B%E8%A1%8C%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E6%88%90%E5%8A%9F%E4%BD%BF%E7%94%A8%E7%9A%84%E5%AF%86%E9%92%A5.png)
作为OpenSSH 6.2,可以使用外部程序进行基于密钥对的身份验证的选项AuthorizedKeysCommand
。
根据sshd_config
手册页,该程序应该返回零行或多行输出authorized_keys
。
假设配置的程序返回多个密钥,有没有办法(比如说,在下游ForceCommand
)来确定哪个返回的密钥用于身份验证?
例如,如果每个密钥都有一个单独的用户,那么这种方法就很好用。但是,如果您共享一个用户(即“git”)并且想要使用守护进程ForceCommand
(在 sshd_config 中配置),那么您将失去哪个外部标识的用户以及哪个密钥用于身份验证的上下文。
Gitlab(和 Gitosis)做了类似的事情,它共享一个 'git' 用户,但将文件保留authorized_keys
给key_id
将命令行参数与其command=
选项关联起来这使得他们能够从外部确定权限。这似乎是他们将密钥认证与强制命令联系起来的方式。
这个解决方案在小规模上效果很好,但要扩展到数百万用户(比如 Github 拥有的)似乎是一场噩梦。
大规模、高可用性的 SSH 安装是否运行其自己的 OpenSSH 分支版本?我看不出如何在原始 OpenSSH 设置中链接文件AuthorizedKeysCommand
而不ForceCommand
维护(像动物一样)文件。
在此先感谢您的帮助!
答案1
AuthorizedKeysCommand
中的描述sshd_配置
应在标准输出上产生零行或多行 authorized_keys 输出
这意味着您可以生成一个command=
带有命令行参数(或任何其他有效authorized_key
选项)的选项。
例如,动态生成的行可能是这样的:
no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="/path/to/program arg1 arg2 arg3'" ssh-rsa bigHugeLongLongKey alias
感谢@kasperd 的指导!