OpenSSH与数据库中的公钥

是否有可能从数据库中获取公钥而不是authorized_keys文件?

我想用这样的设置来pipe理多个用户的git仓库的ssh访问,而不必每次更改或添加公钥时都重新创buildauthorized_keys文件。

我试图自己回答时发现了这个问题。 经过一番search和实验,我发现了一些其他的select。 自从马特·西蒙斯(Matt Simmons)报道之后,我将跳过关于分配密钥的部分。 另外,我知道有些时候这还不够好。 例如,如果您是GitHub,并且必须针对单个用户存储数百万个公钥,那么不断更新SSH authorized_keys文件并将其保持在数十到数百个边框之间的同步是不可行或不可取的。

所以,

  1. 首先,RedHat(和变体)有一个支持OpenSSH的补丁,添加了AuthorizedKeysCommandAuthorizedKeysCommandRunAs选项。 这个补丁已经在openssh 6.2上游合并了。 引用从手册页 :

    AuthorizedKeysCommand

    指定用于查找用户公钥的程序。 程序将被第一个参数调用被授权的用户的名字,并且应该在标准输出的AuthorizedKeys行上产生(参见sshd(8)中的AUTHORIZED_KEYS)。 默认情况下(或者当设置为空string时)没有运行AuthorizedKeysCommand。 如果AuthorizedKeysCommand未成功授权用户,授权将落入授权密钥文件。 请注意,只有打开PubkeyAuthentication,此选项才有效。

    AuthorizedKeysCommandRunAs

    指定在其帐户下运行AuthorizedKeysCommand的用户。 空string(默认值)表示使用被授权的用户。

    在今天晚上的实验中,我发现开箱即可,由于默认的SELinux策略,这是行不通的。 您可以通过setenforce 0closuresSELinux执行来解决这个问题。 由于转向SELinux可能是一个主意,相反,您可以生成正确的策略。 在我的情况下,就像尝试使用/etc/ssh/sshd_config设置的AuthorizedKeysCommand选项login一样简单,然后使用audit2allow -a -M local && semodule -i local.pp 。 这基本上审查审计日志,发现被阻止的事情,并为他们产生例外。 如果您可能还有其他可能被列入白名单的东西,那么您应该了解更多有关audit2allow ,以确保您获得新政策的audit2allow

  2. 还有其他各种(可能更less的testing和可信的)补丁来增加类似的function。 例如,有openssh-script-auth 。 你也可以findRedHat使用的补丁并直接应用。 谷歌search快速回合揭示https://launchpadlibrarian.net/89063205/openssh-5.3p1-authorized-keys-command.patch和https://launchpadlibrarian.net/105938151/openssh-authorized-keys-command.patch这是基于RH版本,但是已经针对较新版本的OpenSSH进行了更新。

  3. 补丁OpenSSH直接从一些商店(例如像GitHub和CodeBaseHQ等已完成)执行密钥查找。 据我所知,GitHub还没有开源这个补丁,但是我知道在过去我已经遇到了MySQL和PostgreSQL密钥查找的版本。 我试图再次find他们,但没有多less运气。

  4. 也有一些基于FUSE的选项。 例如,有一个LPKFuse ,它允许您通过将AuthorizedKeysFile位置更改为LPKFuse文件系统上的位置来从LDAP提供公钥。 LPKFuse FS创build虚拟文件,其内容由来自目录服务器的字段支持。


总而言之,我认为选项#1是最好的,因为它是由RedHat正式支持的。 此外,它可以让你把你喜欢的任何逻辑放到那个脚本中(包括和数据库交谈),用你想要的任何语言。

就我所知,OpenSSH没有这个能力。 最好的办法可能是让脚本每晚自动重新生成文件(或根据需要频繁重新生成)。

此外,你可能想看到这个问题: 一个分配SSH公钥的系统

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