使用openldap认证linux的ssh登录本来是很简单的,所以这里只是说下基本操作,后面有空会增加一些比较高级的玩法,比如限制哪些用户登录哪些Linux主机,比如允许特定用户sudo,比如开启ssl。
本文假设你已经搭建了一个openldap服务,如果没有可以使用proxmox VE自带的lxc模板,里面有openldap模板,几分钟就好了。
这里放一个组和用户的例子,注意组类型是posixGroup,用户的类型至少应该有posixAccount和shadowAccount
dn: cn=group01,ou=groups,dc=example,dc=com
cn: group01
gidnumber: 10001
objectclass: posixGroup
dn: cn=user01,ou=users,dc=example,dc=com
uid: user01
cn: user01
sn: user01
givenName: user01
displayName: user01
objectClass: posixAccount
objectClass: top
objectClass: person
objectClass: shadowAccount
objectClass: inetOrgPerson
uidNumber: 10001
gidNumber: 10001
loginShell: /bin/bash
homeDirectory: /home/user01
userPassword: user01
shadowLastChange: 17654
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
shadowExpire: -1
employeeNumber: 123001
homePhone: 023-xxxxxxxx
mobile: 1xxxxxxxxxxx
mail: user01@126.com
postalAddress: ST Road
initials: Test
以下是客户端上的操作
CentOS
安装openldap客户端
$ sudo yum install openldap-client nss-pam-ldapd openssh-ldap authconfig -y
加入OpenLDAP服务器,ldapserver和ldapbasedn部分根据实际情况修改
$ sudo authconfig --enableldap --enableldapauth --enablemkhomedir --enableforcelegacy --disablesssd --disablesssdauth --disableldaptls --enablelocauthorize --ldapserver=192.168.10.100 --ldapbasedn="ou=users,dc=example,dc=com" --enableshadow --update
允许到OpenLDAP服务查找用户和密码
编辑/etc/nsswitch.conf,添加ldap
passwd: files ldap
shadow: files ldap
group: files ldap
测试
应该可以看到ldap上面的用户和组
$ getent passwd
...
user01:x:10001:10001:/home/user01:/bin/bash
...
$ getent group
...
group01:x:10001
...
Debian/Ubuntu
安装openldap客户端
$ sudo apt install libnss-ldap libpam-ldap ldap-utils nscd
在Configuring libnss-ldap界面会询问要查询的Base DN
配置PAM支持LDAP
$ sudo pam-auth-update
增加 LDAP Authentication
允许LDAP用户创建家目录
编辑/etc/pam.d/common-session,添加
session required pam_mkhomedir.so skel=/etc/skel umask=077
编辑/etc/pam.d/common-password,移除use_authtok,如下
password [success=1 user_unknown=ignore default=die] pam_ldap.so try_first_pass
重启nscd
$ sudo systemctl restart nscd
OpenLDAP访问权限
上面没有考虑OpenLDAP服务器设置了访问权限必须使用dn和密码的情况,如果设置了,参考下面的配置文件
sed '/^#/d' /etc/nslcd.conf | sed '/^$/d'
uid nslcd
gid ldap
uri ldap://192.168.10.100/
base ou=user,dc=example,dc=com
binddn cn=admin,dc=example,dc=com
bindpw cRunii
ssl no