是否可以从数据库而不是authorized_keys文件中获取公钥?
我想使用这样的设置来管理多个用户对 git 存储库之类的 ssh 访问,而无需在每次更改或添加公钥时重新创建 authorized_keys 文件。
答案1
我在尝试自己回答时发现了这个问题。经过一番搜索和试验,我发现了其他一些解决方案。我将跳过有关分发密钥作为替代方案的部分,因为 Matt Simmons 已经介绍了这一点。另外,我知道有时这样做不是足够好了。例如,如果您是 GitHub,并且必须为单个用户存储数百万个公钥,则不断更新 SSH authorized_keys 文件并使其在可能数十到数百个边缘盒之间保持同步是不切实际或不可取的。
所以,
首先,RedHat(及其变体)有一个支持 OpenSSH 的补丁,其中添加了
AuthorizedKeysCommand
和AuthorizedKeysCommandRunAs
选项。该补丁已合并到 openssh 6.2 的上游。引用手册页:授权密钥命令
指定用于查找用户公钥的程序。该程序将以其第一个参数被授权的用户的名称来调用,并应在标准输出 AuthorizedKeys 行上生成(请参阅 sshd(8) 中的 AUTHORIZED_KEYS)。默认情况下(或设置为空字符串时),不会运行 AuthorizedKeysCommand。如果 AuthorizedKeysCommand 未成功授权用户,则授权将转交给 AuthorizedKeysFile。请注意,此选项仅在启用 PubkeyAuthentication 时才有效。
授权密钥命令运行方式
指定在其帐户下运行 AuthorizedKeysCommand 的用户。空字符串(默认值)表示使用被授权的用户。
在今晚的实验中,我发现,由于默认的 SELinux 策略,开箱即用,这不起作用。您可以通过使用 关闭 SELinux 强制执行来解决这个问题
setenforce 0
。由于关闭 SELinux 可能是一种坏的想法,你可以生成正确的策略。就我而言,这很简单尝试AuthorizedKeysCommand
使用中设置的选项登录/etc/ssh/sshd_config
,然后使用audit2allow -a -M local && semodule -i local.pp
。这基本上会查看审计日志并找到被阻止的内容并为它们生成例外。如果您可能在其中有其他可能被列入白名单的内容,您可能应该了解更多信息,audit2allow
以确保您获得正确的新策略。还有其他各种补丁(可能测试较少且不太可信)可以添加类似的功能。例如,openssh-脚本-身份验证。您还可以找到 RedHat 使用的补丁并直接应用。快速谷歌搜索发现https://launchpadlibrarian.net/89063205/openssh-5.3p1-authorized-keys-command.patch和https://launchpadlibrarian.net/105938151/openssh-authorized-keys-command.patch它们基于 RH 版本,但已针对较新版本的 OpenSSH 进行了更新。
修补 OpenSSH 以直接从某些存储中执行密钥查找(例如GitHubCodeBaseHQ 和其他公司已经完成了此工作)。据我所知,GitHub 尚未开源此补丁,但我知道过去我曾遇到过 MySQL 和 PostgreSQL 密钥查找版本。我刚才试图再次找到它们,但运气不佳。
还有一些基于 FUSE 的选项。例如LPK保险丝通过将位置更改为 LPKFuse 文件系统上的位置,您可以从 LDAP 提供公钥
AuthorizedKeysFile
。LPKFuse FS 创建虚拟文件,其内容由目录服务器中的字段支持。
总而言之,我认为选项 #1 是迄今为止最好的,因为它得到了 RedHat 的正式支持。此外,它还允许您以任何语言在该脚本中放入您喜欢的任何逻辑(包括与数据库对话)。
答案2
据我所知,OpenSSH 没有此功能。最好的办法可能是让脚本每晚自动重新生成文件(或根据需要频繁生成)。
另外,你可能想看看这个问题: SSH 公钥分发系统
答案3
我相信在较新的 openssh 版本中,您可以将密钥存储在用户 LDAP 条目中。如果您已经使用 LDAP 或 AD 进行帐户管理,那么您应该也能够利用它进行密钥管理。