折腾了几天OpenLDAP,终于是把它给部署上了。对于软件部署这件事,我的评价是不要完全相信网上任何一篇几年前的教程(包括这篇),可能一些操作是对的,但另一些操作已经过时了,这会导致一些莫名奇妙的错误。配置文件中配置项上一般会有注释,看懂了再改。

OpenLDAP服务端部署

Linux:RockyLinux9

安装相关软件

这步没啥说的,照着安装就行了

1
2
3
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
dnf upgrade -y
dnf install -y openldap openldap-servers openldap-clients nginx phpldapadmin

安装后直接启动,不用顾虑

1
systemctl start slapd

初始化

首先查看自己的配置文件命令,这很重要。执行ls /etc/openldap/slapd.d/cn\=config/

image-20241214095534004

然后生成密码,执行命令 slappasswd -s your_password,这会在下面生成一个加密后的密码,如{SSHA}+TszwnXVhnhH5HFGK5Nf4A0xZWGHrmRN,把这个记录下来。

创建以下三个文件

init.ldif

1
2
3
4
5
6
7
8
9
10
dn: olcDatabase={2}mdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=pushihao,dc=com
-
replace: olcSuffix
olcSuffix: dc=pushihao,dc=com
-
replace: olcRootPW
olcRootPW: {SSHA}+TszwnXVhnhH5HFGK5Nf4A0xZWGHrmRN

access.ldif

1
2
3
4
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=admin,dc=pushihao,dc=com" read by * none

base.ldif

1
2
3
4
5
6
7
8
9
10
11
dn: dc=pushihao,dc=com
o: PSH Organization
dc: pushihao
objectClass: top
objectClass: dcObject
objectclass: organization

dn: cn=admin,dc=pushihao,dc=com
cn: admin
objectClass: organizationalRole
description: Directory Manager

文件解读(前两个文件):第一行的dn指定了要修改的条目的唯一标识符,根据刚刚查看的名称来。changetype指定了对条目的修改类型。replace指定了要修改的字段名称,其接下来的一行表示修改后的值。记得把olcRootPW字段替换为刚刚生成的密码。

文件解读(第三个文件):第一段新建一个域,第二段新建了一个管理员。

文件创建好之后执行文件进行修改

1
2
3
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f init.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f access.ldif
ldapadd -x -D 'cn=admin,dc=pushihao,dc=com' -w 'your_password' -f base.ldif

导入基本的Schema

1
2
3
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

使用PHPLDAPAdmin管理OpenLDAP

修改/etc/phpldapadmin/config.php

1
2
3
$servers->setValue('login','attr','dn');
$servers->setValue('login','anon_bind',false);
$servers->setValue('login','allowed_dns',array('cn=admin,dc=pushihao,dc=com'));

修改解读:第一行表示使用完整的dn作为登录凭据,第二行表示不允许匿名访问,第三行表示仅允许指定的dn进行登录

修改/etc/nginx/nginx.conf,添加一个server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 8080;

root /usr/share/phpldapadmin/htdocs;
index index.php;

location / {
try_files $uri $uri/ =404;
}

location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME /usr/share/phpldapadmin/htdocs$fastcgi_script_name;
include fastcgi_params;
}

location ~ /\.ht {
deny all;
}
}

注意fastcgi_pass这个配置项:查看/etc/php-fpm.d/www.conf这个文件,把fastcgi_pass这个配置项和/etc/php-fpm.d/www.conf文件中的listen配置项保持一致(它监听9000端口你也监听,它若用套接字你也用套接字)。

配置完成后重启nginxnginx -s reload即可在浏览器输入ip:8080访问PHPLDAPAdmin的web界面,用户名为cn=admin,dc=pushihao,dc=com,密码为最开始设置的密码(输入未加密的)。

OpenLDAP SSH客户端部署

服务端起来之后就可以根据需求配置各种各样支持ldap的客户端了,ssh是一个常见的需求。这里使用轻量级的nslcd工具。

安装相关软件

没啥说的,装就完了

1
2
3
dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
dnf upgrade -y
dnf install -y openldap-clients nss-pam-ldapd

配置nslcd

修改配置文件/etc/nslcd.conf,参考以下内容,灵活修改

1
2
3
4
5
6
7
8
9
uid root
gid root

uri ldap://ldap-node-01/
base dc=pushihao,dc=com

binddn cn=admin,dc=pushihao,dc=com
bindpw root
ssl no

修改配置文件/etc/nsswitch.conf,参考以下内容,灵活修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
passwd:     files ldap sss systemd
shadow: files ldap
group: files ldap sss systemd
hosts: files dns myhostname
services: files ldap sss
netgroup: files ldap sss
automount: files ldap sss

aliases: files
ethers: files
gshadow: files
networks: files dns
protocols: files
publickey: files
rpc: files

配置pam

修改/etc/pam.d/password-auth

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authselect is run.
auth required pam_env.so
auth sufficient pam_unix.so try_first_pass nullok
auth sufficient pam_ldap.so use_first_pass # 这里
auth required pam_deny.so

account required pam_unix.so
account [default=bad success=ok user_unknown=ignore] pam_ldap.so # 这里

password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow
password sufficient pam_ldap.so use_authtok # 这里
password required pam_deny.so

session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_ldap.so # 这里

修改/etc/pam.d/system-auth

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authselect is run.
auth required pam_env.so
auth sufficient pam_unix.so try_first_pass nullok
auth sufficient pam_ldap.so use_first_pass # 这里
auth required pam_deny.so

account required pam_unix.so
account [default=bad success=ok user_unknown=ignore] pam_ldap.so # 这里

password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow
password sufficient pam_ldap.so use_authtok # 这里
password required pam_deny.so

session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_ldap.so # 这里

修改/etc/ssh/sshd_config

1
2
PasswordAuthentication yes
UsePAM yes

重启相关软件

全部配置文件修改完成之后重启相关软件即可

1
systemctl restart sshd nslcd

然后就可以使用在ldap系统中新建的用户通过ssh连接到服务器了。

搞定!