OpenLDAP是什么,优势及特性:
OpenLDAP 是目前用于实现账号集中管理的开源软件,可以让账号管理人员、系统运维工程师的工作变得灵活轻松,提高工作效率,并且通过一台机器控制上千台机器账号权限的管理,如添加、删除、修改等操作。是一款轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)的开源实现。
OpenLDAP 直接运行在更简单和更通用的TCP/IP 或其他可靠的传输协议层上,避免了在OSI会话层和表示层的开销,使连接的建立和包的处理更简单、更快,对于互联网和企业网应用更理想。LDAP 提供并实现目录服务的信息服务,目录服务是一种特殊的数据库系统,对于数据的读取、浏览、搜索有很好的效果。目录服务一般用来包含基于属性的描述性信息并支持精细复杂的过滤功能,但OpenLDAP 目录服务不支持通用数据库的大量更新操作所需要的复杂的事务管理或回滚策略等。
OpenLDAP 默认以Berkeley DB 作为后端数据库,Berkeley DB 数据库主要以散列的数据类型进行数据存储,如以键值对的方式进行存储。Berkeley DB 是一类特殊的数据库,主要用于搜索、浏览、更新查询操作,一般对于一次写入数据、多次查询和搜索有很好的效果。Berkeley DB 数据库是面向查询进行优化,面向读取进行优化的数据库。Berkeley DB 不支持事务型数据库(MySQL、MariDB、Oracle 等)所支持的高并发的吞吐量以及复杂的事务操作。
OpenLDAP 目录中的信息是按照树形结构进行组织的,具体信息存储在条目(entry)中,条目可以看成关系数据库中的表记录,条目是具有区别名(Distinguished Name,DN)的属性(attribute),DN 是用来引用条目,DN 相当于关系数据库(Oracle/MySQL)中的主键(primary key),是唯一的。属性由类型(type)和一个或者多个值(value)组成,相当于关系数据库中字段的概念。
OpenLDAP安装:
- 配置环境:服务器操作系统: CentOS 7.4.1708 x86_64;OpenLDAP版本:OpenLDAP 2.4.44(openldap-servers-2.4.44-5.el7.x86_64)
其实如果不是对LDAP各种参数要求都十分严格的情况下,比较建议采用 yum 的方式安装。因为相关依赖环境,功能都十分全面,对于初学者,强烈建议第一次使用yum来安装。当然如果想自定义安装也可参照:http://book.51cto.com/art/201602/505715.htm - 准备环境:
- 确保SELinux关闭:
[root@localhost /]# getenforce 1、临时关闭 #其实不关应该也没什么问题,我们临时关闭即可,重启机器会复原 [root@localhost /]# setenforce 0 2、永久关闭 [root@localhost /]# vi /etc/selinux/config 将SELINUX=enforcing 改为 SELINUX=disabled 重启机器即可
- 设定iptables防火墙规则(添加ldap数据传输端口:centos 7添加方法见我的博客: centos7防火墙开放端口,centos7版本以下通过iptables设置如下):
[root@localhost /]# vim /etc/sysconfig/iptables *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 389 -j ACCEPT -s 192.168.1.0/16 #1. 添加LDAP默认监听端口: 389 (明文数据传输) -A INPUT -m state --state NEW -m tcp -p tcp --dport 636 -j ACCEPT -s 192.168.1.0/16 #2. 添加LDAP加密监听端口: 636 (加密数据传输) -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT 重新加载后如下: # iptables -L ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:http ACCEPT tcp -- 192.168.1.0/16 anywhere state NEW tcp dpt:ldap ACCEPT tcp -- 192.168.1.0/16 anywhere state NEW tcp dpt:ldaps
- 同步系统时间:(管理多个机器时需要同步各机器时间,这里也做了吧)
[root@localhost /]# ntpdate time.nist.gov
- 确保SELinux关闭:
- 安装OpenLDAP程序
- 用yum安装软件包
[root@localhost /]# yum install -y openldap-* [root@localhost /]# yum install -y compat-openldap # 这个包和主从配置有很大关系
- 安装完成后,准备主配置文件
#拷贝LDAP主配置文件模板到指定目录,有可能找不到/usr/share/openldap-servers/slapd.conf.obsolete 这个文件,我的这个版本安装后就没找到,后来我用了其他博客中找到的配置文件 [root@localhost /]# cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
- 创建LDAP管理员密码
LDAP可以支持明文密码,但是我们强烈建议使用加密密码。 通过 slappasswd 命令创建加密密码,返回一串密文,先复制保存一下,下一步需要在LDAP配置文件中使用。[root@localhost /]# slappasswd New password: #我这里密码用的是:LDAP123 Re-enter new password: {SSHA}yK6ng/aVSeGKBbGxTEX6zkT5Nlq5POXM
- 进入 /etc/openldap 目录下,编辑 slapd.conf 配置文件。
主要修改的地儿: suffix, rootdn, rootpw; rootdn 其实就是openldap的管理员。
优化(这是我从别的博客搬过来的,自己没改,先放这儿):
checkpoint 2048 10 #设置把内存中的数据写回数据文件的操作,此处的设置表示每达到 2048K 或者 10分钟执行一次 checkpoint, 即写入数据文件的操作。
cachesize 1000 #设置LDAP可以缓存的记录数
[root@localhost openldap]# vim slapd.conf #为更好的让大家看到文件结构,我截图解释修改处1信息因为之前没弄清楚,其实其意思是: 1. 允许授权某部分用户查看信息
- 用yum安装软件包
- BerkeleyDB配置
OpenLDAP默认使用的是伯克利数据库作为后台数据存储介质,在OpenLDAP-Servers包中已经包含了,直接将数据库配置模版文件复制到相关目录即可#拷贝数据库配置模版文件 [root@localhost openldap]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
- 删除 /etc/openldap/slapd.d 目录下所有的文件(此目录可以由主配置文件slapd.conf 生成);/etc/openldap/slapd.d目录下是一些默认的配置文件,新版本没有主配置文件的原因可能就是因为用户可以通过命令直接修改slapd.d配置从而达到与修改主配置文件同样的效果[有博客也说:官方对于 OpenLDAP 2.4及以后版本,不推荐使用 slapd.conf 作为配置文件。从这个版本开始所有配置数据都保存在 /etc/openldap/slapd.d/中 ]。但我们这里选择删除:
rm -rf /etc/openldap/slapd.d/*
- 通过主配置文件重新生成 slapd.d 下的配置文件
[root@localhost openldap]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d config file testing succeeded
- 配置相应目录权限
[root@localhost openldap]# chown -R ldap:ldap /var/lib/ldap/ [root@localhost openldap]# chown -R ldap:ldap /etc/openldap/ [root@localhost openldap]# chown -R ldap:ldap /etc/openldap/slapd.d
- 启动 LDAP 的 slapd 服务, 并设置开机启动
[root@localhost openldap]# chkconfig slapd on [root@localhost openldap]# service slapd start #开启 LDAP 的 slapd 服务 # service slapd stop 关闭 LDAP 的 slapd 服务 # service slapd restart 重启 LDAP 的 slapd 服务
- 使用 netstat -tulpn 查看服务是否正常启动
[root@localhost openldap]# netstat -tulpn Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:9611 0.0.0.0:* LISTEN 9972/java tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN 9972/java tcp 0 0 0.0.0.0:9711 0.0.0.0:* LISTEN 9972/java tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:8243 0.0.0.0:* LISTEN 9972/java tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2218/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1784/sshd tcp 0 0 192.168.122.1:10711 0.0.0.0:* LISTEN 9972/java tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1783/cupsd tcp 0 0 0.0.0.0:8280 0.0.0.0:* LISTEN 9972/java tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2139/master tcp 0 0 0.0.0.0:7611 0.0.0.0:* LISTEN 9972/java tcp 0 0 127.0.0.1:10397 0.0.0.0:* LISTEN 9972/java tcp 0 0 0.0.0.0:7711 0.0.0.0:* LISTEN 9972/java tcp 0 0 0.0.0.0:8672 0.0.0.0:* LISTEN 9972/java tcp 0 0 0.0.0.0:34499 0.0.0.0:* LISTEN 9972/java tcp 0 0 0.0.0.0:9443 0.0.0.0:* LISTEN 9972/java tcp 0 0 0.0.0.0:9763 0.0.0.0:* LISTEN 9972/java tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 26567/slapd #389端口被 slapd 监听,说明LADP成功启动 tcp 0 0 0.0.0.0:40358 0.0.0.0:* LISTEN 9972/java tcp 0 0 0.0.0.0:11111 0.0.0.0:* LISTEN 9972/java tcp 0 0 127.0.0.1:9095 0.0.0.0:* LISTEN 9222/postgres tcp 0 0 0.0.0.0:5672 0.0.0.0:* LISTEN 9972/java tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::22 :::* LISTEN 1784/sshd tcp6 0 0 ::1:631 :::* LISTEN 1783/cupsd tcp6 0 0 ::1:25 :::* LISTEN 2139/master tcp6 0 0 :::9090 :::* LISTEN 9573/java tcp6 0 0 :::9091 :::* LISTEN 9243/java tcp6 0 0 :::389 :::* LISTEN 26567/slapd #389端口被 slapd 监听 tcp6 0 0 :::9094 :::* LISTEN 9008/java tcp6 0 0 ::1:9095 :::* LISTEN 9222/postgres udp 0 0 0.0.0.0:40235 0.0.0.0:* 9972/java udp 0 0 0.0.0.0:57148 0.0.0.0:* 1356/avahi-daemon: udp 0 0 192.168.122.1:53 0.0.0.0:* 2218/dnsmasq udp 0 0 0.0.0.0:67 0.0.0.0:* 2218/dnsmasq udp 0 0 0.0.0.0:68 0.0.0.0:* 1551/dhclient udp 0 0 0.0.0.0:3577 0.0.0.0:* 1551/dhclient udp 0 0 0.0.0.0:5353 0.0.0.0:* 1356/avahi-daemon: udp6 0 0 :::64065 :::* 1551/dhclient
系统用户通常保存在 /etc/passwd, /etc/shadow文件内,所以我们需要迁移用户数据到openldap数据库。但是LDAP只能识别特定格式的文件,即后缀为 ldif 的文件(也是文本文件),所以不能直接使用 /etc/passwd, /etc/shadow直接导入。 最简单的方法是使用padl提供的迁移工具包,是一系列perl编写的脚本, migrationtools 工具,之前的openldap包中已经包含了这些脚本,但是在redhat6.5中已经没有了,要单独下载。
- 安装配置 migrationtools
[root@localhost openldap]# yum install -y migrationtools
- 切换到 migrationtool 目录下,进行基本配置
编辑修改 migrate_common.ph 下划线部分 [root@localhost openldap]# vim /usr/share/migrationtools/migrate_common.ph ... # Default DNS domain $DEFAULT_MAIL_DOMAIN = "test.com"; # Default base $DEFAULT_BASE = "dc=test,dc=com"; ....... 保存退出。
- 生成 ldif 文件与导入用户测试
- 在目录MigrationTools里面使用migrate_base.pl脚本生成基本的数据结构,并导入查询数据库
使用migrate_base.pl脚本生成基本的数据结构 [root@localhost openldap]# /usr/share/migrationtools/migrate_base.pl > /tmp/base.ldif 导入数据: ## -w 指定你在slapd.conf中设置的管理员密码,也可以使用 -W,交互式输入密码 ## -f 指定数据文件的路径 ## 我们之前设定的密码: LDAP123 # ldapadd -x -D "cn=Manager,dc=test,dc=com" -w LDAP123 -f /tmp/base.ldif 查询已经导入数据库的数据: ldapsearch -x -D "cn=Manager,dc=test,dc=com" -w LDAP123 -b "dc=test,dc=com" -H ldap://192.168.75.226:389
- 在目录MigrationTools里面使用migrate_passwd.pl 和 migrate_group.pl 脚本将 /etc/passwd, /etc/group文件中的用户转化为 ldap 可以识别的数据结构 ldif 格式的文件并导入数据。
[root@localhost openldap]# /usr/share/migrationtools/migrate_passwd.pl /etc/passwd /tmp/passwd.ldif [root@localhost openldap]# /usr/share/migrationtools/migrate_group.pl /etc/group /tmp/group.ldif 导入数据: # ldapadd -x -D "cn=Manager,dc=test,dc=com" -w LDAP123 -f /tmp/passwd.ldif # ldapadd -x -D "cn=Manager,dc=test,dc=com" -w LDAP123 -f /tmp/group.ldif
- 在实际生产环境中,并不会把 /etc/passwd 和 /etc/group 中的用户全部用 ldap 管理起来, 我们只需要让实际用户被 ldap 管理即可,所以生产中按照如下规则操作:
- 删除 ldap 数据库中的所有数据:
[root@localhost openldap]# ldapdelete -x -D "cn=Manager,dc=test,dc=com" -w LDAP123 -r "dc=test,dc=com"
- 建立测试用户 ldapuser01, ldapuser02,把这两个用户导入ldap数据库中
[root@localhost openldap]# useradd ldapuser01 [root@localhost openldap]# useradd ldapuser02 [root@localhost openldap]# passwd ldapuser01 [root@localhost openldap]# passwd ldapuser02 我们只把需要的用户导入 ldap 数据库中 [root@localhost openldap]# grep ldap* /etc/passwd > /tmp/passwd [root@localhost openldap]# grep ldap* /etc/group > /tmp/group [root@localhost openldap]# /usr/share/migrationtools/migrate_base.pl > /tmp/base.ldif [root@localhost openldap]# /usr/share/migrationtools/migrate_passwd.pl /tmp/passwd > /tmp/passwd.ldif [root@localhost openldap]# /usr/share/migrationtools/migrate_group.pl /tmp/group > /tmp/group.ldif [root@localhost openldap]# ldapadd -x -D "cn=Manager,dc=test,dc=com" -w LDAP123 -f /tmp/base.ldif [root@localhost openldap]# ldapadd -x -D "cn=Manager,dc=test,dc=com" -w LDAP123 -f /tmp/passwd.ldif [root@localhost openldap]# ldapadd -x -D "cn=Manager,dc=test,dc=com" -w LDAP123 -f /tmp/group.ldif
- 查询添加的OpenLDAP 用户信息
[root@localhost openldap]# ldapsearch -LLL -x -D 'CN=Manager,DC=test,DC=com' -w LDAP123 -b 'dc=test,dc=com' 'uid=ldapuser01' dn: uid=yangl,ou=People,dc=test,dc=com uid: ldapuser01 cn: ldapuser01 objectClass: account objectClass: posixAccount objectClass: top objectClass: shadowAccount userPassword:: e2NyeXB0fSQ2JFBwcHRSWkk3JExMN2hFOW9xYTI1Sm9aOC5hR3BJV0FyR3VIb2M xODVMVzU2dkFBL2lOZGZmL2I5TnBRQjNWOVJDYWRmb0wxUEdpcHhpMnY1RjBLckpkeDFyRjV5ZkEu shadowLastChange: 17519 shadowMin: 0 shadowMax: 99999 shadowWarning: 7 loginShell: /bin/bash uidNumber: 1001 gidNumber: 1001 homeDirectory: /home/ldapuser01
- 删除 ldap 数据库中的所有数据:
- 在目录MigrationTools里面使用migrate_base.pl脚本生成基本的数据结构,并导入查询数据库
- 至此,我们就把用户导入到OpenLDAP数据库中了。
- 启动 LDAP 的 slapd 服务 报错:
[root@localhost openldap]# service slapd start Redirecting to /bin/systemctl start slapd.service Job for slapd.service failed because the control process exited with error code. See "systemctl status slapd.service" and "journalctl -xe" for details. [root@localhost openldap]# journalctl -xe -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit slapd.service has failed. -- -- The result is failed. 1月 03 15:31:12 localhost.localdomain systemd[1]: Unit slapd.service entered failed state. 1月 03 15:31:12 localhost.localdomain systemd[1]: slapd.service failed. 1月 03 15:31:12 localhost.localdomain polkitd[1370]: Unregistered Authentication Agent for unix-process:23965:119404005 (system bus name :1.4973, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale zh 1月 03 15:32:57 localhost.localdomain polkitd[1370]: Registered Authentication Agent for unix-process:24047:119414493 (system bus name :1.4974 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesk 1月 03 15:32:57 localhost.localdomain systemd[1]: Starting OpenLDAP Server Daemon... -- Subject: Unit slapd.service has begun start-up -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit slapd.service has begun starting up. 1月 03 15:32:57 localhost.localdomain runuser[24068]: pam_unix(runuser:session): session opened for user ldap by (uid=0) 1月 03 15:32:57 localhost.localdomain runuser[24068]: pam_unix(runuser:session): session closed for user ldap 1月 03 15:32:57 localhost.localdomain slapcat[24072]: DIGEST-MD5 common mech free 1月 03 15:32:57 localhost.localdomain runuser[24079]: pam_unix(runuser:session): session opened for user ldap by (uid=0) 1月 03 15:32:57 localhost.localdomain runuser[24079]: pam_unix(runuser:session): session closed for user ldap 1月 03 15:32:57 localhost.localdomain check-config.sh[24064]: Read/write permissions for DB file '/var/lib/ldap/alock' are required. 1月 03 15:32:57 localhost.localdomain runuser[24081]: pam_unix(runuser:session): session opened for user ldap by (uid=0) 1月 03 15:32:57 localhost.localdomain runuser[24081]: pam_unix(runuser:session): session closed for user ldap 1月 03 15:32:57 localhost.localdomain check-config.sh[24064]: Read/write permissions for DB file '/var/lib/ldap/__db.001' are required. 1月 03 15:32:57 localhost.localdomain runuser[24083]: pam_unix(runuser:session): session opened for user ldap by (uid=0) 1月 03 15:32:57 localhost.localdomain runuser[24083]: pam_unix(runuser:session): session closed for user ldap 1月 03 15:32:57 localhost.localdomain check-config.sh[24064]: Read/write permissions for DB file '/var/lib/ldap/__db.002' are required. 1月 03 15:32:57 localhost.localdomain runuser[24085]: pam_unix(runuser:session): session opened for user ldap by (uid=0) 1月 03 15:32:57 localhost.localdomain runuser[24085]: pam_unix(runuser:session): session closed for user ldap 1月 03 15:32:57 localhost.localdomain check-config.sh[24064]: Read/write permissions for DB file '/var/lib/ldap/__db.003' are required. 1月 03 15:32:57 localhost.localdomain systemd[1]: slapd.service: control process exited, code=exited status=1 1月 03 15:32:57 localhost.localdomain systemd[1]: Failed to start OpenLDAP Server Daemon. -- Subject: Unit slapd.service has failed -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit slapd.service has failed. -- -- The result is failed. 1月 03 15:32:57 localhost.localdomain systemd[1]: Unit slapd.service entered failed state. 1月 03 15:32:57 localhost.localdomain systemd[1]: slapd.service failed. 1月 03 15:32:57 localhost.localdomain polkitd[1370]: Unregistered Authentication Agent for unix-process:24047:119414493 (system bus name :1.4974, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale zh
原因:数据库文件访问权限问题:
[root@localhost var]# cd lib/ldap/ [root@localhost ldap]# ll 总用量 1316 -rw-r--r--. 1 root root 2048 1月 3 09:23 alock #发现db文件都是root权限的 -rw-------. 1 root root 1597440 1月 3 09:23 __db.001 -rw-------. 1 root root 131072 1月 3 09:23 __db.002 -rw-------. 1 root root 49152 1月 3 09:23 __db.003 -rw-r--r--. 1 root root 845 1月 3 15:19 DB_CONFIG [root@localhost ldap]# chown -R ldap:ldap /var/lib/ldap/* #把文件权限改为ldap的 [root@localhost ldap]# ll 总用量 1316 -rw-r--r--. 1 ldap ldap 2048 1月 3 09:23 alock -rw-------. 1 ldap ldap 1597440 1月 3 09:23 __db.001 -rw-------. 1 ldap ldap 131072 1月 3 09:23 __db.002 -rw-------. 1 ldap ldap 49152 1月 3 09:23 __db.003 -rw-r--r--. 1 ldap ldap 845 1月 3 15:19 DB_CONFIG [root@localhost ldap]# service slapd start #重新启动 LDAP 的 slapd 服务,问题解决 Redirecting to /bin/systemctl start slapd.service
- 当执行ldapsearch -x –LLL 时报错:
当执行ldapsearch -x –LLL 显示如下结果时,可采用如下方法进行解决。
故障描述[root@localhost ldap]# ldapsearch -x -LLL No such object (32)
故障分析
当使用ldapsearch 查询目录树条目时,ldapsearch 会通过/etc/openldap/ldap.conf 配置文件读取base 和url 值进行查询。默认没有配置这两项,所以需要添加base 和url。
解决方法:
编辑/etc/openldap/ldap.conf 文件,添加如下内容。[root@localhost ldap]# vim /etc/openldap/ldap.conf ...... BASE dc=test,dc=com #suffix 域名 URI ldap://192.168.218.206 #服务器地址或使用域名形式(能够解析即可) ....... 保存退出,问题解决
博客主要来源于网上博客的收集整理,以及自己的感悟,下面是各自的链接:
http://blog.51cto.com/skypegnu1/1939302 *
http://book.51cto.com/art/201602/505720.htm *
https://www.cnblogs.com/lemon-le/p/6266921.html *
http://blog.csdn.net/ztq157677114/article/details/50538176 *
http://www.linuxidc.com/Linux/2016-08/134227.htm
https://www.cnblogs.com/penghaihang/p/7229031.html?utm_source=itdadao&utm_medium=referral
http://blog.csdn.net/u010098331/article/details/51879549
http://blog.csdn.net/chenjh213/article/details/50539904
http://blog.csdn.net/u010098331/article/details/51879549
http://blog.csdn.net/qiang359503893/article/details/44858491
http://blog.chinaunix.net/uid-641896-id-338502.html
http://blog.csdn.net/lclansefengbao/article/details/50437240 *检查错误https://segmentfault.com/a/1190000002607140 ** 概念
https://github.com/PacificBiosciences/SMRT-Link/wiki/SMRT-Link-User-Authentication-and-Roles *
https://github.com/PacificBiosciences/SMRT-Link/issues/69 ***
尊重他人劳动成果,转载请注明出处:Bluesky's blog » LDAP安装配置