简而言之:

想要一种通过LDAP进行SSH密钥身份验证的方法。

问题:

我们将LDAP(slapd)用于目录服务并且我们最近已经转向使用我们自己的AMI来构建实例。 AMI位很重要的原因是,理想情况下,我们希望能够在实例运行时立即通过密钥身份验证通过SSH登录,而不必等待我们速度稍慢的配置管理工具启动脚本来添加正确的实例密钥。

理想的情况是,将用户添加到LDAP时,我们也添加了他们的密钥,这样他们便可以立即登录。

必须进行密钥身份验证,因为基于密码的登录既安全性较低又麻烦。

我已经读过这个问题,它暗示有一个名为OpenSSH-lpk的OpenSSH补丁可以做到这一点,但这是OpenSSH服务器> = 6.2不再需要



添加了sshd_config(5)选项AuthorizedKeysCommand来支持
除了(或
之外,还可以从命令中获取authorized_keys的文件系统)。该命令在AuthorizedKeysCommandUser sshd_config(5)选项指定的帐户下运行



如何配置OpenSSH和LDAP来实现此命令?

#1 楼

更新LDAP以包含OpenSSH-LPK模式

我们首先需要使用一个模式来更新LDAP以为用户添加sshPublicKey属性:

dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
    DESC 'MANDATORY: OpenSSH Public key'
    EQUALITY octetStringMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
    DESC 'MANDATORY: OpenSSH LPK objectclass'
    MAY ( sshPublicKey $ uid )
    )


创建一个查询LDAP以获取用户公钥的脚本:

脚本应输出该用户的公钥,例如:

ldapsearch '(&(objectClass=posixAccount)(uid='""'))' '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服务器进行密码身份验证

有用的链接:


https:/ /github.com/AndriiGrytsenko/openssh-ldap-publickey
使用pam_ldap的私钥身份验证

编辑:建议用户添加TR43-qq12079q

评论


尽管我建议AuthorizedKeysCommandUser不用root而不是任何人,这真是太棒了。

– TRS-80
15年3月27日在12:14

我的ldapsearch或sed一定有所不同,因为将输出管道传输到您在那里的sed black magic命令中,即使我的普通ldapsearch命令正在返回数据,也没有输出。我将不得不编写脚本来清理输出,而不是使用sed。

–克里斯L
15年6月23日在20:34

忽略我先前的评论。我的问题是由sshPublicKey属性中的尾随换行符引起的,而后者又使ldapsearch对base64进行编码。我简化了sed命令:ldapsearch -u -LLL -o ldif-wrap = no'(&&(objectClass = posixAccount)(uid ='“ $ 1”'))''sshPublicKey'| sed -n's / ^ [\ t] * sshPublicKey:[\ t] * \(。* \)/ \ 1 / p'

–克里斯L
2015年6月23日在20:45



@Chris确实不如黑魔法,但sed仍然是一次写入,1路哈希函数;)

–Froyke
15年8月24日在23:19

在我的OpenSSH版本(5.3p1-122.el6)中,存在AuthorizedKeysCommandRunAs而不是AuthorizedKeysCommandUser

– mveroone
17年6月16日在15:25

#2 楼

这不是完整的答案,只是c4urself答案的补充。我本来可以将此添加为评论,但是我没有足够的声誉来发表评论,所以请不要投票!

这是我用于AuthorizedKeysCommand的脚本(基于c4urself的版)。无论该值是否以base64编码返回,它都有效。如果要在LDAP中存储多个授权密钥,这特别有用-只需用换行符分隔密钥即可,类似于authorized_keys文件。

#!/bin/bash
set -eou pipefail
IFS=$'\n\t'

result=$(ldapsearch '(&(objectClass=posixAccount)(uid='""'))' 'sshPublicKey')
attrLine=$(echo "$result" | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;/sshPublicKey:/p')

if [[ "$attrLine" == sshPublicKey::* ]]; then
  echo "$attrLine" | sed 's/sshPublicKey:: //' | base64 -d
elif [[ "$attrLine" == sshPublicKey:* ]]; then
  echo "$attrLine" | sed 's/sshPublicKey: //'
else
  exit 1
fi


评论


没必要objectClass:ldapPublicKey支持在sshPublicKey中存储多个值-无需换行符(触发base64编码)。因此,如果您有多个ssh-key,请将每个ssh-key存储在它自己的sshPublicKey属性值中,那么可接受的答案脚本将生成正确的多行输出。

– colm.anseo
20/09/11 '21:43

#3 楼

对于在运行ldapsearch时遇到错误的任何人:

sed: 1: "/^ /{H;d};": extra characters at the end of d command


和我一样(在FreeBSD上),解决方法是将第一个sed命令更改为:

/^ /{H;d;};


(在'd'之后添加分号)。

#4 楼

只是想分享我的“方法”,我的客户端是Debian / Ubuntu特有的,但是我的服务器端与上面的基本相同,只是带有更多的“ HowTo:”。

服务器:

启用公钥属性:

信用:

https://blog.shichao.io/2015/04/17/setup_openldap_server_with_openssh_lpk_on_ubuntu.html

cat << EOL >~/openssh-lpk.ldif
dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME 'sshPublicKey'
  DESC 'MANDATORY: OpenSSH Public key'
  EQUALITY octetStringMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME 'ldapPublicKey' SUP top AUXILIARY
  DESC 'MANDATORY: OpenSSH LPK objectclass'
  MAY ( sshPublicKey $ uid )
  )
EOL


现在使用它来添加ldif:

ldapadd -Y EXTERNAL -H ldapi:/// -f ~/openssh-lpk.ldif


在phpLDAPadmin中添加具有SSH公钥的用户
/>
首先,使用“通用:用户帐户”模板创建一个用户。然后,转到“ objectClass”属性部分,单击“添加值”,然后选择“ ldapPublicKey”属性。提交后,返回到用户编辑页面,单击顶部的“添加新属性”,然后选择“ sshPublicKey”,将公钥粘贴到文本区域,最后单击“更新对象”。”

sshPublicKey属性未显示-OpenLDAP PHPLDAP SSH密钥验证

Ubuntu客户端:

apt-get -y install python-pip python-ldap
pip install ssh-ldap-pubkey
sh -c 'echo "AuthorizedKeysCommand /usr/local/bin/ssh-ldap-pubkey-wrapper\nAuthorizedKeysCommandUser nobody" >> /etc/ssh/sshd_config' && service ssh restart


创建测试密钥:

ssh-keygen -t rsa