使用 LDAP 进行 SSH 密钥验证

使用 LDAP 进行 SSH 密钥验证

简而言之:

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

问题:

我们使用 LDAP (slapd) 提供目录服务,最近我们已开始使用自己的 AMI 来构建实例。AMI 位之所以重要,是因为:理想情况下,我们希望能够在实例运行时立即通过密钥认证使用 SSH 登录,而不必等待我们有点慢的配置管理工具启动脚本以将正确的密钥添加到实例。

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

密钥认证是必须因为基于密码的登录既不太安全又很麻烦。

我读了这个问题这表明 OpenSSH 有一个名为 OpenSSH-lpk 的补丁可以执行此操作,但对于 >= 6.2 的 OpenSSH 服务器,不再需要它

添加了 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='"$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

答案2

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

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

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

result=$(ldapsearch '(&(objectClass=posixAccount)(uid='"$1"'))' '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

答案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 公钥添加用户

首先,使用“Generic: User Account”模板创建一个用户。然后,转到“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

相关内容