简而言之:
想要一种通过 LDAP 进行 SSH 密钥身份验证的方法。
问题:
我们将 LDAP (slapd) 用于目录服务,并且我们最近开始使用我们自己的 AMI 来构建实例。AMI 位很重要的原因是,理想情况下,我们希望能够在实例运行后立即通过密钥身份验证使用 SSH 登录,而不必等待我们有点慢的配置管理工具启动脚本来添加实例的正确键。
理想的情况是,当将用户添加到 LDAP 时,我们也添加了他们的密钥,他们将能够立即登录。
密钥身份验证是必须的,因为基于密码的登录既不安全又麻烦。
我已经阅读了这个问题,它表明 OpenSSH 有一个名为 OpenSSH-lpk 的补丁可以执行此操作,但 OpenSSH 服务器 >= 6.2 不再需要此补丁
添加了 sshd_config(5) 选项 AuthorizedKeysCommand 以支持从文件系统中获取授权密钥(或代替)从命令中获取。该命令在 AuthorizedKeysCommandUser sshd_config(5) 选项指定的帐户下运行
如何配置 OpenSSH 和 LDAP 来实现这一点?
更新 LDAP 以包含 OpenSSH-LPK 架构
我们首先需要使用模式更新 LDAP 以添加
sshPublicKey
用户属性:创建一个脚本,在 LDAP 中查询用户的公钥:
该脚本应输出该用户的公钥,例如:
ldapsearch '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'
更新
sshd_config
以指向上一步中的脚本AuthorizedKeysCommand /path/to/script
AuthorizedKeysCommandUser nobody
奖励:更新
sshd_config
以允许来自内部 RFC1918 网络的密码身份验证,如本问题所示:只允许从内部网络对 SSH 服务器进行密码验证
有用的链接:
编辑:
nobody
按照建议的 TRS-80添加用户这不是一个完整的答案,只是对c4urself 的答案的补充。我会将此添加为评论,但我没有足够的声誉发表评论,所以请不要投反对票!
这是我使用的脚本
AuthorizedKeysCommand
(基于 c4urself 的版本)。无论该值是否以 base64 编码返回,它都有效。如果您想在 LDAP 中存储多个授权密钥,这可能特别有用——只需用换行符分隔密钥,类似于 authorized_keys 文件。对于在运行 ldapsearch 时遇到错误的任何人:
和我一样(在 FreeBSD 上),解决方法是将第一个 sed 命令更改为:
(在“d”之后添加分号)。
只是想分享我的“方法”,我的客户端是 Debian/Ubuntu 特定的,但我的服务器端与上面基本相同,但多了一点“HowTo:”
服务器 :
启用公钥属性:
信用 :
https://blog.shichao.io/2015/04/17/setup_openldap_server_with_openssh_lpk_on_ubuntu.html
现在使用它来添加 ldif :
在 phpLDAPadmin 中添加具有 SSH 公钥的用户
首先,使用“通用:用户帐户”模板创建一个用户。然后,进入“objectClass”属性部分,点击“add value”,选择“ldapPublicKey”属性。提交后,回到用户编辑页面,点击顶部的“添加新属性”,选择“sshPublicKey”,将公钥粘贴到文本区域,最后点击“更新对象”。
sshPublicKey 属性未显示 - OpenLDAP PHPLDAP SSH 密钥验证
Ubuntu客户端:
创建测试密钥: