CENTOS7-LDAP环境搭建

作者: seamus 分类: 域控 发布时间: 2018-05-06 21:19

操作系统: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用户登录

客户端配置到此结束。