带有来自数据库的公共密钥的OpenSSH


14

是否可以从数据库而不是authorized_keys文件中获取公共密钥?

我想使用这样的设置来管理ssh对多个用户的git存储库之类的访问,而无需每次更改或添加公共密钥时都重新创建authorized_keys文件。


1
我为此使用木偶
Matt Simmons

Userify可以通过集中管理但可以通过本地身份验证来管理这些帐户。这样,如果您的集中数据库出现故障,您仍然可以进入,但是您可以获得集中管理的所有好处。
杰米森·贝克尔

Answers:


16

我自己回答时发现了这个问题。经过一些搜索和试验,我找到了其他一些选择。我将跳过有关分发密钥作为替代方案的部分,因为Matt Simmons讨论了这一点。另外,我知道有时候这还不够好。例如,如果您是GitHub,并且必须针对单个用户存储数百万个公共密钥,则不可行或不希望连续更新SSHauthorized_keys文件并使它们在数十个到数百个边缘盒之间保持同步。

所以,

  1. 首先,RedHat(和变体)具有OpenSSH受支持的补丁,其中添加了AuthorizedKeysCommandAuthorizedKeysCommandRunAs选项。该补丁已在openssh 6.2上游合并。引用手册页

    AuthorizedKeysCommand

    指定用于查找用户公钥的程序。该程序将使用其第一个参数调用被授权用户的名称,并应在标准输出的AuthorizedKeys行上产生(请参见sshd(8)中的AUTHORIZED_KEYS)。默认情况下(或设置为空字符串时),不会运行AuthorizedKeysCommand。如果AuthorizedKeysCommand没有成功授权用户,则授权将落到AuthorizedKeysFile中。请注意,此选项仅在打开PubkeyAuthentication时有效。

    AuthorizedKeysCommandRunAs

    指定以其帐户运行AuthorizedKeysCommand的用户。空字符串(默认值)表示正在使用被授权的用户。

    在今晚的实验中,我发现开箱即用由于默认的SELinux策略而无法使用。您可以通过使用关闭SELinux强制实施来解决此问题setenforce 0。由于转向SELinux可能不是一个主意,因此您可以生成正确的策略。就我而言,这就像尝试使用AuthorizedKeysCommand设置的选项登录/etc/ssh/sshd_config然后使用一样简单audit2allow -a -M local && semodule -i local.pp。这基本上是通过审核日志进行查找,查找被阻止的内容并为其生成异常。如果您可能还有其他列入白名单的内容,则可能应该了解更多有关audit2allow确保正确制定新政策的信息。

  2. 还有其他各种(可能经过较少测试和信任的补丁)可以添加类似的功能。例如,openssh-script-auth。您还可以找到RedHat使用的补丁并直接应用。谷歌搜索的快速回合揭示https://launchpadlibrarian.net/89063205/openssh-5.3p1-authorized-keys-command.patchhttps://launchpadlibrarian.net/105938151/openssh-authorized-keys-command.patch这是基于RH版本,但已针对OpenSSH的较新版本进行了更新。

  3. 修补OpenSSH以直接从某些商店执行键查找(例如GitHub和CodeBaseHQ等)。据我所知,GitHub尚未开源此补丁,但我知道过去我遇到过MySQL和PostgreSQL键查找的版本。我刚刚尝试再次找到它们,但是运气不高。

  4. 还有一些基于FUSE的选项。例如,有一个LPKFuse,通过AuthorizedKeysFile将LPKFuse文件系统上的位置更改为一个,您可以从LDAP提供公共密钥。LPKFuse FS创建虚拟文件,其内容由目录服务器中的字段支持。


总而言之,我认为选项1迄今为止是最好的,因为RedHat正式支持它。此外,它允许您以所需的任何语言在脚本中添加任何喜欢的逻辑(包括与数据库对话)。


回复:#1好发现!我希望它可以上游,在ESXi中会很方便。
詹森·谭

@JasonTan:AuthorizedKeysCommand在openssh 6.2中进入上游。我也更新了答案以反映这一点。
Bluewind 2014年

好的答案,选择1正是我想要的。
Shane Kilkelly


1

我相信,在较新的openssh版本中,您可以将密钥存储在用户LDAP条目中。如果您已经使用LDAP或AD进行帐户管理,那么您也应该能够将其用于密钥管理。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.