参考资料
官网:http://www.openldap.org/
https://www.linuxidc.com/Linux/2016-08/134225.htm
http://v.colinlee.fish/posts/openldap-on-centos-7-speedy-tutorial.html
安装berkeley-db
wget http://download.oracle.com/berkeley-db/db-5.1.29.tar.gz ----openldap2.4.46版本只支持bdb4.8,4.9.5.0,5.1
yum install gcc-c++ gcc make -y
tar xf db-5.1.29.tar.gz
cd db-5.1.29/build_unix/
../dist/configure --prefix=/usr/local/berkeleydb
make
make install
添加bdb库文件到系统
echo "/usr/local/berkeleydb/lib/" >> /etc/ld.so.conf
ldconfig -v
安装依赖包
yum install -y libtool-ltdl libtool-ltdl-devel openssl openssl-devel cyrus-sasl-devel tcp_wrappers tcp_wrappers-devel
安装openldap
wget ftp://ftp.ntua.gr/mirror/OpenLDAP/openldap-release/openldap-2.4.46.tgz
tar xf openldap-2.4.46.tgz
cd openldap-2.4.46
./configure --prefix=/usr/local/openldap --enable-dynamic --disable-static --enable-syslog --enable-crypt --enable-modules --enable-wrappers --enable-overlays --enable-ldap --enable-accesslog --enable-debug --with-cyrus-sasl --with-tls CPPFLAGS=-I/usr/local/berkeleydb/include/ LDFLAGS=-L/usr/local/berkeleydb/lib/
make depend
make
make test (时间很长!!!)
make install
说明:–enable-overlays会安装所有模块到slapd中,会带有memberof属性,不需要单独添加memberof模块,需要配置文件中添加:overlay memberof,来开启
配置PATH变量
vim /etc/profile
export PATH=$PATH:/usr/local/openldap/bin:/usr/local/openldap/libexec:/usr/local/openldap/sbin
说明
bin/ --客户端工具如ldapadd、ldapsearch
etc/ --包含主配置文件slapd.conf、schema、DB_CONFIG等
include/
lib/
libexec/ --服务端启动工具slapd
sbin/ --服务端工具如slappasswd
share/
var/ --bdb数据、log存放目录
系统配置
ldap的配置按照以下步骤进行
1、设置超级密码
2、导入schema
3、设置根域,设置根域数据库管理员.根域可以设置多个.
4、创建用户节点、组节点和数据库超级管理员 --------到这一步结束系统就可以用ldap客户端访问了.
6、配置证书
7、设置索引
8、设置日志服务
9、添加写入和只读用户,并设置access权限
10、配置启动脚本
11、配置最多可查询的条目数
第一步、设置超级密码rootpw
slappasswd -s root@123 ----这个会得到一个加密后的密码,也可以不用 -s参数,用交互的方式得到加密密码
{SSHA}yA2ZeZhAn+ekDAt8bmac30tNKGyFgPeM
vim chrootpw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}yA2ZeZhAn+ekDAt8bmac30tNKGyFgPeM
手动启动openldap
slapd -d 256 -h "ldap:/// ldapi:///"
ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
这个rootpw在后面的过程中没有用过,他是“上帝”,知道他存在,但是谁也没见过
命令报错:ldap_modify: Insufficient access (50)
解决ldap_modify: Insufficient access (50)报错
1、生成cn=config配置文件
生成之前生添加开启:memberof功能
vim /usr/local/openldap/etc/openldap/slapd.conf
#配置文件最后添加
overlay memberof
mkdir /usr/local/openldap/etc/openldap/slapd.d
slaptest -f /usr/local/openldap/etc/openldap/slapd.conf -F /usr/local/openldap/etc/openldap/slapd.d #需要启动过slapd
会生成:slapd.d/cn=config/olcDatabase={1}mdb/olcOverlay={0}memberof.ldif配置文件
2、修改权限
vim /usr/local/openldap/etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage by * none ----将默认olcAccess: {0}to * by * none修改为此
3、添加设置管理员配置到配置文件
slapd -d 256 -h "ldap:/// ldapi:///" #重新启动
ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
第二步、导入schema
文件都在 /usr/local/openldap/etc/openldap/schema 目录下,按以下命令导入
ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/local/openldap/etc/openldap/schema/core.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/local/openldap/etc/openldap/schema/corba.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/local/openldap/etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/local/openldap/etc/openldap/schema/dyngroup.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/local/openldap/etc/openldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/local/openldap/etc/openldap/schema/java.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/local/openldap/etc/openldap/schema/misc.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/local/openldap/etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /usr/local/openldap/etc/openldap/schema/openldap.ldif
第三步、 设置根域,设置根域超级数据库管理员
我们的根域是dc=pre,dc=venusgroup,dc=com,dc=cn
设置管理分支:cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn
超级数据库管理员:cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn
用slappasswd 命令获取加密密码
slappasswd -s root@123 ---这个和上面的rootpw不是一回事
{SSHA}qNSHe8yf9KpCZ2nk3FbeiXuFAseLffHn
vim domain-dbadmin.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to *
by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
by dn.base="cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" read
by * none
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=pre,dc=venusgroup,dc=com,dc=cn
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}inUp+4g6ISHw0hb639Ey1n5mlL+KlSQP
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
by dn="cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" write
by anonymous auth
by self write
by * none
olcAccess: {1}to dn.base=""
by * read
olcAccess: {2}to *
by dn="cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" write
by * read
注:
1、dn: olcDatabase={0}config,cn=config dn: olcDatabase={1}mdb,cn=config 这里面的{0}config,{1}mdb,要和/etc/openldap/slapd.d/cn=config 目录下的内容一样,每次安装这些值可能是有差异的.
2、olcAccess: {1}to dn.base=""
by * read 这种地方的换行要注意,前面有2个空格.
ldapmodify -Y EXTERNAL -H ldapi:/// -f domain-dbadmin.ldif
第四步、创建用户节点、组节点和数据库超级管理员
vim basedomain.ldif
dn: dc=pre,dc=venusgroup,dc=com,dc=cn
objectClass: top
objectClass: dcObject
objectclass: organization
o: venusgroup
dn: cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn
objectClass: organizationalRole
cn: manager
dn: cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn
objectClass: organizationalRole
cn: admin
description: Directory Administrator
ldapadd -x -D cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn -W -f basedomain.ldif
输入之前明文密码. ------- 先设置密码,然后才用这个密码去创建相关条目.
配置启动脚本
useradd ldap -s /sbin/nologin
chown -R ldap.ldap /usr/local/openldap/
chown ldap.ldap /var/log/slapd.log
vim /usr/lib/systemd/system/slapd.service
[Unit]
Description=OpenLDAP Server Daemon
After=syslog.target network-online.target
Documentation=man:slapd
Documentation=man:slapd-config
Documentation=man:slapd-hdb
Documentation=man:slapd-mdb
Documentation=file:///usr/share/doc/openldap-servers/guide.html
[Service]
Type=forking
PIDFile=/usr/local/openldap/var/run/slapd.pid
Environment="SLAPD_URLS=ldap:/// ldaps:/// ldapi:///" "SLAPD_OPTIONS="
#EnvironmentFile=/etc/sysconfig/slapd
#ExecStartPre=/usr/libexec/openldap/check-config.sh
ExecStart=/usr/local/openldap/libexec/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start slapd
systemctl status slapd
systemctl enable slapd
设置索引
vim index.ldif
dn: olcDatabase={1}mdb, cn=config
changetype: modify
replace: olcDbIndex
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
olcDbIndex: uid,memberUid,nisMapName,nisMapEntry pres,eq,sub
olcDbIndex: entryCSN,entryUUID eq
olcDbIndex: memberOf eq
注:以上添加的索引是根据官网介绍和系统在运行时的报错,整理添加的。
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub 为ou,cn,mail,surname,givenname 几个属性,添加eq,pres,sub几个类型的索引。
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f index.ldif
查看是否生效
ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config '(olcDatabase={0}mdb)' olcDbIndex
设置日志服务
vim loglevel.ldif
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f loglevel.ldif
配置rsyslog服务
vim /etc/rsyslog.conf +73
# 设置如下 ---注意/var前面的 -,那是按照官网的介绍,加上可以提升日志效率
local4.* -/var/log/slapd.log
systemctl restart rsyslog.service
systemctl restart slapd.service
chown ldap:ldap /var/log/slapd.log
添加写入和只读用户,并设置access权限
为了第三方系统写入或者读取ldap中的数据,需要在管理分支上建立两个用户,写用户和只读用户
先用 slappasswd -s 明文密码 得到两个用户的加密密码
slappasswd -s 123456
{SSHA}Wyef/nPYOC3vf3fVtx4g6h4bR5gz1yXn
添加用户
vim adduser.ldif
dn: cn=readonly,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn
cn: readonly
objectClass: person
sn: readonly
userPassword: {SSHA}Wyef/nPYOC3vf3fVtx4g6h4bR5gz1yXn
dn: cn=writeuser,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn
cn: writeuser
objectClass: person
sn: writeuser
userPassword: {SSHA}Wyef/nPYOC3vf3fVtx4g6h4bR5gz1yXn
ldapadd -x -D cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn -W -f adduser.ldif
设置用户权限
vim addaccess.ldif
dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
by dn="cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" write
by dn="cn=readonly,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" read
by dn="cn=writeuser,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" write
by anonymous auth
by self write
by * none
olcAccess: {1}to dn.base=""
by * read
olcAccess: {2}to *
by dn="cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" write
by dn="cn=readonly,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" read
by dn="cn=writeuser,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" write
by * read
olcAccess: {3}to dn.subtree="dc=pre,dc=venusgroup,dc=com,dc=cn" attrs=userPassword
by self write
by anonymous auth
by dn="cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" write
by dn="cn=readonly,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" read
by dn="cn=writeuser,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" write
by * none
olcAccess: {4}to dn.subtree="dc=pre,dc=venusgroup,dc=com,dc=cn"
by self write
by dn="cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" write
by dn="cn=readonly,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" read
by dn="cn=writeuser,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" write
by * read
ldapmodify -Y EXTERNAL -H ldapi:/// -f addaccess.ldif
配置最多可查询的条目数
vim olcSizeLimit.ldif
dn: cn=config
changetype: modify
replace: olcSizeLimit
olcSizeLimit: 5000
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f olcSizeLimit.ldif
到这里可以做主从了
系统验证
1、添加用户
vim add-user.ldif
dn: uid=5004439,dc=pre,dc=venusgroup,dc=com,dc=cn
uid: 5004439
cn: 5004439
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {SSHA}Wyef/nPYOC3vf3fVtx4g6h4bR5gz1yXn
shadowLastChange: 17781
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 10000
gidNumber: 10000
homeDirectory: /home/5004439
ldapadd -x -W -D cn=writeuser,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn -f add-user.ldif
2、添加member组(组下用户会自己创建memberof属性)
vim mem-group.ldif
dn: cn=test,dc=pre,dc=venusgroup,dc=com,dc=cn
objectClass: groupOfNames
cn: test
member: uid=5004439,dc=pre,dc=venusgroup,dc=com,dc=cn
ldapadd -x -W -D cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn -f mem-group.ldif
注意:正常情况下只要member组添加了member属性,对应的用户条目中会自动添加memberof属性。线上环境和pre环境都未正常自动添加memberof属性,可能是memberof模块不正常。44.20上正常自动添加
3、手动为用户添加memberof属性(memberof属性会自己添加不需要手动)
dn: uid=john1,dc=pre,dc=venusgroup,dc=com,dc=cn
cn: John Doe
givenName: John1
sn: Doe
uid: john1
uidNumber: 5000
gidNumber: 1000
userPassword: {SHA}M6XDJwA47cNw9gm5kXV1uTQuMoY=
homeDirectory: /home/john1
mail: john1.doe@example.com
memberOf: cn=memtest,dc=pre,dc=venusgroup,dc=com,dc=cn
objectClass: top
objectClass: posixAccount
objectClass: inetOrgPerson
注意:memberOf属性会隐藏,可以通过搜索命令搜索
ldapsearch -x -D 'cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn' -W -b 'dc=pre,dc=venusgroup,dc=com,dc=cn' 'memberOf=cn=memtest,dc=pre,dc=venusgroup,dc=com,dc=cn'
ldapsearch -x -D 'cn=admin,cn=manager,dc=venusgroup,dc=com,dc=cn' -W -b 'dc=venusgroup,dc=com,dc=cn' 'uid=5004439' memberOf #显示指定用户的memberOf属性
4、为以有用户添加memberof属性
dn: uid=5002272,cn=yunwei,dc=venusgroup,dc=com,dc=cn
changetype: modify
add: memberOf
memberOf: cn=elk,dc=venusgroup,dc=com,dc=cn
memberOf: cn=abc,dc=venusgroup,dc=com,dc=cn #可添加多个,且值可为不存在的组
ldapadd -x -W -D cn=admin,cn=manager,dc=venusgroup,dc=com,dc=cn -f elk-add-user.ldif
5、官方memberof示例(可以不做)
dn: ou=Group,dc=venusgroup,dc=com,dc=cn
objectclass: organizationalUnit
ou: Group
dn: ou=People,dc=venusgroup,dc=com,dc=cn
objectclass: organizationalUnit
ou: People
dn: uid=memtest,ou=People,dc=venusgroup,dc=com,dc=cn
objectclass: account
uid: memtest
dn: cn=memgroup,ou=Group,dc=venusgroup,dc=com,dc=cn
objectclass: groupOfNames
cn: memgroup
member: uid=memtest,ou=People,dc=venusgroup,dc=com,dc=cn
member: uid=5004439,ou=People,dc=venusgroup,dc=com,dc=cn
6、向已存在memberof组中添加用户
dn: cn=mem,ou=test,dc=pre,dc=venusgroup,dc=com,dc=cn
changetype: modify
add: member
member: uid=john1,ou=test,dc=pre,dc=venusgroup,dc=com,dc=cn
member: uid=5004439,ou=test,dc=pre,dc=venusgroup,dc=com,dc=cn
删除某属性:只需把add: member,改为delete: member
禁止匿名登录
vim disable_anon.ldif
dn: cn=config
changetype: modify
add: olcDisallows
olcDisallows: bind_anon
dn: cn=config
changetype: modify
add: olcRequires
olcRequires: authc
dn: olcDatabase={-1}frontend,cn=config
changetype: modify
add: olcRequires
olcRequires: authc
ldapmodify -Y EXTERNAL -H ldapi:/// -f disable_anon.ldif
测试是否生效
ldapsearch -x -b "dc=pre,dc=venusgroup,dc=com,dc=cn" -H ldap://192.168.44.123
ldap_bind: Inappropriate authentication (48)
additional info: anonymous bind disallowed
安装LDAP控制台
安装httpd
yum -y install httpd
修改配置文件
vim /etc/httpd/conf/httpd.conf
AllowOverride All
启动服务测试
systemctl start httpd
systemctl enable httpd
测试
curl 127.0.0.1
安装phpldapadmin
yum install phpldapadmin
修改配置文件
vim /etc/phpldapadmin/config.php
#添加
$servers->setValue('server','host','127.0.0.1');
$servers->setValue('server','port',389);
$servers->setValue('server','base',array('dc=pre,dc=venusgroup,dc=com,dc=cn'));
$servers->setValue('login','auth_type','session');
#注释以下两个
//$servers->setValue('login','attr','dn');
// $servers->setValue('login','attr','uid');
修改httpd配置文件
vim /etc/httpd/conf.d/phpldapadmin.conf
Alias /phpldapadmin /usr/share/phpldapadmin/htdocs
Alias /ldapadmin /usr/share/phpldapadmin/htdocs
<Directory /usr/share/phpldapadmin/htdocs>
<IfModule mod_authz_core.c>
# Apache 2.4
Require all granted
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from ::1
</IfModule>
</Directory>
重启httpd服务
访问测试
http://192.168.0.41/phpldapadmin
cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn
附
#查询所有用户
ldapsearch -x -D "cn=admin,cn=manager,dc=pre,dc=venusgroup,dc=com,dc=cn" -w 密码 -b "dc=pre,dc=venusgroup,dc=com,dc=cn" -H ldap://192.168.41.13:389