Linux 安装并配置 OpenLDAP 新编(5)访问控制
Linux 安装并配置 OpenLDAP 新编(5)访问控制
SASL机制授权和简单授权
顾名思义,访问控制即是控制目标在系统中可以访问的内容。回想一下之前在不同场景中的操作:
- 在YUM安装后,使用 "-Q -Y" 进行授权验证;
- 在编译安装后,使用 "-x -W -D "进行授权验证。
而导致此区别的重要原因,正是体现在不同方式安装 OpenLDAP 后的 olcDatabase={0}config.ldif 与 olcDatabase={x}mdb.ldif 这两个文件中:
YUM安装后的 olcDatabase={0}config.ldif 文件中包含下面这句,即为SASL机制授权:
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" manage by * none
编译安装后的 olcDatabase={x}mdb.ldif 文件中,则包含下面的语句(当前前提是配置了),即为简单授权:
olcRootDN: cn=Manager,dc=example,dc=com
olcRootPW: e1NTSEF9SDdwcWlwdUNvSGJNSCthQUF5M2k5WTIvem8rSVkycnk=
如果用形象点的类比,就像是 Microsoft SQL Server 中的集成身份验证与帐号密码登录的区别。而同样的,在默认的情况下,两者也并不是同时生效的。
对于YUM形式的安装来说,默认就添加了SASL机制,虽然也支持简单授权,但是没有默认密码,SASL机制的格式为:
gidNumber=<gid>+uidNumber=<uid>,cn=peercred,cn=external,cn=auth
因此,root 账户的SASL标识,即为上面的内容。
而对于编译安装的情景来说,若只按照之前的快速入门中的描述,则只会在通用数据库 olcDatabase=mdb 中启用简单验证,未启用SASL验证。而且,由于编译安装的默认配置中,是隐式创建的 cn=config 数据库,这会导致既不能通过SASL机制授权也不能通过简单授权来管理 cn=config 全局数据库的配置,请务必注意! 。那么,对于简单授权方式来说,该如何定义这样的超级权限呢?答案是使用: olcRootDN 和 olcRootPW。即把 olcRootDN 当做账户名, olcRootPW 当做密码来实现简单授权。
测试
# 简单授权方式
ldapsearch -LLL -x -W -D cn=config -b cn=config dn olcRootDN olcRootPW
ldapsearch -LLL -x -W -D cn=config -b cn=config "(olcRootDN=*)" dn olcRootDN olcRootPW
# SASL机制授权
ldapsearch -LLL -Q -Y EXTERNAL -H ldapi:// -b cn=config dn olcRootDN olcRootPW
ldapsearch -LLL -Q -Y EXTERNAL -H ldapi:// -b cn=config "(olcRootDN=*)" dn olcRootDN olcRootPW
现在可以通过上面的四个语句,在不同情景下进行测试了。同时,会发现一个小彩蛋~~~
权限映射
我们之前使用SASL机制,都是使用root来进行的,那如果用其他用户呢?我们首先编辑一个测试文件:
# add_member3.ldif
dn: uid=test3,ou=People,dc=example,dc=com
objectclass: account
uid: test3
然后使用一个普通用户登录,直接执行添加命令会返回错误,这是因为普通用户并没有操作条目的权限。此时我们可以通过添加 sudo 的方式执行添加操作,还可以使用前面的方式,使用 olcAccess 指令添加到数据库中,但是这次我们换种方式来操作。
首先查看一下当前账户的SASL标识:
ldapwhoami -Q -Y EXTERNAL -H ldapi://
dn:gidNumber=1000+uidNumber=1000,cn=peercred,cn=external,cn=auth
接下来在另外一个终端中,使用 root 账户创建下面的配置文件:
# file: add_access_map.ldif
# 注意,映射只能添加到 顶级全局配置中
dn: cn=config
changetype: modify
add: olcAuthzRegexp
# 注意,字符串中的加号,要做转义
olcAuthzRegexp: "gidNumber=1000\+uidNumber=1000,cn=peercred,cn=external,cn=auth" "cn=Manager,dc=example,dc=com"
然后使用命令使配置生效:
ldapmodify -Y EXTERNAL -H ldapi:/// -f add_access.ldif
最后,再次切换到普通用户的终端,查看当前用户。
ldapwhoami -Q -Y EXTERNAL -H ldapi://
dn:cn=manager,dc=example,dc=com
Bingo,可以看到当前用户SASL标识已经被替换为DN账户。
访问控制
LDAP中的控制访问,是通过对数据库添加 olcAccess 指令来实现的。该指令的范式为:
olcAccess: to <what> [ by <who> [<access>] [<control>] ]+
正如前面所说,该指令定义了什么资源(what)可以由何人(who),执行什么(access)。因此再对照前面的配置,就明白下面这行配置的含义了:
olcAccess: to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" manage by * none
这个配置的意思是:对于当前数据库范围的所有资源,允许 root 进行管理,其他人不赋予任何权限。同时, olcRootDN 所指定的ID名称,不受访问控制的约束。
WHAT:
WHAT表示可以操作的条目对象,有三种方式来声明要操作的对象:
- to * : 表示全部对象
- to dn[.basic-style]=
: 通过正则表达式来匹配条目的DN - to dn.
= : 用于范围请求
正则范式,类似于:
to filter=(objectClass=person)
范围请求类似于:
- dn.base="ou=people,o=suffix" : 精准匹配
- dn.one="ou=people,o=suffix" : 只匹配下一级
- dn.subtree="ou=people,o=suffix" : 匹配同一树干
- dn.children="ou=people,o=suffix" : 匹配所有子级,不限级别
两种方式可以在同一个字句内混合使用,例如:
to dn.one="ou=people,o=suffix" filter=(objectClass=person)
WHO:
WHO即表示将前面的资源,授权给谁进行操作:
指令 | 实体 |
---|---|
* | 所有对象,包括匿名和授权用户 |
anonymous | 匿名未授权用户 |
users | 授权用户 |
self | 与目标条目直接关联的用户,比如用户条目自己 |
dn[. |
符合正则匹配的用户 |
dn. |
DN所指定范围内的用户 |
ACCESS:
ACCESS则是衔接前面的,某个资源对于某个用户来说可以进行 何种 操作:
级别 | 权限 | 描述 |
---|---|---|
none | =0 | 没有权限 |
disclose | =d | 这个未理解是干嘛的~~~~ |
auth | =dx | 需要进行授权的操作 |
compare | =cdx | 进行比较的权限 |
seach | =scdx | 进行搜索过滤的权限 |
read | =rscdx | 进行读取的权限 |
write | =wrcdx | 进行写入的权限 |
manage | =mwrscdx | 进行管理的权限 |
从上面的表格可以看出,权限是向下兼容的,即如果给用户指定了 write 的权限,那么他同时会拥有 read 、 search 、 compare 、 auth 以及 disclose 的权限。
访问控制的变更
既然可以添加访问控制,那是否可以删除或者修改访问控制?当然是可以的!继续编辑一个添加权限的文件:
# add_access.ldif
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to * by dn.base="ou=People,dc=example,dc=com"
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to * by dn.base="ou=Group,dc=example,dc=com"
使用 ldapadd 将文件添加到数据库中,此时查询该数据库的配置,可以看到已经添加了2条新的权限记录。此时我们发现上面的权限似乎有错误,即并未给用户指定具体的操作权限,我们再次创建一个文件
# delete_access.ldif
dn: olcDatabase={2}mdb,cn=config
changetype: modify
delete: olcAccess
olcAccess: {1}
此时可以使用 ldapadd 命令来删除指定的索引,根据官网介绍似乎可以直接执行 relace 指令,但是实操下来似乎会把全部都替换,因此对于更新操作,建议开始删除后再添加。或者一个 replace 指令中就添加多个 olcAccess 指令。
总结
通过本章的学习,深入了解了 LDAP 的权限控制,可以是针对系统账户,也可以是LDAP管理账户。可以灵活的LDAP信息安全管理了。下一章,将介绍LDAP的模块,以及绝大多数人都需要的 memberof 功能。
本章示例点击这里下载。