Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36258
  • 博文数量: 12
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 123
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-27 11:20
个人简介

Passion for technology and design!

文章分类
文章存档

2015年(8)

2014年(4)

我的朋友

分类: LINUX

2015-05-29 18:46:08

一、配置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 -l
systemctl enable slapd.service

如果服务正常启动,信息应该是类似这样的:
# systemctl status slapd.service -l
slapd.service - OpenLDAP Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled)
   Active: active (running) since Thu 2015-05-28 23:38:54 CST; 13s ago
  Process: 6727 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=0/SUCCESS)
  Process: 6712 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)
 Main PID: 6729 (slapd)
   CGroup: /system.slice/slapd.service
           └─6729 /usr/sbin/slapd -u ldap -h ldapi:/// ldap:///

May 28 23:38:54 gateway.example.com runuser[6715]: pam_unix(runuser:session): session opened for user ldap by (uid=0)
May 28 23:38:54 gateway.example.com runuser[6715]: pam_unix(runuser:session): session closed for user ldap
May 28 23:38:54 gateway.example.com slapcat[6719]: DIGEST-MD5 common mech free
May 28 23:38:54 gateway.example.com slapd[6727]: @(#) $OpenLDAP: slapd 2.4.39 (Feb 26 2014 03:09:11) $
                                                         mockbuild@x86-019.build.eng.bos.redhat.com:/builddir/build/BUILD/openldap-2.4.39/openldap-2.4.39/servers/slapd
May 28 23:38:54 gateway.example.com slapd[6729]: slapd starting
May 28 23:38:54 gateway.example.com systemd[1]: Started OpenLDAP Server Daemon.

6. 添加LDAP用户

使用文本编辑建立一个文本文件,文件名称 ldapusers.txt 内容如下:
5000  anna      f12345
5001  david     m67890
5002  fiona     f12345
5003  robert    m67890
5004  jennifer  f12345
5005  john      m67890
5006  natalie   f12345
5007  kevin     m67890
5008  cynthia   f12345
5009  james     m67890
第一列为用户ID,第二列为用户名,第三列为密码,中间用空格隔开。
注意LDAP的用户目录,不要直接建在/home目录下,否则会导致LDAP客户机在开启autofs后,其本地用户目录无法访问。
然后建立脚本add-user.sh内容如下:

#!/bin/bash
USER_LIST=ldapuser.txt
HOME_REMOTE=/home/remoteuser
mkdir -pv $HOME_REMOTE
for USERID in `awk '{print $1}' $USER_LIST`; do
    USERNAME="`grep "$USERID" $USER_LIST | awk '{print $2}'`"
    HOMEDIR=${HOME_REMOTE}/${USERNAME}
    useradd $USERNAME -u $USERID -d $HOMEDIR
    grep "$USERID" $USER_LIST | awk '{print $3}' | passwd --stdin $USERNAME
done

执行add-user.sh脚本,建立LDAP用户账号,并建立他们的家目录:
chmod 775 add-user.sh
./add-user.sh

7. 导入用户数据

修改配置文件/usr/share/migrationtools/migrate_common.pl
找到这两个变量,修改为:
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "example.com";
# Default base
$DEFAULT_BASE = "dc=example,dc=com";

创建基本数据库模版文件:
/usr/share/migrationtools/migrate_base.pl > /root/base.ldif

创建用户数据模版:
/usr/share/migrationtools/migrate_passwd.pl /etc/passwd /root/user.ldif
编辑user.ldif,只留下10个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这些属性。

创建组数据模板:
/usr/share/migrationtools/migrate_group.pl /etc/group /root/group.ldif
编辑group.ldif,只留下10个LDAP用户相关的组的信息,其他用户的信息都删掉。
user.ldif中所有的DN都是属于Group这个OU,而Group这个OU是在base.ldif中定义的。

用刚刚创建的三个模版文件导入数据,注意执行顺序,否则会出错,因为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

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

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

服务器配置到此结束。

二、配置LDAP客户端

1. 安装LDAP认证相关软件包
yum -y install sssd-ldap nss-pam-ldapd

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://gateway.example.com
Base DN: dc=example,dc=com

这里不要用IP地址,原因是:如果使用TLS认证,证书里是服务器的主机名,如果使用严格的认证,会认证失败。
用Tab键移动光标到OK,回车。

如果没有配置DNS服务,则可以在执行authconfig-tui之前,在/etc/hosts文件中加上一行:“服务器IP  服务器主机名”,例如:
192.168.0.1  gateway.example.com

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用户:
# id 5000
uid=5000(anna) gid=5000(anna) groups=5000(anna)
# id 5001
uid=5001(david) gid=5001(david) groups=5001(david)
# id 5002
uid=5002(fiona) gid=5002(fiona) groups=5002(fiona)

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    gateway.example.com:/home/remoteuser/&

这个文件的格式是这样:
用户名    挂载选项    服务器IP:NFS目录路径

所以如果有2个用户user1和user2,可以写成:
user1    -fstype=nfs,rw,sync    gateway.example.com:/home/remoteuser/user1
user2    -fstype=nfs,rw,sync    gateway.example.com:/home/remoteuser/user2

如果有很多用户,则用户名可以用通配符*,NFS路径字段中用&表示跟用户名同名的目录,例如:
*    -fstype=nfs,rw,sync    gateway.example.com:/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命令显示:
auto.nfs on /home/remoteuser type autofs (rw,relatime,fd=19,pgrp=3286,timeout=300,minproto=5,maxproto=5,indirect)

测试autofs的方法:
cd /home/remoteuser/anna

5. 用LDAP用户登录

先用 su - 切换到普通用户,再用 su - anna 试图用LDAP用户登录。

如果登录时有 change directory failed: Permission denied 错误,有可能是SELinux的问题。
# sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

用命令 setenforce 0 关闭SELinux后尝试登录,若正常登录;然后 setenforce 1 再登录,若错误复现,则确认是SELinux的问题。

先用root登录,用 tail -n10 -f /var/log/messages 查看系统日志。
然后切换到另一个终端,用user1登录,出Permission denied错误后,切回来看日志,发现如下内容:

*****  Plugin catchall_boolean (89.3 confidence) suggests   ******************

If you want to allow use to nfs home dirs
Then you must tell SELinux about this by enabling the 'use_nfs_home_dirs' boolean.
You can read 'None' man page for more details.
Do
setsebool -P use_nfs_home_dirs 1

根据该日志可知,如果想要用NFS目录作为用户的家目录,需要设置use_nfs_home_dirs选项,所以用root权限执行:
setsebool -P use_nfs_home_dirs 1
即可解决。

SELinux限制用户的NFS家目录的问题,并不是总是出现,原因未知。

客户端配置到此结束。
阅读(7170) | 评论(0) | 转发(0) |
0

上一篇:NFS和NFS Secure服务器和客户端的配置

下一篇:没有了

给主人留下些什么吧!~~