如何配置OpenLDAP的slapd?

OpenLDAP

1 基础知识

1.1 slapd的特性

– OpenLDAP 2.3以上版本支持动态加载slapd-config(man slapd-config),
– 向下兼容旧的slapd.conf文件(不推荐,man slapd)
注:支持动态加载需要使用“–enable-modules”编译选项

1.2 LDIF的编辑要求

– 系统可以接受直接编辑的LDIF文件(不建议)
– 建议使用ldapadd、ldapdelete、ldapmodify编辑LDIF文件
– 以“#”开头的定义被认为是注解,不会被slapd加载
– 行如果以空格开头,则被视为是前一行延续(前一行是注解也不例外)

1.3 配置的布局


如上图所示,
– slapd配置用于定义具有预定模式和DIT的特殊LDAP目录
– 特定的objectClasses用于承载全局配置选项、模式定义、后端与数据库定义以及其他选项
– “cn=config”配置定义树根,其包含全局配置,其他配置包含在单独子目录中
– “cn=schema”配置定义系统架构(所有架构都是硬编码的slapd)
– “cn=schema”配置的子条目定义从配置文件加载或运行时添加的用户模式(一般保存在“/etc/openldap”)
– “cn=module{0}”配置定义动态加载的模块
– “olcDatabase={1}bdb”配置定义后端与数据库
— 覆盖数据库条目的子节点定义
— 数据库和叠加层也可能是其他杂子项

1.4 布局示例

        # global configuration settings
        dn: cn=config
        objectClass: olcGlobal
        cn: config
        

        # schema definitions
        dn: cn=schema,cn=config
        objectClass: olcSchemaConfig
        cn: schema
        

        dn: cn={X}core,cn=schema,cn=config
        objectClass: olcSchemaConfig
        cn: {X}core
        

        # additional user-specified schema
        ...

        # backend definitions
        dn: olcBackend=,cn=config
        objectClass: olcBackendConfig
        olcBackend: 
        

        # database definitions
        dn: olcDatabase={X},cn=config
        objectClass: olcDatabaseConfig
        olcDatabase: {X}
        

        # subsequent definitions and settings
        ...

如示例所示,
– 某些条目“dn”中包含数字索引“{X}”
– 数字索引用于在配置数据库中强制执行一致性排序以满足条目间的依赖关系
– 如不提供索引,则根据创建条目的顺序自动添加索引
– LDIF文件使用属性值定义配置指令,“:”前面为属性名称,后面为属性值
– LDIF文件大多数属性和ObjectClass都带有名称前缀“olc”
– 一般情况下,属性值与旧式的slapd.conf存在对应关系(前缀“olc”加关键字)
– 带参数的配置指令请使用空格分隔,如果参数包含空格,需要添加双引号
– 如果需要参阅示例文件请参阅“/etc/openldap”

1.5 配置指令

1.5.1 cn=config条目指令

1.5.1.1 条目的定义范例

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

1.5.1.2 条目的作用与定义要求

– 条目(dn)适用于全局
– 条目定义系统与面向连接(没有数据库相关的定义)
– 条目必须包含“objectClass:olcGlobal”属性

1.5.1.3 olcIdleTimeout属性

– 定义的格式,olcIdleTimeout:<integer>
– 指令定义强制关闭空闲客户端连接之前的等待时间,默认值0禁用此功能,单位秒

1.5.1.4 olcLogLevel属性

– 定义的格式,olcLogLevel:<level>
– 指令定义syslog调试语句和操作统计信息的级别
– 此选项需要编译时启用“–enable-debug”选项
– 日志的级别可以指定为整数或关键字(允许使用多个日志级别且级别是累加的)

Debugging Levels
Level Keyword Description
-1 any enable all debugging
0 no debugging
1 (0x1 trace) trace function calls
2 (0x2 packets) debug packet handling
4 (0x4 args) heavy trace debugging
8 (0x8 conns) connection management
16 (0x10 BER) print out packets sent and received
32 (0x20 filter) search filter processing
64 (0x40 config) configuration processing
128 (0x80 ACL) access control list processing
256 (0x100 stats) stats log connections/operations/results
512 (0x200 stats2) stats log entries sent
1024 (0x400 shell) print communication with shell backends
2048 (0x800 parse) print entry parsing debugging
16384 (0x4000 sync) syncrepl consumer processing
32768 (0x8000 none) only messages that get logged whatever log level is set

请参阅一下等价的定义范例如下,

                olcLogLevel 129 
                olcLogLevel 0x81 
                olcLogLevel 128 1 
                olcLogLevel 0x80 0x1 
                olcLogLevel acl trace

1.5.1.5 olcReferral属性

– 定义的格式,olcReferral:<URI>
– 指令定义当slapd无法找到本地数据库处理请求是要传回的引用
定义范例如下,

olcReferral:ldap://root.openldap.org

注:以上实现将非本地查询引导到全局根LDAP服务器,智能LDAP客户端可在该服务器上重新获取查询

1.5.2 cn=module条目指令

1.5.2.1 条目的范例

dn: cn=module{0},cn=config
objectClass: olcModuleList
cn: module{0}
olcModuleLoad: /usr/local/lib/smbk5pwd.la

dn: cn=module{1},cn=config
objectClass: olcModuleList
cn: module{1}
olcModulePath: /usr/local/lib:/usr/local/lib/slapd
olcModuleLoad: accesslog.la
olcModuleLoad: pcache.la

1.5.2.2 条目的作用与定义要求

– 条目用于支持动态加载模块
– 条目必须包含objectClass: olcModuleList属性

1.5.2.3 olcModulePath属性

– 定义的格式,olcModulePath:<pathspec>
– 定义加载的模块文件名称(通常路径使用冒号分隔,具有由操作系统决定)

1.5.2.4 olcModuleLoad属性

– 定义的格式,olcModuleLoad:<filename>
– 定义加载的模块目录列表(接受绝对路径和相对路径,相对路径将在olcModulePath定义的目录中搜索)

1.5.3 cn=schema条目指令

1.5.3.1 定义的范例

dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema

dn: cn=test,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: test
olcAttributeTypes: ( 1.1.1
  NAME 'testAttr'
  EQUALITY integerMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
olcAttributeTypes: ( 1.1.2 NAME 'testTwo' EQUALITY caseIgnoreMatch
  SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 )
olcObjectClasses: ( 1.1.3 NAME 'testObject'
  MAY ( testAttr $ testTwo ) AUXILIARY )

1.5.3.2 条目的作用与定义要求

– 条目用于引入slapd中的模式定义(硬编码)
– 条目必须包含objectClass: olcSchemaConfig属性

1.5.3.3 olcAttributeTypes属性

– 定义的格式,olcAttributeTypes:<RFC4512 Attribute Type Description>
– 定义一个属性类型
– 详细的指令使用请参阅官方提供的模式规范章节

1.5.3.4 olcObjectClasses属性

– 定义的格式,olcAttributeTypes:<RFC4512 Object Class Description>
– 定义一个对象类型
– 详细的指令使用请参阅官方提供的模式规范章节

1.5.4 Backend条目指令

1.5.4.1 定义范例

 dn: olcBackend=bdb,cn=config
 objectClass: olcBackendConfig
 olcBackend: bdb

1.5.4.2 条目的作用与定义要求

– 条目定义后端的数据库类型
– 条目必须包含objectClass:olcBackendConfig属性

1.5.4.3 olcBackend属性

– 定义的格式,olcBackend:<type>
– 定义一个数据库后端的类型
– 详细的指令支持以下后端类型

Database Backends
Types Description
bdb Berkeley DB transactional backend (deprecated)
config Slapd configuration backend
dnssrv DNS SRV backend
hdb Hierarchical variant of bdb backend (deprecated)
ldap Lightweight Directory Access Protocol (Proxy) backend
ldif Lightweight Data Interchange Format backend
mdb Memory-Mapped DB backend
meta Meta Directory backend
monitor Monitor backend
passwd Provides read-only access to passwd(5)
perl Perl Programmable backend
shell Shell (extern program) backend
sql SQL Programmable backend

1.5.5 Database条目指令

1.5.5.1 定义范例

dn: olcDatabase=frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: frontend
olcReadOnly: FALSE

dn: olcDatabase=config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: config
olcRootDN: cn=Manager,dc=example,dc=com

1.5.5.2 条目的作用与定义要求

– 条目定义数据库的类型
– 条目必须包含objectClass: olcDatabaseConfig属性

1.5.5.3 olcDatabase属性

– 定义的格式,olcDatabase:[{<index>}] <type>
– 定义一个数据库示例
– 可使用数字索引区分相同类型的多个数据库(省略则自动生成)
– 接受的类型可参考后端数据库的定义

1.5.5.4 olcAccess属性

– 定义的格式,olcAccess:to <what> [ by <who> [<accesslevel>] [<control>] ]+
– 定义一组条目或属性的访问权限,可授权给一个或多个请求者
– 如果没有定义该指令,则允许所有用户访问(默认策略)
– 详细的使用方法请参阅访问控制章节

1.5.5.5 olcReadonly属性

– 定义的格式,olcAccess:{ TRUE | FALSE }
– 该指令声明数据库为只读模式,执行修改操作会返回“unwilling to perform”的错误提示
– 默认值为“FALSE”

1.5.5.6 olcRootDN属性

– 定义的格式,olcRootDN:<DN>
– 该指令声明具有对LDAP执行所有管理活动的无限制访问权限的用户的根专有名称(DN)条目
简单的书写范例,

olcRootDN: "cn=Manager,dc=example,dc=com"

SASL-based的书写范例,

olcRootDN: "uid=root,cn=example.com,cn=digest-md5,cn=auth"

关于SASL验证标识信息,可参考SASL身份认证

1.5.5.7 olcRootPW属性

– 定义的格式,olcRootPW:<password>
– 该指令声明RootDN的DN的密码
– 密码可以是明文也可以使用RFC2307格式的哈希值定义
简单的书写范例,

olcRootPW: secret

RFC2307的书写范例,

olcRootPW: {SSHA}ZKKuqbEKJfKSXhUbHG3fG8MDn9j1v4QN

注:以上密码可使用以下命令生成,

slappasswd -s secret

1.5.5.8 olcSizeLimit属性

– 定义的格式,olcSizeLimit:<integer>
– 该指令声明搜索操作返回的条目数
– 默认值为“500”
– 更加详细的信息请参阅执念限制部分和slapd-config

1.5.5.9 olcSuffix属性

– 定义的格式,olcSuffix:<dn suffix>
– 该指令声明将符合定义后缀的DN查询传递给后端数据库(可定义多个)
– 如果数据库的后缀是另一个数据库的前缀,则该定义顺序应该靠后
定义的范例,

olcSuffix: "dc=example,dc=com"

注:以上定义将”dc=example,dc=com”结尾的查询传递给后端

1.5.5.10 olcSyncrepl属性

– 定义的格式,

        olcSyncrepl: rid=<replica ID>
                provider=ldap[s]://<hostname>[:port]
                [type=refreshOnly|refreshAndPersist]
                [interval=dd:hh:mm:ss]
                [retry=[<retry interval> <# of retries>]+]
                searchbase=<base DN>
                [filter=<filter str>]
                [scope=sub|one|base]
                [attrs=<attr list>]
                [attrsonly]
                [sizelimit=<limit>]
                [timelimit=<limit>]
                [schemachecking=on|off]
                [bindmethod=simple|sasl]
                [binddn=<DN>]
                [saslmech=<mech>]
                [authcid=<identity>]
                [authzid=<identity>]
                [credentials=<passwd>]
                [realm=<realm>]
                [secprops=<properties>]
                [starttls=yes|critical]
                [tls_cert=<file>]
                [tls_key=<file>]
                [tls_cacert=<file>]
                [tls_cacertdir=<path>]
                [tls_reqcert=never|allow|try|demand]
                [tls_cipher_suite=<ciphers>]
                [tls_crlcheck=none|peer|all]
                [logbase=<base DN>]
                [logfilter=<filter str>]
                [syncdata=default|accesslog|changelog]

– 该指令声明当前库为另一个库的副本(复制关系)
– rid参数声明当前库的唯一识别号(长度不超过3位的非负数)
– provider参数定义被复制的库,范例“ldap://provider.example.com:389”或“ldaps://192.168.1.1:636”,端口可省略
– searchbase、scope、filter、attrs、attrsonly、sizelimit和timelimit参数可用于筛选复制到副本的结果集
– type参数声明同步的协议,可选值有refreshOnly和refreshAndPersist
– retry参数声明重连接次数,例如retry=”60 10 30 3″表示以60秒间隔重试10次后,再以300秒间隔重试3次,用+则表示重试到成功
– schemachecking参数声明被复制与复制库之间强制执行schema一致性检查,默认为关闭
– binddn参数声明被复制库的DN(复制库对此DN有读写权限)
– bindmethod参数声明使用的身份验证机制,可选值有simple或sasl(simple方式只建议在TLS或IPsec环境下使用)
– credentials参数声明的凭据用于加强simple身份验证机制(使用simple方式时建议使用credentials和binddn参数)
– saslmech参数声明SASL身份验证机制,可以使用authcid或credentials分别指定身份验证标识或凭据
– realm参数声明复制的域(用于某机制的域内标识身份认证)
– secprops参数声明Cyrus SASL安全属性
– starttls参数声明再建立TLS会话前先使用StartTLS扩展操作
— 如果使用参数值critical并且StartTLS请求失败,则会话中止
— 否则syncrepl会话将在没有TLS的情况下继续
注:进一步的详细参数使用请参阅LDAP同步复制

1.5.5.11 olcTimeLimit属性

– 定义的格式,olcTimeLimit:<integer>
– 该指令声明slapd回答搜索请求的最大秒数,如果请求没有完成,将返回超出时限的结果
– 默认值为“3600”
更加详细的信息请参阅限制章节

1.5.5.12 olcUpdateref属性

– 定义的格式,olcUpdateref:<URL>
– 指令定义一个URL返回到客户端(当提交更新请求返回)
– 该指令只适用于主从模式下的从服务
– 该指令如果指定多次,则每个URL都会被返回
定义范例:

olcUpdateref:ldap://master.example.net

1.5.6 BDB与HDB数据库条目指令

1.5.6.1 条目的范例

dn: olcDatabase=hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: hdb
olcSuffix: "dc=example,dc=com"
olcDbDirectory: /usr/local/var/openldap-data
olcDbCacheSize: 1000
olcDbCheckpoint: 1024 10
olcDbConfig: set_cachesize 0 10485760 0
olcDbConfig: set_lg_bsize 2097152
olcDbConfig: set_lg_dir /var/tmp/bdb-log
olcDbConfig: set_flags DB_LOG_AUTOREMOVE
olcDbIDLcacheSize: 3000
olcDbIndex: objectClass eq

1.5.6.2 条目的作用与定义要求

– 条目用于定义BDB和HDB数据库
– 条目亦适用于olcDatabase条目
– 条目必须包含objectClass: olcDatabaseConfig和objectClass: olcHdbConfig对象类

1.5.6.3 olcDbDirectory属性

– 定义的格式,olcUpdateref:<directory>
– 指令定义包含数据库和相关索引的BDB文件存储目录
– 默认值:/usr/local/var/openldap-data

1.5.6.4 olcDbCachesize属性

– 定义的格式,olcDbCachesize:<integer>
– 指令定义BDB后端数据库实例维护内存的高速缓存条目大小
– 默认值:1000

1.5.6.5 olcDbCheckpoint属性

– 定义的格式,olcDbCheckpoint:<kbyte> <min>
– 指令定义检查BDB事务日志的频率
– 定义检查时间点将数据库缓冲区更新到磁盘,并将检查时点记录到日志
– 当“kbyte”与“min”都为0时,则负略检查点
配置范例,

olcDbCheckpoint: 1024 10

1.5.6.6 olcDbConfig属性

– 定义的格式,olcDbConfig:<DB_CONFIG setting>
– 指令定义放置于数据库目录DB_CONFIG文件中的配置指令
– 如果DB_CONFIG文件上不存在,则创建文件并写入指令定义的属性
– 如果DB_CONFIG文件上存在,则读取文件到指令中定义的属性
配置范例,

        olcDbConfig: set_cachesize 0 10485760 0
        olcDbConfig: set_lg_bsize 2097512
        olcDbConfig: set_lg_dir /var/tmp/bdb-log
        olcDbConfig: set_flags DB_LOG_AUTOREMOVE

注:
– BDB缓存设置为10MB
– BDB事务日志缓冲区大小为2MB
– 事务日志文件存储于“/var/tmp/bdb-log”中
– 定义BDB事务日志被检测到后将自动清理
– 有关于Berkeley DB标志的完整列表,请参阅http://www.oracle.com/technology/documentation/berkeley-db/db/api_c/env_set_flags.html

1.5.6.7 olcDbNosync属性

– 定义的格式,olcDbNosync:<TRUE | FALSE>
– 指令定义磁盘上的数据库内容被变更时不会立刻与内存同步
– 当设置为“TRUE”时,会以牺牲数据库完整性为代价来提高性能
– 相同效果的配置是“olcDbConfig: set_flags DB_TXN_NOSYNC”

1.5.6.8 olcDbIDLcacheSize属性

– 定义的格式,olcDbIDLcacheSize:<integer>
– 指令定义内存中索引缓存的大小
– 指令默认值为“0”
– 值越大则搜索索引的条目频度越高
– 最佳大小取决于数据库的数据和搜索特征
– 使用条目高速缓存大小的三倍是不错的起点
配置范例,

olcDbIDLcacheSize: 3000

1.5.6.9 olcDbIndex属性

– 定义的格式,olcDbIndex: {<attrlist> | default} [pres,eq,approx,sub,none] – 指令定义指定的属性维护索引
– 如需定义指定索引的属性,则需要设置<attrlist>
– 索引关键字对应于LDAP搜索过滤器中使用的常见匹配类型
配置范例,

        olcDbIndex: default pres,eq
        olcDbIndex: uid
        olcDbIndex: cn,sn pres,eq,sub
        olcDbIndex: objectClass eq

注:
– 第一行将default索引集合定义present和equality
– 第二行将uid属性使用default索引集合的present和equality定义
– 第三行将cn和sn属性集合定义为present、equality和substring
– 第四行将objectClass属性集合定义为equality

1.5.6.10 olcDbLinearIndex属性

– 定义的格式,olcDbLinearIndex:<TRUE | FALSE>
– 此指令用于调整slapindex的性能
– 指令定义为TRUE,则slapindex将以此索引一个属性
– 指令默认值为FAlSE,条目的所有索引属性将同时处理
– 当数据库大小超过BDB缓存大小时,此选项可提高slapindex的性能
– 当BDB缓存足够大时,不需用此选项会降低slapindex性能

1.5.6.11 olcDbMode属性

– 定义的格式,olcDbLinearIndex:{<octal&gt | <symbolic>}
– 此指令定义新创建的数据库索引文件是否使用文件保护模式(读写权限,0600或rw)
– 默认值“0600”

1.5.6.12 olcDbSearchStack属性

– 定义的格式,olcDbSearchStack:<integer&gt
– 此指令定义评估搜索过滤器的堆栈深度
– 在堆栈上评估搜索过滤器以适应嵌套AND或OR条件
– 堆栈深度决定可以在不需要任何额外内存分配的情况下评估顾虑器的复杂程度
– 嵌套深度超过搜索堆栈深度的过滤器将导致未改特定搜索操作分配单独的堆栈(对服务器性能有影响)
– 指定太多的堆栈会占用大量的内存
– 32位计算机每次每级搜索使用512K字节内存
– 64位计算机每次每级搜索使用1024K字节内存
– 每个线程在32位和64位系统分配内存分别为8MB和16MB(默认堆栈深度为16)
– 单个堆栈槽的大小512KB可由定义“olcDbSearchStack:16”改变

1.5.6.13 olcDbShmKey属性

– 定义的格式,olcDbShmKey:<integer&gt
– 此指令为共享内存BDB环境指定Key
– 默认情况下BDB环境使用内存映射文件
– 如果指定非零值,此值用于表示共享内存区域的Key
使用范例,

olcDbShmKey:42

参阅文档:
================
http://www.openldap.org/doc/admin24/slapdconf2.html

没有评论

发表回复

OpenLDAP
如何使用ldapsearch验证用户的密码?

1 前言 一个问题,一篇文章,一出故事。 早上有用户登录NextCloud异常,根据经验是ldap的 …

OpenLDAP
如何用ldapsearch检索微软AD域?

1 前言 一个问题,一篇文章,一出故事。 今天老板提出需要使用ldapsearch工具去检索Micr …

OpenLDAP
如何配置OpenLDAP的缓存代理服务?

1 基础知识 1.1 缓存代理的概念 缓存代理服务器缓存单个或多个主服务器LDAP条目副本,该副本直 …