Answers:
我自己回答时发现了这个问题。经过一些搜索和试验,我找到了其他一些选择。我将跳过有关分发密钥作为替代方案的部分,因为Matt Simmons讨论了这一点。另外,我知道有时候这还不够好。例如,如果您是GitHub,并且必须针对单个用户存储数百万个公共密钥,则不可行或不希望连续更新SSHauthorized_keys文件并使它们在数十个到数百个边缘盒之间保持同步。
所以,
首先,RedHat(和变体)具有OpenSSH受支持的补丁,其中添加了AuthorizedKeysCommand
和AuthorizedKeysCommandRunAs
选项。该补丁已在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
确保正确制定新政策的信息。
还有其他各种(可能经过较少测试和信任的补丁)可以添加类似的功能。例如,openssh-script-auth。您还可以找到RedHat使用的补丁并直接应用。谷歌搜索的快速回合揭示https://launchpadlibrarian.net/89063205/openssh-5.3p1-authorized-keys-command.patch和https://launchpadlibrarian.net/105938151/openssh-authorized-keys-command.patch这是基于RH版本,但已针对OpenSSH的较新版本进行了更新。
修补OpenSSH以直接从某些商店执行键查找(例如GitHub和CodeBaseHQ等)。据我所知,GitHub尚未开源此补丁,但我知道过去我遇到过MySQL和PostgreSQL键查找的版本。我刚刚尝试再次找到它们,但是运气不高。
还有一些基于FUSE的选项。例如,有一个LPKFuse,通过AuthorizedKeysFile
将LPKFuse文件系统上的位置更改为一个,您可以从LDAP提供公共密钥。LPKFuse FS创建虚拟文件,其内容由目录服务器中的字段支持。
总而言之,我认为选项1迄今为止是最好的,因为RedHat正式支持它。此外,它允许您以所需的任何语言在脚本中添加任何喜欢的逻辑(包括与数据库对话)。
据我所知,OpenSSH没有此功能。最好的选择是让脚本每晚(或根据需要频繁)自动重新生成文件。
另外,您可能希望看到以下问题: 用于分发SSH公钥的系统