LDAP系列三用户权限控制

二:权限控制

8.1:访问控制

访问控制主要是通过在slapd.conf文件中配置来实现,具体配置解析如下:

# Sample Access Control

#       Allow read access of root DSE

# Allow self write access

#       Allow authenticated users read access

#       Allow anonymous users to authenticate

# access to dn="" by * read

  access to * by self write

              by users read

              by anonymous auth

#

# if no access controls are present, the default is:

#       Allow read by all

#

# rootdn can always write!

此选项涉及如何管理服务器上的 LDAP 目录的访问权限。只要在数据库特定部分没有声明任何自定义访问规则,slapd.conf 的全局部分中的设置将始终有效。这些自定义声明会重写全局声明。如本例所示,所有用户都可以读取目录,但只有管理员 (rootdn) 才能写入此目录。LDAP 中的访问控制管理是一个非常复杂的过程。以下提示会有所帮助:

每条访问规则都具有如下结构:

access to <what> by <who> <access>

what 是一个占位符,表示授权访问的对象或属性。可以使用单独的规则来明确保护各个目录分支。还可以使用正则表达式通过一条规则处理目录树的各个区域。slapd 按照各条规则列在配置文件中的先后顺序依次评估它们。较通用的规则应列在较特定的规则之后 - 在评估 slapd 认为有效的第一条规则之后,随后的所有项都将被忽略。

who 确定应该授权谁来访问 what 确定的区域。可以使用正则表达式。slapd 同样会在评估第一条有效规则之后中止对随后的 who 的评估,所以应将较具体的规则列在较抽象的规则之前

 

access 指定访问类型。请使用 上表所列的选项。

 

slapd 会将客户机请求的访问权限与 slapd.conf 中授予的权限进行对比。如果规则允许的权限等于或高于请求的权限,则可以授予客户机权限。如果客户机请求的权限高于规则中声明的权限,便会拒绝授予权限。

如下一个简单示例,使用正则表达式可以随意指定这样的简单访问控制。

access to  dn.regex="ou=([^,]+),dc=example,dc=com"

by dn.regex="cn=Administrator,ou=$1,dc=example,dc=com" write 

by user read

by * none

此规则声明只有各个 ou 项的管理员才有权写入他/她所管理的项。其他所有通过身份验证的用户只有读权限,其余人没有任何权限。

如果没有  access to 规则或匹配的  by 指令,则拒绝访问。只有经过显式声明才能授予访问权限。如果根本没有声明任何规则,默认规则是管理员具有写权限,其他所有用户都具有读权限。

除了可以使用中央服务器配置文件 (slapd.conf) 管理访问权限之外,还可以使用访问控制信息 (ACI)。ACI 允许储存 LDAP 树中各个对象的访问信息。

8.2访问控制补充

安装好了openldap之后,就是对它进行配置了,其中一项就是设置访问控制,限制普通用户只能修改/访问他们能修改/访问的项。这就是ACL需要做的事情。

 

设置方法

1、可以将 include行放在/etc/openldap/slapd.conf 的顶部,指向一个单独的文件(例如, include /etc/openldap/slapd.access.conf)

2、或者可以将 ACL 直接添加到 slapd.conf。这完全由您选择 ― Mandrake 通常使用 include 行;Red Hat 将 ACL 添加到配置文件。slapd.conf文件路径:/etc/openldap/slapd.conf

 

ACL设置语法

1.语法

access to what:

by who access control

其中,access to指示启用访问控制,上句大致可以理解为:

access to <对什么目标进行控制>[by <作用于哪些访问者> <授予什么样的访问权限><采取什么样的匹配控制动作>]+

 

2.剖析

2.1 控制目标 what

这一域主要是实现对ACL应用对象的指定,对象可以是记录和属性。选择ACL目标记录的方法一般有两种:DN和filter,语法为:

 

 

what ::= * |

[dn[.basic-style]=regex | dn.scope-style=DN]

[filter=ldapfilter] [attrs=<attrlist>]

 

2.1.1 指定所有的记录

access to *

 

2.1.2 通过DN指定

语法如下:

 

to dn[.basic-style]=regex

basic-style ::= regex | exact

to dn.scope-style=DN

scope-style ::= base | one | subtree | children

 

第一种方法是使用正则表达式(dn.regex)或精确匹配(dn.style)的方式来匹配符合条件的记录(这个好像不像想象的那么简单,实现起来颇为费脑筋),例如:

 

access to dn="^.*,uid=([^,]+),ou=users,(.*)$"

 

第二种方法通过“区域”选择的方法进行目标记录的选取,对以指定的DN开始的目录树区域进行目标记录匹配。匹配区域的方式共有四种:

base 只匹配DN本身一条记录

one 匹配以给定DN为父目录的所有记录

subtree 匹配以给定DN为根目录的所有子树内的记录

children 匹配给定DN下的所有记录,但应该不包括以DN直接命名的那条记录(参见例子的解释)

 

例如:对于

0: dc=mydomain,dc=org

1: cn=root,dc=mydomain,dc=org

2: ou=users,dc=mydomain,dc=org

3: uid=samba,ou=users,dc=mydomain,dc=org

4: cn=Administator,uid=samba,ou=users,dc=mydomain,dc=org

5: uid=guest,ou=users,dc=mydomain,dc=org

 

规则 dn.base=”ou=users,dc=mydomain,dc=org” 只会匹配记录2

规则 dn.one=”ou=users,dc=mydomain,dc=org” 匹配记录3和记录5,记录4是记录3的子目录,故不算在内

规则 dn.subtree=”ou=users,dc=mydomain,dc=org” 匹配记录2、3、4、5

规则 dn.children=”ou=users,dc=mydomain,dc=org” 匹配记录3、4、5,因为记录0、1和2都是以DN直接命名的,故不匹配

 

2.1.3 通过filter匹配记录

通过filter指定过滤规则进行记录过虑,语法如下:

 

access to filter=ldap filter

 

其中filter指定的为search的过滤规则,这类同于linux系统中grep的匹配方式。如:

 

access to filter=(objectClass=sambaSamAccount)

 

也可以结合使用DN和filter进行记录的匹配,例如:

 

access to dn.subtree=”ou=users,dc=mydomain,dc=org” filter=(objectClass=posixAccount)

 

2.1.4 通过attrs选取匹配记录

语法:

attrs=attribute list

 

例如:

access to attrs=uid,uidNumber,gidNumber

 

也可以结合使用DN和attrs进行记录的匹配,例如:

access to dn.subtree="ou=users,dc=mydomain,dc=org" attrs=uid

 

2.2 被用来授权的访问者的指定

指定被授权的用户范围的方法大致有以下几种:

* 所有的访问者,包括匿名的用户

anonymous 非认证的匿名用户

users 认证的用户

self 目标记录的用户自身

dn[.<basic-style>]=<regex> 在指定目录内匹配正则表达式的用户

dn.<scope-style>=<DN> 指定DN内的用户

 

例如:

by dn.subtree="ou=users,dc=domain,dc=org"="^samba*"

 

2.3 被授予的权限access

当选取好ACL作用的目标记录并选取好用户范围后,就该给这些用户授予他们应该得到的权限了。大致的权限(由低到高)有以下几类:

none 无权限,即拒绝访问

auth 访问bind(认证)设置的权限;前提是需要用户提交一个DN形式的用户名并能通过认证

compare 比较属性的权限;(例如:对照查看某用户的telephoneNumber值是不是158 8888 8888),但并不具有搜索的权限

search 利用过虑条件进行搜索的权限,但这并不一定具有可读取搜索结果的权限

read 读取搜索结果的权限

write 更改记录属性值的权限

 

可以在slapd.conf文件中通过defaultaccess指定默认的权限级别,如:

defaultaccess search

 

2.4 采取什么样的匹配控制动作control

在进行记录的匹配时,如果有多条规则存在,那么在第一次匹配产生后是否还进行后续的匹配或采取其它的动作将取决于此项的设置;控制方式共有以下三种:

 

stop 这个是默认值,这表示在一次匹配产生后将不再进行下一个匹配,所有后续的匹配将会停止。

continue 无论匹配是否已经发生,继续进行直到所有的规则全部进行完匹配检查

break 一个匹配发生后,跳出当前的子句进行后一个子句的检查

 

2.5 一个例子

access to dn.chilren="ou=users,dc=mydomain,dc=org"

attrs=userPassword #指定“密码”属性

by self write #用户自己可更改

by * auth #所有访问者需要通过认证

by dn.children="ou=admins,dc=mydomain,dc=org" write #管理员组的用户可更改

 

access to dn.subtree="ou=SUDOers,dc=test,dc=com" #SUDOers的所有内容必须提供其他匿名可读,不然在linux上切换到该用户,不能使用sudo

by dn="cn=Manager,dc=test,dc=com" write

by * read

access to attrs="gidNumber,homeDirectory,loginShell,uidNumber,sshPublicKey"

by * read #对这些属性只能读,但是userPassword字段是可写的,允许用户自行修改密码,但是不能修改自己的gid,home目录等

access to *

by anonymous read #匿名访问可读

by self write #自己可写

by users read #其他用户可读

 

前面这些配置需要放在

database config

access to *

by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage

by * none

enable server status monitoring (cn=monitor)

database monitor

access to *

by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read

by dn.exact="cn=Manager,dc=test,dc=com" read

by * none

的前面才能生效

 

三:备份补充

9:备注补充(这个步骤仅做备份用,前面都已经注明过)

9.1. 生成LDIF格式文件

往openldap数据库存放数据,有多种方式:1. 手动编辑;2. 用工具生成

手动编辑这里不介绍。工具生成指的是用migrationtools脚本来产生ldif文件

9.2 安装migrationtools工具

虚拟机console执行命令:rpm -qa | grep migrationtools,查看系统是否已经安装migrationtools

若没有安装,执行命令:yum -y installl migrationtools,进行工具安装

9.3 用migrationtools生成ldif文件

这里是希望用openldap来实现用户认证,因此需要把系统中存在的user和group产生ldif,添加到ldap的数据库中。

虚拟机console执行命令:

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

/usr/share/migrationtools/migrate_passwd.pl /etc/passwd > passwd.ldif

/usr/share/migrationtools/migrate_group.pl /etc/group > group.ldif

9.4 添加ldif到ldap数据库

上面过程,已经将用户认证时需要的文件/etc/passwd和/etc/group生成ldif文件。

改用ldap验证时,就需要将这几个文件添加到ldap数据库中。

虚拟机console执行命令:

ldapadd -x -D "cn=Manager,dc=liwanliang,dc=com' -c -W -f base.ldif

ldapadd -x -D "cn=Manager,dc=liwanliang,dc=com" -c -W -f passwd.ldif

ldapadd -x -D "cn=Manager,dc=liwanliang,dc=com" -c -W -f group.ldif

提示输入密码时,输入liwanliang,回车

9.5密码的生成方式

rootpw的密码最好用密文形式的,密文形式的密文可以用命令slappasswd来生成。

# /usr/local/openldap/sbin/slappasswd

New password:

Re-enter new password:

{SSHA}BsaRKs65dsw5dhesleHEHEWOE1843decJ

密文就是:{SSHA}BsaRKs65dsw5dhesleHEHEWOE1843decJ

9.6删除原配置,生成新配置(修改slapd.conf文件后)

# rm -rf /etc/ldap/slapd.d/*

# slaptest -f /etc/ldap/slapd.conf -F /etc/ldap/slapd.d/

 

# 给新生成的配置文件赋予openldap的权限

# chown -R openldap.openldap /etc/ldap/slapd.d/

重启openldap

# /etc/init.d/slapd restart

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章