CENTOS7-LDAP环境搭建
操作系统:Centos7.2
操作系统:Centos7.2
LDAP服务端:192.168.0.253
LDAP客户端:192.168.0.251
服务端与客户端hosts文件均有对方主机名与ip映射记录。
一、配置LDAP服务器
1. 安装LDAP及相关软件包
yum -y install openldap openldap-clients openldap-servers migrationtools openldap-devel nss-pam-ldapd bind-dyndb-ldap compat-openldap perl-LDAP krb5-server-ldap php-ldap openssl
2. 配置slapd主配置文件
openldap的主配置文件是/etc/openldap/slapd.conf文件,但是在新版的openldap中,采用了目录树的配置方式。
详情可参考:
man 5 slapd-config
也就是将配置存放在/etc/openldap/slapd.d目录中。
配置的示例文件是 /usr/share/openldap-servers/slapd.ldif ,把它复制到 /root 目录下:
cp /usr/share/openldap-servers/slapd.ldif /root/
编辑 /root/slapd.ldif 文件内容,去掉注释,文件全文如下:
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/openldap/slapd.args
olcPidFile: /var/run/openldap/slapd.pid
olcTLSCACertificatePath: /etc/openldap/certs
olcTLSCertificateFile: /etc/openldap/certs/ldap.crt
olcTLSCertificateKeyFile: /etc/openldap/certs/ldap.key
dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema
include: file:///etc/openldap/schema/corba.ldif
include: file:///etc/openldap/schema/core.ldif
include: file:///etc/openldap/schema/cosine.ldif
include: file:///etc/openldap/schema/duaconf.ldif
include: file:///etc/openldap/schema/dyngroup.ldif
include: file:///etc/openldap/schema/inetorgperson.ldif
include: file:///etc/openldap/schema/java.ldif
include: file:///etc/openldap/schema/misc.ldif
include: file:///etc/openldap/schema/nis.ldif
include: file:///etc/openldap/schema/openldap.ldif
include: file:///etc/openldap/schema/ppolicy.ldif
include: file:///etc/openldap/schema/collective.ldif
dn: olcDatabase=frontend,cn=config
objectClass: olcDatabaseConfig
olcDatabase: frontend
dn: olcDatabase=config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: config
olcAccess: to * by dn.base=”gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth” manage by * none
dn: olcDatabase=monitor,cn=config
objectClass: olcDatabaseConfig
olcDatabase: monitor
olcAccess: to * by dn.base=”gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth” read by dn.base=”cn=Manager,dc=example,dc=com” read by * none
dn: olcDatabase=bdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcBdbConfig
olcDatabase: bdb
olcSuffix: dc=example,dc=com
olcRootDN: cn=Manager,dc=example,dc=com
olcRootPW: {SSHA}7fNBMv/sSDvmHWT5VXPZ2opL52o9/QkI
olcDbDirectory: /var/lib/ldap
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
olcDbIndex: uidNumber,gidNumber,loginShell eq,pres
olcDbIndex: uid,memberUid eq,pres,sub
olcDbIndex: nisMapName,nisMapEntry eq,pres,sub
有几点需要注意:
1) 上文中的空行不能省略,它表示一个DN的结束;
2) include部分是有先后顺序的,不要随意改变顺序;
3) 有多处 dc=example,dc=com ,这是因为我的LDAP域是 example.com ,如果你的LDAP域是 subdomain1.domain1.com ,则应该为 dc=subdomain1,dc=domain1,dc=com 的形式。
4) man手册中EXAMPLE那一节,有一段:
dn: olcDatabase=bdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcBdbConfig
olcDatabase: bdb
而/usr/share/openldap-servers/slapd.ldif的原文是hdb而不是bdb,经测试hdb和bdb都能正常加载。
5) olcRootPW那一行是密码加密后的哈希值,是用slappasswd命令算出来的。
# slappasswd
New password:
Re-enter new password:
{SSHA}7fNBMv/sSDvmHWT5VXPZ2opL52o9/QkI
将这段哈希值复制粘贴到olcRootPW那一行。
6) 最后的olcDbIndex那5行,是对数据进行索引,有些数据如objectClass和uidNumber不支持sub操作,所以不建立sub索引。
清空原有配置:
rm -rfv /etc/openldap/slapd.d/*
将 /root/slapd.ldif 加载进 /etc/openldap/slapd.d 目录:
slapadd -F /etc/openldap/slapd.d -n 0 -l /root/slapd.ldif
测试配置文件是否正确:
slaptest -u -F /etc/openldap/slapd.d
若正确则提示:
config file testing succeeded
修改配置文件的所有者,否则无法读取这些配置:
chown -Rv ldap.ldap /etc/openldap/slapd.d
3. 创建数据库配置文件
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -Rv ldap.ldap /var/lib/ldap/DB_CONFIG
4. 配置TLS加密
如果要通过客户端的sssd进行LDAP认证,必须开启TLS加密。
在 man sssd-ldap 的手册中有如下内容:
If you want to authenticate against an LDAP server either TLS/SSL or LDAPS is required.
sssd does not support authentication over an unencrypted channel.
大意是,如果用LDAP认证,要么开启TLS/SSL,要么使用LDAPS,sssd不支持不加密的认证通道。
这里我们生成一个自签名的证书。
生成服务器的RSA私钥:
openssl genrsa -out ldap.key 1024
生成签名请求:
openssl req -new -key ldap.key -out ldap.csr
会提示输入服务器的主机名,这里一定要填写正确:
Common Name (eg, your name or your server’s hostname) []:gateway.example.com
生成自签名的公钥:
openssl x509 -req -days 3653 -in ldap.csr -signkey ldap.key -out ldap.crt
把 ldap.key 和 ldap.crt 复制到 /etc/openldap/certs 目录:
cp -v ldap.key ldap.crt /etc/openldap/certs
chown -Rv ldap.ldap /etc/openldap/certs/
chmod 700 /etc/openldap/certs/
这个路径,是跟 slapd.ldif 文件里的这3行对应的:
olcTLSCACertificatePath: /etc/openldap/certs
olcTLSCertificateFile: /etc/openldap/certs/ldap.crt
olcTLSCertificateKeyFile: /etc/openldap/certs/ldap.key
5. 启动服务
启动slapd服务并查看状态:
systemctl start slapd.service
systemctl status slapd.service –luser
systemctl enable slapd.service???//设置此服务为开机自启动
6. 添加LDAP用户
创建组test1,test2,test3
创建8个用户ceshi1-8,家目录为/home/remoteuser/
将ceshi1-2归为组test1成员,ceshi3-4 归为组test2成员,ceshi5-6归为组test3成员。ceshi7-8 默认
[root@ruichi253 certs]# useradd ceshi1 -d /home/remoteuser/ceshi1 -g test1
[root@ruichi253 certs]# useradd ceshi2 -d /home/remoteuser/ceshi2 -g test1
验证
7. 导入用户数据
修改配置文件/usr/share/migrationtools/migrate_common.ph找到这两个变量,修改为:
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = “example.com”;
# Default base
$DEFAULT_BASE = “dc=example,dc=com”;
A、创建基本数据库模版文件:
/usr/share/migrationtools/migrate_base.pl > /root/base.ldif
B、创建用户数据模版:
/usr/share/migrationtools/migrate_passwd.pl /etc/passwd /root/user.ldif
编辑user.ldif,只留下之前创建的8个(ceshi1-ceshi8)LDAP用户的相关信息,其他用户的信息都删掉。
user.ldif中所有的DN都是属于People这个OU,而People这个OU是在base.ldif中定义的。
user.ldif中所有的DN都是继承自以下4个类:
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
其中posixAccount和shadowAccount提供了uidNumber、gidNumber、homeDirectory、loginShell、userPassword这些属性。
C、创建组数据模板:
/usr/share/migrationtools/migrate_group.pl /etc/group /root/group.ldif
编辑group.ldif,只留下之前创建的5个(test1-test3,ceshi7,ceshi8)LDAP用户相关的组的信息,其他用户的信息都删掉。
user.ldif中所有的DN都是属于Group这个OU,而Group这个OU是在base.ldif中定义的。
D、创建网络组数据模板
将LDAP服务端/etc/netgroup(手动创建)文件中的主机(LDAP域客户端主机)作为网络组主机,导入域中。
[root@ruichi253 ~]# cat /etc/netgroup
Group1?(ruichi250,,) (ruichi252,,)
Group 2 (node1,,) (node3,,)
以上定义2个组,组group1(成员:ruichi250,ruichi252) ?group2(成员:node1 node3)
/usr/share/migrationtools/migrate_netgroup.pl?/etc/netgroup ?>/root/netgroup.ldif
E、导入数据
用刚刚创建的三个模版文件导入数据,注意执行顺序,否则会出错,因为OU都是在base.ldif中定义的。
提示输入密码,即为slapd.ldif中olcRootPW的密码:
ldapadd -D “cn=Manager,dc=example,dc=com” -W -x -f base.ldif
ldapadd -D “cn=Manager,dc=example,dc=com” -W -x -f user.ldif
ldapadd -D “cn=Manager,dc=example,dc=com” -W -x -f group.ldif
ldapadd -D “cn=Manager,dc=example,dc=com” -W -x -f netgroup.ldif
8. 配置用户家目录
LDAP用户登陆后,用户的home目录在服务器上,这里用NFS服务提供LDAP用户home目录。
编辑配置文件/etc/exports,内容如下:
/home/remoteuser ???*(rw)
启动服务:
systemctl start rpcbind.service
systemctl start nfs-server.service
注意先启动rpcbind,否则NFS有可能启动失败。
可以用 showmount -e 命令查看已开启的NFS目录。
用netstat命令查看端口监听情况,389端口是LDAP,2049端口是NFS。
# netstat -ntl | grep -E “389|2049”
tcp ???????0 ?????0 0.0.0.0:2049 ???????????0.0.0.0:* ??????????????LISTEN
tcp ???????0 ?????0 0.0.0.0:389 ????????????0.0.0.0:* ??????????????LISTEN
tcp6 ??????0 ?????0 :::2049 ????????????????:::* ???????????????????LISTEN
tcp6 ??????0 ?????0 :::389 ?????????????????:::* ???????????????????LISTEN
将服务设为开机自动启动:
systemctl enable rpcbind.service
systemctl enable nfs-server.service
9. 设置防火墙
确保防火墙没有阻挡LDAP服务和NFS服务:
firewall-cmd –permanent –add-service=ldap
firewall-cmd –permanent –add-service=ldaps
firewall-cmd –permanent –add-service=nfs
firewall-cmd –permanent –add-service=mountd
firewall-cmd –permanent –add-service=rpc-bind
firewall-cmd –reload
此文档配置过程中,防火墙以及selinux都是关闭状态。
10. 配置日志
编辑rsyslog配置文件:
vi /etc/rsyslog.conf
加上一行:
local4.* ???/var/log/ldap.log
然后touch /var/log/ldap.log
重启rsyslog:
systemctl restart rsyslog.service
如果slapd启动出问题,可查看/var/log/messages文件,比如:
systemctl status slapd.service -l
tail -n20 -f /var/log/messages
11、映射ip与主机名
将netgroup中定义的客户端IP写入到域hosts文件中
服务器配置到此结束。
二、配置LDAP客户端
1. 安装LDAP认证相关软件包
yum -y install sssd-ldap sssd* nss-pam-ldapd?openldap*
2. 开启LDAP验证
终端执行命令authconfig-tui
User Information ???????Authentication
[ ] Cache Information ??[ ] Use MD5 Passwords
[*] Use LDAP ????????????[*] Use Shadow Passwords
[ ] Use NIS ???????????????[*] Use LDAP Authentication
[ ] Use IPAv2 ???????????[ ] Use Kerberos
[ ] Use Winbind ????????[ ] Use Fingerprint reader
[ ] Use Winbind Authentication
[*] Local authorization is sufficient
用Tab键切换到Next,回车。
[*] Use TLS
Server: ldap://ruichi253
Base DN: dc=example,dc=com
这里server输入不要用IP地址,原因是:如果使用TLS认证,证书里是服务器的主机名,如果使用严格的认证,会认证失败。
用Tab键移动光标到OK,回车。
如果没有配置DNS服务,则可以在执行authconfig-tui之前,在/etc/hosts文件中加上一行:“服务器IP ?服务器主机名”,例如:
192.168.0.253 ?ruichi253
3. 读取TLS加密的LDAP数据
由于使用了自签名证书,所以客户端并没有下载CA证书,而生产环境是应该有CA证书的。通常是把证书下载到客户端的 /etc/openldap/certs 目录,然后执行 cacertdir_rehash /etc/openldap/certs 命令。
编辑 /etc/openldap/ldap.conf 文件,在TLS_CACERTDIR那一行上方添加一行:
TLS_REQCERT allow
然后执行LDAP查询命令:
ldapsearch -x -b “dc=example,dc=com” “objectclass=*” -ZZ?| less
就可以显示LDAP的数据,注意最后的 -ZZ 是强制使用TLS加密。
编辑 /etc/sssd/sssd.conf 文件,在ldap_uri那一行下方添加一行:
ldap_tls_reqcert = allow
重启sssd服务:
systemctl restart sssd
这2个allow允许在证书颁发者不受信任的情况下,仍然建立会话。这并不安全,但可以用于自签名的实验。
如果成功,则可以用id命令看到这些LDAP用户:
4. 配置autofs(域用户登入不需要家目录,略过)
LDAP用户的HOME目录,是通过autofs从服务器端的NFS服务挂载到本地的。如果没有挂载,则LDAP用户就没有HOME目录,不能创建自己的文件。
修改/etc/auto.master,原有内容不要动,在最后添加一行:
/home/remoteuser ???auto.nfs
/home/remoteuser即autofs挂载的路径,auto.nfs是自定义的,该字段必须跟下文的配置文件名相对应。
保存退出,然后建立 /home/remoteuser 目录,以后LDAP用户的目录会通过autofs自动挂载到该目录:
mkdir -pv /home/remoteuser
为什么不将LDAP用户的目录挂载到 /home 目录呢?如果那么做,挂载后本地用户的目录就无法访问了,所以不推荐挂载到 /home 。
创建 /etc/auto.nfs 文件,文件名必须跟上面自定义的字段auto.nfs相对应,内容如下:
* ???-fstype=nfs,rw ???ruichi253:/home/remoteuser/&
这个文件的格式是这样:
用户名 ???挂载选项 ???服务器IP:NFS目录路径
所以如果有2个用户user1和user2,可以写成:
user1 ???-fstype=nfs,rw,sync ???ruichi253:/home/remoteuser/user1
user2 ???-fstype=nfs,rw,sync ???ruichi253:/home/remoteuser/user2
如果有很多用户,则用户名可以用通配符*,NFS路径字段中用&表示跟用户名同名的目录,例如:
* ???-fstype=nfs,rw,sync ???ruichi253:/home/remoteuser/&
修改/etc/sysconfig/autofs,末尾添加一行:
DISABLE_DIRECT=0
配置完毕,启动autofs服务:
systemctl stop autofs.service
systemctl start autofs.service
systemctl enable autofs.service
这时 ls /home/remoteuser 显示没有文件,mount命令显示:
/etc/auto.misc on /misc type autofs (rw,relatime,fd=6,pgrp=6603,timeout=300,minproto=5,maxproto=5,indirect)
5. 用LDAP用户登录
客户端配置到此结束。