Linux 安装并配置 OpenLDAP 新编(6)模块管理
Linux 安装并配置 OpenLDAP 新编(6)模块管理
我想全网前搜索最多的关于 OpenLDAP 的文章,多半都是想实现 memberof 功能。
首先解释下何为 memberof ,当我们部署好 OpenLDAP 并创建好用户,准备好了诸如Linux、Jenkins等客户端进行接入时会发现,默认情况下所有用户都具备登入所有客户端节点的功能,显然这不是我们想要的。虽然我们可以通过,比如:限定只属于某个 ou 的用户登录,或者就在客户端依次指定具体的用户,甚至我看见过一个骚操作--通过过滤 homePhone 的方式来限定。 但很显然这些方法都会有或多或少的问题。而 memberof 正是提供了这样一种优雅的管理方式,即我们可以为组的实例化条目添加 groupOfNames 对象,而在创建之后该对象的 member 属性,该属性中所关联的用户对象,会自动绑定到用户的 memberof 属性中,从而实现灵活的 N:N 绑定关系。而实现该功能的技术,在 OpenLDAP 中被称之为 Overlay。
Overlay
Overlays 是一种软件组件,它提供了一种类似于钩子的功能, Overlays 是由具体的 modules 所提供的。然而遗憾的是,官网上对模块只是寥寥数笔描述了下名字,以及在 Overlays 章节中简单的说了几句,除此之外的任何文章也只能看到怎么做,确实也无法发现为什么这么做,这不能不说是一种遗憾!
重新部署
我们前面再三强调过,不要把之前的编译安装当做生产环境来部署,原因在于编译安装的默认情况下,是不会编译安装相关模块的,我们必须要在 configure 时,显式指定。
模块编译
在所有的文章中,都会加载模块什么什么的,但实际上这也是 设定先行 的。YUM安装会默认安装全部模块,但是编译方式安装的 默认情况下,是不安装任何模块的! ,必须要显式配置:
./configure --prefix=/usr/local/openldap \
--enable-dynamic --enable-syslog \
--enable-dynacl --enable-spasswd --enable-modules \
--enable-overlays=mod --enable-accesslog=mod --enable-auditlog=mod --enable-collect=mod \
--enable-constraint=mod --enable-deref=mod --enable-dyngroup=mod --enable-dynlist=mod \
--enable-homedir=mod --enable-memberof=mod --enable-ppolicy=mod --enable-refint=mod \
--with-tls=openssl
# 安装
make depend
make
make test
make install
上面的 configure 参数是经过多次安装、卸载后得出至少可以正常使用的选项。
模块位置
在不同的安装方式下,模块所在的位置并不一样,下面的表格仅列出个人实测过的:
安装方式 | 版本 | 路径 |
---|---|---|
symas | 2.4 | /opt/symas/lib/openldap/ |
Source (指定了prefix) | 2.5 | /usr/local/openldap/libexec/openldap/ |
启用Overlays
系统初始化
系统初始化这里不再赘述,可以完全沿用第4章所讲述的内容进行配置,但是一定要注意在 config 数据库中,SASL机制的 olcAccess 和 olcRootPW 至少要包含一个。导入原始配置后,启动服务。
由于编译时指定了 prefix ,因此导入和启动的参数也要做相应的调整,例如:
slapadd -n 0 -F /usr/local/openldap/etc/slapd.d -l init.ldif
slapd -F /usr/local/openldap/etc/slapd.d -h "ldap:/// ldapi:///"
启用模块
启用模块,依旧可以沿用之前的常用方式。即编辑文件、导入配置。编辑添加模块文件:
# add_module.ldif
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
# module directory
olcModulePath: /usr/local/openldap/libexec/openldap
在很多的网上资料里,只是简单的写了一句 olcModuleLoad 指定模块,然而你首先要知道模块的位置在哪里。这里我们只增加了 olcModulePath 一个属性,用于指定模块的位置,实际上 olcModuleLoad 可以直接指定绝对地址的,这里我们只是为了更细致的描述。接下来导入配置:
ldapadd -Q -Y EXTERNAL -H ldapi:// -f add_module.ldif
按照前面的技巧,此时可以前往 slapd.d 目录,看看这一步操作后发生了什么。
Overlay refint
很多人在启用 memberof 时可能会比较纳闷,添加 memberof 为什么还要启用 refint ?添加两者是否有什么顺序要求?
其实从启用 memberof 的语句中可以看出,它依赖于 refint ,因此两者必须都安装,而且还要先安装 refint 。
# enable_refint.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: refint.la
dn: olcOverlay=refint,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
olcOverlay: refint
把上面的 enable_refint.ldif 文件导入后,可以看到在对应的 olcDatabase 数据库目录中,增加了一个同名的目录。里面保存了为该数据库启用的 Overlay 配置信息。
Overlay memberof
# enable_member.ldif
dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: memberof.la
dn: olcOverlay=memberof,olcDatabase={1}mdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcMemberOf
olcOverlay: memberof
olcMemberOfRefint: TRUE
olcMemberOfDangling: ignore
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
继续将启用 enable_memberof.ldif 的配置导入,除了又增加了一个 Overlay 配置文件之外,此时再回头去看本章启用模块时生成的 cn=module{0}.ldif 的配置文件,会看到增加了如下内容:
olcModuleLoad: {0}refint.la
olcModuleLoad: {1}memberof.la
至此,我们已经将需要的模块及配置都操作完成了,接下来倒是可以按照官网的示例,导入一些用户进行测试。
添加信息
# add_pure_group_and_group.ldif
dn: dc=example,dc=com
objectclass: domain
dc: example
dn: ou=Group,dc=example,dc=com
objectclass: organizationalUnit
ou: Group
dn: ou=People,dc=example,dc=com
objectclass: organizationalUnit
ou: People
dn: uid=test1,ou=People,dc=example,dc=com
objectclass: account
uid: test1
dn: cn=testgroup,ou=Group,dc=example,dc=com
objectclass: groupOfNames
cn: testgroup
member: uid=test1,ou=People,dc=example,dc=com
最后,导入文件并查询验证:
ldapadd -x -W -D cn=admin,dc=example,dc=com -f add_pure_group_and_group.ldif
ldapsearch -LLL -x "(uid=test1)" -b dc=example,dc=com memberOf
# return result
dn: uid=test1,ou=People,dc=example,dc=com
memberOf: cn=testgroup,ou=Group,dc=example,dc=com
虽然但是
经过上面一系列的操作,memberof 钩子已经能正常启动了,但是细心的看客可能会有2个疑问:为什么上面的导入一部分用SASL机制一部分用简单授权,这个就留给看客发现了~另外一个问题,创建的测试账户都是基于 account 类型的,那登录系统常用的 posixAccount 账户是否通用呢?答案算是否定的,因为后者关联的是 groupOfUniqueNames 组对象中的 UniqueMember 属性,而不是这里的 groupOfNames 组对象的 member 属性。但这也并不是大问题,只是再多添加一个 Overlay 配置的问题,我们在后面讲述客户端接入时再行说明。
总结
通过几章的学习,基本算是掌握了一些OpenLDAP的知识,服务端的学习暂时告一段落了,TLS似乎是个更麻烦的东西,我也不太想继续深入了。接下来,基本都是面向应用层面的学习了。
文章内所涉及代码,可以点击这里下载。