目录
OpenLDAP
服务端与客户端配置
OpenLDAP
是轻型目录访问协议
,利用它可以进行统一的认证服务。如果需求需要配置多个服务器,并且多账号的话,可以考虑用OpenLDAP
进行统一配置,来完成一组计算机之间的认证。
关于LDIF
一个LDIF基本结构一个条目
注:解释的不完整。
dn: ou=People,dc=example,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
dn
就是数据库中的唯一主键,在LDAP
中唯一标识一个条目ou
就是organizationalUnit
该条目需要有organizationalUnit
而ou
这一行就是设置具体值得objectClass
表示属性,类似于代码中的类的属性
属性
cn:common name,指一个对象的名字。如果指人,需要使用其全名。
o:organizationName,指一个组织的名字。
ou:organizationalUnitName,指一个组织单元的名字。
uid: user id ,唯一的用户id
userPassword:用户密码
uidNumber: 用户ID
gidNumber: 用户组ID
homeDirectory: 用户目录
Object
的类型
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
服务端
安装
[root@rhel2 ~]# yum install openldap openldap-servers migrationtools
生成证书
# 分别生成一个公钥与私钥
openssl req -new -X509 -nodes -out /etc/openldap/certs/cert.pem -keyout /etc/openldap/certs/private.pem -days 365
# 更改两个文件的权限 为ldap
cd /etc/openldap/certs
chown ldap:ldap *.pem
# 查看
ll
total 8
-rw-r--r-- 1 ldap ldap 1273 Nov 14 20:10 cert.pem
-rw-r--r-- 1 ldap ldap 1704 Nov 14 20:10 private.pem
# 将私钥改成只有ldap用户可读写
chmod 600 private.pem
ll
total 8
-rw-r--r-- 1 ldap ldap 1273 Nov 14 20:10 cert.pem
-rw------- 1 ldap ldap 1704 Nov 14 20:10 private.pem
注:生成证书时 Common Name (eg, your name or your server's hostname) []:
这个东西一定要写当前服务器的hostname
,否则证书没法验证
生成默认数据
# 将 示例DB_CONFIG.example复制出来
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/DB_CONFIG
# 到目录下
cd /var/lib/ldap/
# 更改权限
chown ldap:ldap *
# 执行一次 slaptest
修改基本的配置
# 在任意位置增加如下文件,内容如下
# 关于ldif的格式
# 1. 每一个dn都需要有空行
# 2. 每一行末尾都`不能`有空格
# 3. 每一个: 后面都要跟着一个空格
[root@rhel2 openldap]# vim changes.ldif
# 修改 主dn 为 dc=example,dc=com 可以替换成自己的
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=example,dc=com
# 修改管理员密码
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}zcesbHdBiGMQbVBCa7W2ZxjWxXGVHeG2
# 指定公钥位置
dn: cn=config
changetype: modify
replace: olcTLSCertificateFile
olcTLSCertificateFIle: /etc/openldap/certs/cert.pem
# 指定私钥位置
dn: cn=config
changetype: modify
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFIle: /etc/openldap/certs/private.pem
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=Manager,dc=example,dc=com" read by * none
# 以上修改的其实就是在修改 /etc/openldap/slapd.d 下的文件,但是文件汇总有提示不让手动更改,通过ldapmodify 更改
# 执行修改
[root@rhel2 openldap]# ldapmodify -Y EXTERNAL -H ldapi:/// -f changes.ldif
###########################结果#########################
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "cn=config"
modifying entry "cn=config"
modifying entry "olcDatabase={1}monitor,cn=config"
##########################结果#########################
# 测试密码
[root@rhel2 openldap]# ldapwhoami -x -W -D "cn=config"
Enter LDAP Password:
dn:cn=config
导入基础数据
# 增加文件 base.ldif
# 关于ldif的格式
# 1. 每一个dn都需要有空行
# 2. 每一行末尾都`不能`有空格
# 3. 每一个: 后面都要跟着一个空格
[root@rhel2 openldap]# vim base.ldif
dn: dc=example,dc=com
dc: example
objectClass: top
objectClass: domain
dn: ou=People,dc=example,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
dn: ou=Group,dc=example,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit
# 实际上市增加了两个ou People 与 Group 及 用户 与 用户组
# 执行新增
[root@rhel2 openldap]# ldapadd -Y EXTERNAL -H ldapi:/// -f base.ldif
#######################结果###########################
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "ou=People,dc=example,dc=com"
adding new entry "ou=Group,dc=example,dc=com"
########################结果##########################
# 查询数据
[root@rhel2 openldap]# ldapsearch -x ou=Group -b dc=example,dc=com
########################结果##########################
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=com> with scope subtree
# filter: ou=Group
# requesting: ALL
#
# Group, example.com
dn: ou=Group,dc=example,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
########################结果##########################
关于ldif
的格式
每一个
dn
都需要有空行每一行末尾都
不能
有空格每一个
:
后面都要跟着一个空格
批量创建用户
# 创建一个本地目录存放用户
[root@rhel2 openldap]# mkdir /home/guests
# 使用for 创建20个用户
[root@rhel2 guests]# for i in $(seq 1 20); do useradd -d /home/guests/ldapuser$i ldapuser$i; done
# 利用for设置20个用户的密码
[root@rhel2 guests]# for i in $(seq 1 20); do echo ldapuser$i | passwd --stdin ldapuser$i; done
批量导入用户到LDAP
- 更改
migrationtools
的baseDN
[root@rhel2 openldap] cd /usr/share/migrationtools
[root@rhel2 migrationtools]# vi migrate_common.ph
# 更改下面两行为自己的 base dn
# Default DNS domain
$DEFAULT_MAIL_DOMAIN = "example.com";
# Default base
$DEFAULT_BASE = "dc=example,dc=com";
- 导入用户
# 查询所有用户并输出到一个文件
[root@rhel2 migrationtools]# grep ":10[0-9][0-9]" /etc/passwd > > /etc/openldap/passwd
# 如果用户中有部分不想加入的用户直接删除即可
# 将 /etc/openldap/passwd 文件 转成 ldif文件
[root@rhel2 migrationtools]# ./migrate_passwd.pl /etc/openldap/passwd /etc/openldap/passwd.ldif
# 下面是用户ldapuser1 的数据样式
[root@rhel2 migrationtools]# cat /etc/openldap/passwd.ldif
dn: uid=ldapuser1,ou=People,dc=example,dc=com
uid: ldapuser1
cn: ldapuser1
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$1$V1vroanf$NTVsrHIwOTQUpY0Q2CXHM/
shadowLastChange: 18215
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/guests/ldapuser1
- 导入用户组
# 查询所有用户组并输出到一个文件
[root@rhel2 migrationtools]# grep ":10[0-9][0-9]" /etc/group > > /etc/openldap/group
# 如果用户中有部分不想加入的用户直接删除即可
# 将 /etc/openldap/group 文件 转成 ldif文件
[root@rhel2 migrationtools]# ./migrate_group.pl /etc/openldap/group /etc/openldap/group.ldif
# 下面是用户组ldapuser1 的数据样式
[root@rhel2 migrationtools]# cat /etc/openldap/group.ldif
dn: cn=ldapuser1,ou=Group,dc=example,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser1
userPassword: {crypt}x
gidNumber: 1001
- 查询刚才添加的用户与组
# 会发现用户与用户组都查询出来了
[root@rhel2 migrationtools]# ldapsearch -x cn=ldapuser1 -b dc=example,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=com> with scope subtree
# filter: cn=ldapuser1
# requesting: ALL
#
# ldapuser1, People, example.com
dn: uid=ldapuser1,ou=People,dc=example,dc=com
uid: ldapuser1
cn: ldapuser1
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSQxJFYxdnJvYW5mJE5UVnNySEl3T1RRVXBZMFEyQ1hITS8=
shadowLastChange: 18215
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/guests/ldapuser1
# ldapuser1, Group, example.com
dn: cn=ldapuser1,ou=Group,dc=example,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser1
userPassword:: e2NyeXB0fXg=
gidNumber: 1001
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
客户端
安装
[root@rhel1 ~]# yum install openldap-clients nss-pam-ldapd authconfig-gtk
配置ldap
[有问题]
# 图形化配置工具
[root@rhel1 ~]# authconfig-gtk
# 如果使用xshell 时输入上面的命令,需要下载不免费的 Xmanager
# 所以想使用 authconfig-gtk 必须保证客户端安装了图形化界面。
- 将服务端的公钥
cert.pem
复制到 客户端。
scp cert.pem ip:/root/
- 激活图形化配置后按如下进行选择
User Account Database ------- LDAP
LDAP Search Base DN ------- dc=example,dc=com
LDAP Server ------- ldap://ip/
Use TLS to encrypt connnects ------- check
# 此处必须check上否则不让通过
Authentication Method ------- LDAP password
# 点击 Download CA Certificate 输入本地目录
file:///root/cert.pem
- 查看用户
[root@rhel1 ~]# getent passwd ldapuser1
- 问题
此处进行多次尝试还是有问题,一直连接不到LDAP
的Server。最终可以用nslcd
的log中获得如下错误
Nov 18 16:24:30 rhel1.node.com nslcd[35848]: [8b4567] <passwd="ldapuser1"> ldap_start_tls_s() failed (uri=ldap://192.168.245.11/): Connect error: TLS error -8172:Peer's certificate issuer has been marked as not trusted by the user.
记录下我尝试的方法:
1. 在文件 /etc/openldap/ldap.conf 增加 `TLS_REQCERT never`
2. 在文件 /etc/openldap/ldap.conf 增加 `TLS_REQCERT allow`
3. 在服务的使用公钥、私钥获得自签名证书,复制到客户端使用
4. 在服务端 /etc/sysconfig/slap 文件中 增加`ldaps:///`,监控端口`636`已经在使用了,但是客户端配置ldaps的时候还是不能够正确访问
要是有人尝试成功了麻烦告知一下
不使用SSL进行客户端配置
图形化界面authconfig-gtk
要求必须使用SSL证书,或者使用ldaps
进行连接
authconfig-tui
对此没有要求
[root@rhel1 ~]# authconfig-tui
# 进入一个简易的画面,
# 1. 使用tab 进行切换选择项
# 2. 使用space 进行选择
# 3. 使用F12 直接到下一步
1. 第一个页面左边选中 `Use LDAP`,右边选中 `Use LDAP AUthertication`
2. 第二个页面,不选中 `Use TLS`
Server: `ldap://192.168.245.11/`
Base DN: `dc=example,dc=com`
注: 在这里也尝试了选中 `Use TLS` 还是会报证书那个问题
3. 等待一段时间
4. 验证结果
[root@rhel1 ~]# getent passwd ldapuser1
ldapuser1:x:1001:1001:ldapuser1:/home/guests/ldapuser1:/bin/bash
[root@rhel1 ~]# getent passwd ldapuser20
ldapuser20:x:1020:1020:ldapuser20:/home/guests/ldapuser20:/bin/bash
5. 用户已经同步到改客户端上了。并且认证通过
NFS
共享用户家目录
不配置家目录共享
用户无法正常使用
# 认证通过后我们使用用户会报错
[root@rhel1 ~]# su - ldapuser1
su: warning: cannot change directory to /home/guests/ldapuser1: No such file or directory
mkdir: cannot create directory '/home/guests': Permission denied
-bash-4.2$
# 只能完成登录,但是做不了任何操作
配置服务端的NFS
[root@rhel2 ~]# yum install nfs-utils
[root@rhel2 ~]# systemctl enable nfs-server
[root@rhel2 ~]# systemctl start nfs-server
[root@rhel2 ~]# vim /etc/exports
[root@rhel2 ~]# cat /etc/exports
/home/guests 192.168.245.0/24(rw,sync)
# 配置 共享/home/guests 目录 共享读写到网段 192.168.245.0
[root@rhel2 ~]# exportfs -rv
exporting 192.168.245.0/24:/home/guests
[root@rhel2 ~]# exportfs -v
/home/guests 192.168.245.0/24(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
# 添加防火墙开放
[root@rhel2 ~]# firewall-cmd --add-service=nfs --permanent
[root@rhel2 ~]# firewall-cmd --reload
配置客户端的autofs
[root@rhel1 ~]# yum install autofs nfs-utils
# 添加自定义配置的auto.guests
[root@rhel1 ~]# vim /etc/auto.guests
[root@rhel1 ~]# cat /etc/auto.guests
* -rw,nfs4 rhel2.node.com:/home/guests/&
# 编写主文件
[root@rhel1 ~]# vim /etc/auto.master
/home/guests /etc/auto.guests
# 行末加入
[root@rhel1 ~]# systemctl enable autofs
[root@rhel1 ~]# systemctl start autofs
# 再次切换用户
[root@rhel1 ~]# su - ldapuser1
Last login: Tue Nov 19 10:07:36 CST 2019 on pts/2
[ldapuser1@rhel1 ~]$ pwd
/home/guests/ldapuser1
[ldapuser1@rhel1 ~]$ touch test.txt
[ldapuser1@rhel1 ~]$ ll
total 4
-rw-rw-r--. 1 ldapuser1 ldapuser1 5 Nov 19 10:22 test.txt
查看客户端挂载情况
[ldapuser1@rhel1 ~]$ df -Th
df: ‘/run/user/0/gvfs’: Permission denied
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/rhel-root xfs 18G 3.0G 15G 17% /
devtmpfs devtmpfs 905M 0 905M 0% /dev
tmpfs tmpfs 914M 140K 914M 1% /dev/shm
tmpfs tmpfs 914M 21M 894M 3% /run
tmpfs tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sdb5 ext4 190M 1.6M 175M 1% /third
/dev/sda1 xfs 497M 119M 379M 24% /boot
/dev/sr0 iso9660 3.5G 3.5G 0 100% /mnt
rhel2.node.com:/home/guests/ldapuser1 nfs4 18G 1.3G 17G 8% /home/guests/ldapuser1
[ldapuser1@rhel1 ~]$