使用LDAP的SSH密钥authentication

简而言之:

想通过LDAP做一个SSH密钥validation的方法。

问题:

我们使用LDAP(slapd)作为目录服务,最近我们转而使用自己的AMI来构build实例。 AMI位的重要性在于, 理想情况下 ,只要实例运行,我们希望能够通过密钥身份validation使用SSH进行login,而不必等待稍慢的configurationpipe理工具启动脚本以添加实例的正确密钥。

理想的情况是,当向LDAP添加用户时,我们也添加他们的密钥,他们将立即能够login。

密钥authentication是必须的,因为基于密码的login既不安全又麻烦。

我读过这个问题 ,这表明OpenSSH有一个补丁OpenSSH-lpk来做这个,但是OpenSSH服务器不再需要这个> = 6.2

添加了一个sshd_config(5)选项AuthorizedKeysCommand,以支持从文件系统中(或代替)从命令中提取authorized_keys。 该命令在由AuthorizedKeysCommandUser sshd_config(5)选项指定的帐户下运行

我如何configurationOpenSSH和LDAP来实现这个?

    更新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 ) ) 

    创build一个查询用户公钥的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以允许从内部RFC1918networking进行密码validation,如以下问题所示:

    只允许从内部networking对SSH服务器进行密码validation

    有用的链接:

    编辑:添加用户nobodybuild议TRS – 80

    对于运行ldapsearch时出现错误的人:

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

    和我一样(在FreeBSD上),修正是把第一个sed命令改成:

     /^ /{H;d;}; 

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

    只是想分享我的“方法”,我的客户端是Debian / Ubuntu的具体,但我的服务器端基本上是一样的,但多一点“如何:”

    服务器:

    启用公钥特性:

    信用:

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

    首先,使用“通用:用户帐户”模板创build一个用户。 然后,转到“objectClass”属性部分,单击“添加值”,然后select“ldapPublicKey”属性。 提交后,回到用户编辑页面,点击顶部的“添加新属性”,select“sshPublicKey”,将公钥粘贴到文本区域,最后点击“更新对象”。

    sshPublicKey属性不显示 – OpenLDAP PHPLDAP SSH密钥validation

    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 

    创buildtesting密钥:

     ssh-keygen -t rsa 

    这不是一个完整的答案,只是对c4urself的答案的补充。 我会join这个评论,但我没有足够的评价,所以请不要低估!

    这是我用于AuthorizedKeysCommand的脚本(基于c4urself的版本)。 它的工作原理不pipe这个值是否以base64编码的forms返回。 如果要将多个授权密钥存储在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