Linux 安装并配置 OpenLDAP 新编(5)访问控制

Linux 安装并配置 OpenLDAP 新编(5)访问控制

SASL机制授权和简单授权

顾名思义,访问控制即是控制目标在系统中可以访问的内容。回想一下之前在不同场景中的操作:

  • 在YUM安装后,使用 "-Q -Y" 进行授权验证;
  • 在编译安装后,使用 "-x -W -D "进行授权验证。

而导致此区别的重要原因,正是体现在不同方式安装 OpenLDAP 后的 olcDatabase={0}config.ldifolcDatabase={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 全局数据库的配置,请务必注意! 。那么,对于简单授权方式来说,该如何定义这样的超级权限呢?答案是使用: olcRootDNolcRootPW。即把 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 DN所指定范围内的用户

ACCESS:

ACCESS则是衔接前面的,某个资源对于某个用户来说可以进行 何种 操作:

级别 权限 描述
none =0 没有权限
disclose =d 这个未理解是干嘛的~~~~
auth =dx 需要进行授权的操作
compare =cdx 进行比较的权限
seach =scdx 进行搜索过滤的权限
read =rscdx 进行读取的权限
write =wrcdx 进行写入的权限
manage =mwrscdx 进行管理的权限

从上面的表格可以看出,权限是向下兼容的,即如果给用户指定了 write 的权限,那么他同时会拥有 readsearchcompareauth 以及 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 功能。

本章示例点击这里下载。

参考资料

posted @ 2022-05-06 09:17  雨帝夜泪  阅读(620)  评论(0编辑  收藏  举报