想通过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,以便为用户添加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 ) )
该脚本应输出该用户的公钥,例如:
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
编辑:添加用户nobody
build议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