OpenLDAP 服务器配置介绍与ldif 文件格式示例

二、 OpenLDAP 服务器配置介绍:

查看OpenLDAP 服务器配置

注意:如果编译安装,需指定 --enable-module 才会有该配置文件,如果yum安装,需在ldif文件开启

1.1 配置语法:

LDIF文件的一般规则适用于配置信息:

配置LDIF的总布局如下:

1.2 全局配置

dn: cn=config

1.3 modules 配置

dn: cn=module,cn=config

1.4. schema 定义

dn: cn=schema,cn=config

1.5 全局数据配置

dn: olcDatabase=config,cn=config

1.6 数据库监控

dn: olcDatabase=monitor,cn=config

1.7 后端数据库

dn: olcDatabase=hdb,cn=config

注:

二、 配置介绍:

点击参考 :https://www.openldap.org/software/man.cgi?query=slapd-config&sektion=5&apropos=0&manpath=OpenLDAP+2.4-Release

2.1 cn=config :

此条目中包含的指令通常适用于整个服务器。它们大多数是面向系统或连接的,而不是与数据库相关的。该条目必须具有olcGlobal 对象类

修改 slapd.ldif 文件,第16行的 'olcTLSCertificateKeyFile: /etc/openldap/certs/password' 后面添加下面内容

olcLogLevel: Stats
olcReferral: ldap://root.openldap.org

2.2 定义全局示例:

dn: cn=config
objectClass: olcGlobal
cn: config
olcIdleTimeout: 30
olcLogLevel: Stats
olcReferral: ldap://root.openldap.org

2.3 cn=module

olcModulepath: 模块目录
olcModuleload: 载入指定模块

修改第40行,开启模块

#dn: cn=module,cn=config
#objectClass: olcModuleList
#cn: module
#olcModulepath: /usr/lib/openldap
#olcModulepath: /usr/lib64/openldap

修改为:

dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
#olcModulepath: /usr/lib/openldap
olcModulepath: /usr/lib64/openldap

修改完后,启动服务会自动创建一个空白的配置文件夹

2.4 cn=schema

include: 指定schema 配置文件,具体定义的值包含在配置 文件中

2.5 olcAccess :

定义数据库的访问权限

后端数据库 :

目前主要支持两种:
bdb/hdb , 新版本已废弃
mdb

示例 :

2.6 olcBackend: hdb

其它几个比较特殊的配置选项:不受olcAccess权限的影响,它具有全局的权限
olcRootDN:DN不必引用数据库中的条目,甚至不必引用目录中的条目。
olcRootPW: 密码,可以是明文,也可以是密文
olcSizeLimit: 该指令指定从搜索操作返回的条目的最大数量。
olcSuffix: 此指令指定将传递到此后端数据库的查询的DN后缀。
olcTimeLimit: 该指令指定slapd响应搜索请求的最大秒数。如果请求在此时间内未完成,将返回一个指示超时的结果。

示例 :

olcSuffix: dc=fooher,dc=com
olcrootDN: cn=fooheradmin,dc=fooher,dc=com
olcRootPW: {SSHA}AEK7muhMQtJIcAqhyp4369HGFZF/5j5y
olcSizeLimit: 500

2.7 olcSyncrepl

该配置段定义复制策略,主要用于多节点之间的复制:参数比较多,参考:

https://www.openldap.org/software/man.cgi?query=slapd-config&sektion=5&apropos=0&manpath=OpenLDAP+2.4-Release

2.8 BDB/HDB

olcDbDirectory: 数据目录
olcDbCachesize:指定BDB后端数据库实例维护的内存缓存条目的大小。
olcDbCheckpoint: 该指令指定对BDB事务日志进行检查点的频率。检查点操作将数据库缓冲区刷新到磁盘,并在日志中
写入检查点记录。例: olcDbCheckpoint: 1024 10 // 缓存1M或者10分钟,写入一次

2.9 DB_CONFIG

此属性指定要放置在数据库目录的DB_CONFIG文件中的配置指令。在服务器启动时,如果还不存在这样的文件,那么
将创建DB_CONFIG文件,并将此属性中的设置写入该文件。如果文件存在,它的内容将被读取并显示在该属性中。属
性是多值的,以适应多个配置指令。没有提供默认值,但是这里必须使用适当的设置来获得最佳的服务器性能。

三、OpenLDAP 常用ldif文件编写与migrationtools 导入系统账号

ldif 文件格式示例:

参考链接:http://www.openldap.org/software//man.cgi?query=LDIF&sektion=5&apropos=0&manpath=OpenLDAP+2.4-Release#end

3.1 用户和组

通过 修改 migrationtools 模板文件生成LDIF文件
ls /usr/share/migrationtools/
migrate_aliases.pl              migrate_automount.pl        migrate_networks.pl
migrate_all_netinfo_offline.sh  migrate_base.pl             migrate_passwd.pl
migrate_all_netinfo_online.sh   migrate_common.ph           migrate_profile.pl
migrate_all_nis_offline.sh      migrate_fstab.pl            migrate_protocols.pl
migrate_all_nis_online.sh       migrate_group.pl            migrate_rpc.pl
migrate_all_nisplus_offline.sh  migrate_hosts.pl            migrate_services.pl
migrate_all_nisplus_online.sh   migrate_netgroup.pl         migrate_slapd_conf.pl
migrate_all_offline.sh          migrate_netgroup_byhost.pl
migrate_all_online.sh           migrate_netgroup_byuser.pl

3.2 修改配置文件

备份 migrate_common.ph 文件

修改 migrate_common.ph 文件
/bin/cp /usr/share/migrationtools/migrate_common.ph{,_bak}
vim /usr/share/migrationtools/migrate_common.ph
$DEFAULT_MAIL_DOMAIN = "fooher.com";
$DEFAULT_BASE = "dc=fooher,dc=com";
$EXTENDED_SCHEMA = 1;

用 migrationtools 生成用户基础的数据导入数据库文件

/usr/share/migrationtools/migrate_base.pl > /etc/openldap/ldif/base.ldif

并把base.ldif里将不要的条目删除,只留People, Group

dn: ou=People,dc=fooher,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: ca.fooher.com

dn: ou=Group,dc=fooher,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit
objectClass: domainRelatedObject
associatedDomain: ca.fooher.com

然后通过ldapadd导入LDAP

ldapadd -x -W -D "cn=fooheradmin,dc=fooher,dc=com" -f /etc/openldap/ldif/base.ldif

如果这里一直报错,提示已经存在:

Enter LDAP Password:
adding new entry "dc=fooher,dc=com"
ldap_add: Already exists (68)

可以通过 -c 参数,强制添加,就可以了,当然也可以

ldapadd -x -c -W -D "cn=fooheradmin,dc=fooher,dc=com" -f base.ldif

或者在 base.ldif 文件里的第一个条目把注释掉:

# dn: dc=fooher,dc=com
# dc: fooher
# objectClass: top
# objectClass: domain
# objectClass: domainRelatedObject
# associatedDomain: ldap.fooher.com

3.3 分别导出系统5个用户和5个组

cd /etc/openldap/ldif
tail -n 5 /etc/passwd > system_user
tail -n 5 /etc/group > system_group

3.4 将系统用户和组转换为ldif格式文件

密码文件导进去
/usr/share/migrationtools/migrate_passwd.pl /etc/openldap/ldif/system_user user.ldif
所属组导进去
/usr/share/migrationtools/migrate_group.pl /etc/openldap/ldif/system_group group.ldif

3.5 导入到 openldap 里

可以先删除 group.ldif 和 user.ldif 文件里的系统不需要的用户组和账号 然后把所属组导进去 再导用户

ldapadd -x -W -D "cn=fooheradmin,dc=fooher,dc=com" -f group.ldif
ldapadd -x -W -D "cn=fooheradmin,dc=fooher,dc=com" -f user.ldif

需要输入密码的 密码就是之前设置的

3.6 检查相关用户是否导入成功 里

ldapsearch -LLL -x -D "cn=fooheradmin,dc=fooher,dc=com" -W -b 'dc=fooher,dc=com' 'uid=ldap'
Enter LDAP Password:
dn: uid=ldap,ou=People,dc=fooher,dc=com
uid: ldap
cn: OpenLDAP server
givenName: OpenLDAP
sn: server
mail: ldap@fooher.com
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword:: e2NyeXB0fSEh
shadowLastChange: 18712
loginShell: /sbin/nologin
uidNumber: 55
gidNumber: 55
homeDirectory: /var/lib/ldap
gecos: OpenLDAP server

3.7 手动创建用户

cat << EOF | ldapadd -x -W -D cn=fooheradmin,dc=fooher,dc=com
dn: cn=foohercom,ou=people,dc=fooher,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: person
objectClass: top
cn: foohercom
sn: com
givenName: com
uid: loginname
uidNumber: 1000
gidNumber: 500
gecos: miaoshu
homeDirectory: /home/foohercom
loginShell: /bin/bash
userPassword: {SSHA}0yaWMzjeuDBghcqsp2kg6xA+AfAG6SSQ
EOF

3.8 创建组

cat << EOF | ldapadd -x -W -D cn=fooheradmin,dc=fooher,dc=com
dn: cn=admin,ou=group,dc=fooher,dc=com
objectClass: posixGroup
cn: admin
gidNumber: 3001
EOF

3.9 初始化域

cat << EOF | ldapadd -x -W -D cn=fooheradmin,dc=fooher,dc=com
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=fooheradmin,dc=fooher,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=fooher,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=fooheradmin,dc=fooher,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}0yaWMzjeuDBghcqsp2kg6xA+AfAG6SSQ

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
  dn="dc=fooher,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=fooheradmin,dc=fooher,dc=com" write by * read
EOF

4.0 日志修改

版本 1:

dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: stats

版本 2:

dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: any

4.1 OpenLDAP 日志配置

mkdir -p /var/log/slapd
touch /var/log/slapd/slapd.log
chown ldap:ldap -R /var/log/slapd
cat > /etc/openldap/ldif/log.ldif << EOF
dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: stats
EOF

这里只能在root用户执行这个命令,普通用户无权限

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/ldif/log.ldif

fooher.com OpenLDAP 导入日志配置

查看配置文件是否添加成功,这里要在全局里找

cat /etc/openldap/slapd.d/cn\=config.ldif

fooher.com  OpenLDAP 日志配置

4.2 rsyslog 日志配置

在 /etc/rsyslog.conf 文件第78行 local7 下面添加

local4.*                                                /var/log/slapd/slapd.log

或者使用 sed

sed -i "/^local7/ a local4.*                                                /var/log/slapd/slapd.log " /etc/rsyslog.conf

重启日志服务

systemctl restart rsyslog
systemctl restart slapd

查看 OpenLDAP 日志

cat /var/log/slapd/slapd.log

4.3 日志切割

注意:在环境中,注释要删除掉,不然会报错

cat > /etc/logrotate.d/slapd << EOF
/var/log/slapd/slapd.log {
    daily             # 每天轮询一次
    rotate 5          # 保存5个历史日志文件,超过的删除
    copytruncate      # 复制源日志内容后,清空文件,而不是创建新文件
    dateext           # 切割文件时,文件名带有日期
    missingok         # 如果指定的目录不存在,会报错,此选项用来抑制报错
}
EOF

重启服务

systemctl restart rsyslog
systemctl restart slapd

测试是否切割成功

logrotate -f /etc/logrotate.d/slapd /var/log/slapd/slapd.log

测试日志输出是否正常

ldapsearch -x -LLL uid=ldap

fooher.com OpenLDAP 测试日志输出是否正常

四 使用shell脚本,自动添加日志配置参数

在这里,我们之前配置过slapd.ldifj里的日志参数

cat > /etc/openldap/ldif/config_init.sh << EOF
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
rm -rf /etc/openldap/slapd.d/*
slapadd -n -0 -F /etc/openldap/slapd.d -l /etc/openldap/slapd.ldif
chown -R ldap:ldap /etc/openldap/slapd.d
systemctl restart slapd

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/ldif/log.ldif

echo "查看配置文件是否添加成功,这里要在全局里找"
cat /etc/openldap/slapd.d/cn\=config.ldif
EOF