Skip to content

Enable SSHKey Permission

OpenLDAP 开启 SSHKey 远程登录权限,实际生产环境并不推荐用户直接明文密码登录,建议使用密钥登录,下面将演示 LDAP 账户通过密钥登录

一. 服务端

1)LDAP 服务端安装 openssh-ldap 组件

OpenLDAP 默认是没 ldapPublicKey,所以账户无法基于 sshkey 认证登录

1
2
3
4
5
6
7
8
9
$ yum -y install openssh-ldap
$ rpm -aql | grep openssh-ldap
/usr/share/doc/openssh-ldap-7.4p1
/usr/share/doc/openssh-ldap-7.4p1/HOWTO.ldap-keys
/usr/share/doc/openssh-ldap-7.4p1/ldap.conf
/usr/share/doc/openssh-ldap-7.4p1/openssh-lpk-openldap.ldif
/usr/share/doc/openssh-ldap-7.4p1/openssh-lpk-openldap.schema
/usr/share/doc/openssh-ldap-7.4p1/openssh-lpk-sun.ldif
/usr/share/doc/openssh-ldap-7.4p1/openssh-lpk-sun.schema

2)将配置复制至 Schema 目录,并添加组件

1
2
3
4
5
6
7
8
$ cp /usr/share/doc/openssh-ldap-7.4p1/openssh-lpk-openldap.ldif /etc/openldap/schema/
$ cp /usr/share/doc/openssh-ldap-7.4p1/openssh-lpk-openldap.schema /etc/openldap/schema/

$ ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openssh-lpk-openldap.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=openssh-lpk,cn=schema,cn=config"

二. 客户端

注:此处的客户端指的是其他应用服务器,非个人客户端工作站

1)同样安装 openssh-ldap 组件

$ yum -y install openssh-ldap

2)修改 ldap.confsshd_config 文件,支持 PubKey 登录

$ cp /usr/share/doc/openssh-ldap-7.4p1/ldap.conf /etc/ssh/
$ vim /etc/ssh/ldap.conf
# 未使用TLS,此处改为no
ssl no
uri ldap://188.188.4.111/

$ vim /etc/ssh/sshd_config +43
# 取消注释并按下述修改,此处为通过ssh-ldap-wrapper脚本获取密钥并将其提供给SSH服务验证
 43 PubkeyAuthentication yes
 44 
 45 # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
 46 # but this is overridden so installations will only check .ssh/authorized_keys
 47 AuthorizedKeysFile      .ssh/authorized_keys
 48 
 49 #AuthorizedPrincipalsFile none
 50 
 51 AuthorizedKeysCommand /usr/libexec/openssh/ssh-ldap-wrapper
 52 AuthorizedKeysCommandUser nobody

三. 登录验证

服务器生成密钥文件,并将公钥绑定到指定用户的 sshPublicKey 属性值即可

操作说明:

网上大多数的教程都未特别注明密钥的来源,或只是写着“我们需要登录的服务器”,因其工作原理跟日常的服务器生成密钥,用户再使用该私钥文件进行 SSH-Key 认证登录一样,只是多了绑定 LDAP 账户的操作。

虽然是实现了 LDAP 统一 SSH-Key 认证登录,但在实际生产环境中,对于运维管理并不便利,下面将演示我是如何实现统一 SSH-Key 认证管理。

1)LDAP 服务端生成密钥

$ mkdir ~/.ssh
$ ssh-keygen -t rsa -f ~/.ssh/ldap_server
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/ldap_server.
Your public key has been saved in /root/.ssh/ldap_server.pub.
The key fingerprint is:
SHA256:dLVSD2bEYiIILDCmJQb1zQmiAKPBG5v/lzIKDs5SItI root@ssd-dev01
The key's randomart image is:
+---[RSA 2048]----+
|#==...     oB    |
|BX.o.+... o=.+   |
|+.= . +..oo.. .  |
| +     . . .     |
| ..     S        |
|+ E.             |
|++  .   .        |
|* .  + o         |
|.+ .. +          |
+----[SHA256]-----+

$ ls -al ~/.ssh/
total 8
-rw-------  1 root root 1675 Aug  1 14:16 ldap_server
-rw-r--r--  1 root root  396 Aug  1 14:16 ldap_server.pub

2)LDAP 指定账户添加 objectClass: ldapPublicKey 并添加属性 sshPublicKey

选择 ldapPublicKey 后会提示输入 sshPublicKey 值,添加 LDAP 公钥就可以了

3)客户端(Pc工作站)使用 LDAP 服务端的私钥 + Xshell 进行登录操作

四. 实验总结

具体方案可根据自身需求来定

为什么要有实验总结?首先说明下,之前我也是按照常规操作,在每个服务器上进行生成密钥,之后绑定到"指定的用户",实现了指定 LDAP 账户拥有 SSH-Key 访问"指定的服务器"。但这样不仅需要维护 LDAP 账户,还需要记录不同服务器的密钥文件,这对于运维同事来说,反而增加了工作量。

目前的管理方案是通过 LDAP 服务端生成密钥文件,将公钥绑定到指定 LDAP 账户,并且限制指定账户登录指定的服务器主机(此处的服务器必须按照上述客户端配置组件服务)。