目录

FreeIPA ACI (Access Control Instructions) 访问控制说明

一、ACI 位置

Directory Server 将ACI存储在目录条目的多值属性中。设置ACI时,将aci添加到响应的目录条目。

  • 如果条目没有任何子条目,则ACI只应用于本条目
  • 如果有子条目,则会从最外层开始验证
  • Root DSE 条目的ACI只应用于该条目本身

二、ACI 结构

ACI属性使用以下语法:

(target_rule) (version 3.0; acl "ACL_name"; permission_rule bind_rules;)
  • target_rule: 指定要设置访问控制的条目、属性或条目集、属性集。
  • version 3.0: 标识ACI版本的必须字段。
  • permission_rule: 定义权限。
  • bind_rules: 指定ACI的绑定规则

三、ACI 局限性

  1. 如果LDAP分布在多台服务器上。
  • 使用groupdn关键字的组条目的ACI必须与组条目位于同一服务器上,同时动态组成员也必须在同一个服务器上,静态组成员可以位于远程服务器上。
  • 使用roledn关键字的ACI必须和角色定义条目在同一服务器上。
  1. 不能使用虚拟属性(例如CoS)在以下的字段属性中:
  • targetfilter
  • targetattrfilters
  • userattr
  1. 访问控制规则仅限于当前主机,如果在ACI关键字中指定的LDAP URLs不是本机地址,则URL将被忽略。

四、复制拓扑中的ACI

ACI存放在条目的aci属性中。如果包含ACI的条目是复制数据库的一部分,则ACI也会复制。

五、操作ACI

1. 查看ACI

ldapsearch -D "cn=Directory Manager" -W -p 389 -h server.example.com -x \
-b "dc=example,dc=com" -s sub '(aci=*)' aci

2. 添加ACI

ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="userPassword") (version 3.0; acl "Allow users updating their password";
allow (write) userdn= "ldap:///self";)

3. 删除ACI

// 删除所有aci
ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: delete
delete: aci // 删除指定aci
ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
delete: aci
aci: (targetattr="userPassword") (version 3.0; acl "Allow users
updating their password"; allow (write) userdn= "ldap:///self";)

六、定义目标(targets)

如果没有定义目标,则ACI应用于当前条目及其子条目。

在一个ACI中,以下加粗部分为目标规则:

(target_rule)(version 3.0; acl "ACL_name"; permission_rule bind_rules;)

1. Target 语法

(keyword comparison_operator "expression")
  • keyword: 关键字,targettargetattrtargetfiltertargetattrfilters
  • comparison_operator: 有效值为==!=,表明目标是否是表达式指定的对象,不推荐使用!=
  • expression: 设置目标,必须用双引号引起来。表达式本身取决于使用的关键字。

2. Target 关键字

2.1 target

基于DN以及子条目的访问控制,使用target关键字。使用target关键字的目标表达式:

(target comparison_operator "ldap:///distinguished_name")

Example:

ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=People,dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///ou=People,dc=example,dc=com") (version 3.0;
acl "Allow users to read and search attributes of own entry"; allow (search, read)
(userdn = "userdn = "ldap:///self");)

支持通配符,但是不支持DN后缀部分的通配符。

# 支持
(target = "ldap:///uid=user_name*,dc=example,dc=com") # 不支持
(target = "ldap:///dc=*.com")

2.2 targetattr

访问条目的某些属性值。

  • read:返回给客户端的属性值。
  • search:可以被搜索的属性值。
  • write:条目中可以被修改的属性值。
  • add:创建新条目时,可以被添加的属性。

可以使用||拼接多个属性。如下:

(targetattr comparison_operator "attribute_1 || attribute_2 || ...")

支持通配符*,基于安全考虑,在write权限上不允许使用通配符。

2.3 targetfilter

使用标准LDAP过滤器定位条目、属性。表达式:

(targetfilter comparison_operator "LDAP_filter")

Example:

ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetfilter = "(|(department=Engineering)(department=Sales)")
(version 3.0; acl "Allow HR updating engineering and sales entries";
allow (write) (groupdn = "ldap:///cn=Human Resources,dc=example,dc.com");)

2.4 targetattrfilters

通过目标的属性值来设置权限,基于属性值的ACI称为基于值(value-based)的ACI。

# 对于具有一个属性和过滤器组合的授权
(targetattrfilters="operation=attribute:filter") # 多个属性值和过滤器组合的授权
(targetattrfilters="operation=attribute_1:filter_1 && attribute_2:filter_2 ... && attribute_m:filter_m") # 多个属性值和过滤器组合的多个授权
(targetattrfilters="operation_1=attribute_1_1:filter_1_1 && attribute_1_2:filter_1_2 ... && attribute_1_m:filter_1_m , operation_2=attribute_2_1:filter_2_1 && attribute_2_2:filter_2_2 ... & attribute_2_n:filter_2_n ")

operation可以设置为adddelattribute:filter为属性值和LDAP过滤器。

Example:

ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattrfilters="add=nsroledn:(!(nsroledn=cn=Admin)) &&
telephoneNumber:(telephoneNumber=123*)") (version 3.0;
acl "Allow adding roles and telephone";
allow (add) (userdn = "ldap:///self");)

2.5 target_from & target_to

允许移动条目。

Example:

ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target_from="ldap:///uid=*,cn=staging,dc=example,dc=com")
(target_to="ldap:///cn=People,dc=example,dc=com")
(version 3.0; acl "MODDN from"; allow (moddn))
userdn="ldap:///uid=user,dc=example,dc=com";)

3. 目标规则的高级用法

Example:

ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///cn=*,ou=Groups,dc=example,dc=com")
targetfilter="(&(objectClass=top)(objectClass=groupOfUniqueNames))")
(targetattr="cn || uniqueMember || objectClass")
(version 3.0; acl "example"; allow (read, search, write, add)
(userdn = "ldap:///uid=test,ou=People,dc=example,dc=com");) ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (target="ldap:///cn=*,dc=example,dc=com")(targetattr="member" || "cn") (version 3.0;
acl "Allow uid=user to search and read members of groups";
allow (read, search) (userdn = "ldap:///uid=user,ou=People,dc=example,dc.com");) ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "jpegPhoto|| manager")
(targetfilter = "(department=Engineering)") (version 3.0;
acl "Allow engineering admins updating jpegPhoto and manager of department members";
allow (write) (groupdn = "ldap:///cn=Engineering Admins,dc=example,dc.com");) ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=Engineering,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "ou || cn")
(targetfilter = "(ou=Engineering)") (version 3.0;
acl "Allow uid=user to search and read engineering attributes";
allow (read, search) (userdn = "ldap:///uid=user,ou=People,dc=example,dc.com");)

七、 定义权限

权限规则指的是ACI关联的权限是允许或拒绝。

在一个ACI中,以下加粗部分为权限规则:

(target_rule) (version 3.0; acl "ACL_name";permission_rulebind_rules;)

权限规则语法:

permission (rights)

  • permission:设置允许(allow)还是拒绝(deny)
  • rights: 权限字段。

1. 用户权限

权限 描述
read 设置用户是否可以读取目录,仅适用于LDAP的搜索操作。
write 设置用户是否可以通过添加、修改和删除属性来修改条目。仅适用于LDAP中的modifymodrdn
add 设置用户是否可以添加条目,仅适用于LDAP中的add操作
delete 设置用户是否可以删除条目,仅适用于LDAP中的delete删除操作。
search 设置用户是否可以搜索目录数据。查看作为搜索结果的一部分返回,则分配searchread权限。仅适用于LDAP中的搜索操作。
compare 设置用户是否可以将其提供的数据与存储在目录中的数据进行比较,使用比较权限,目录返回成功或失败,但是无法看到用户条目或者属性的值。仅适用于LDAP中的比较操作。
selfwrite 设置用户是否可以从组中添加或删除自己的DN,此权限仅限于组管理。
proxy 设置指定的DN是否可以使用其他条目的权限访问目标。proxy权限在ACI授权范围内、用户或者租,可以像代理的用户、组一样执行命令。无法单独限制用户。
all proxy之外的所有权限。

2. LDAP操作所需权限

针对LDAP操作必须要授权的用户权限类型。

  • 添加条目

    • add 添加条目
    • write 授予条目中的每个属性值的写入权限,默认情况下授予此权限,可以通过关键字targetattrfilters来授权指定的属性。
  • 删除条目
    • delete 允许删除条目
    • write 授予条目中的每个属性值的写入权限,默认情况下授予此权限,可以通过关键字targetattrfilters来授权指定的属性。
  • 更改条目属性
    • write 授予条目中的每个属性值的写入权限,默认情况下授予此权限,可以通过关键字targetattrfilters来授权指定的属性。
  • 搜索条目
    • search 在搜索过滤器中使用属性类型授予搜索权限
    • read 对条目中属性的读取权限。

八、 绑定规则

绑定规则定义必须满足绑定参数,以便LDAP应用ACI,绑定规则可以基于:DNs组成员或角色条目的具体位置绑定期间的身份验证类型绑定的时间和天数

在一个ACI中,以下加粗部分为绑定规则:

(target_rule) (version 3.0; acl "ACL_name"; permission_rulebind_rules;)

绑定语法:

keyword comparison_operator "expression"

  • keyword:设置绑定操作的类型。
  • comparison_operator: 比较运算符。==!=
  • expression: 设置表达式,必须用引号引起来,表达式本身取决于使用的关键字。

1. 常用绑定规则

1.1 userdn

userdn关键字允许根据一个或多个DN设置权限。

userdn comparison_operator "ldap:///distinguished_name || ldap:///distinguished_name || ..."

表达式的值:

  • DN,支持*通配符。
  • LDAP过滤器
  • anyone 匿名访问,配置为ldap:///anyone
  • all 认证后即可访问,配置为ldap:///all
  • parent 当前绑定DN是目标条目的父级时的权限,配置为ldap:///parent

1.2 groupdn

基于组的ACI。使用groupdn关键字时,LDAP服务器将根据memberuniqueMembermemberURLmemberCertificateDescription属性验证组成员身份。

groupdn comparison_operator "ldap:///distinguished_name || ldap:///distinguished_name || ..."

表达式的值:

  • DN,组DN
  • LDAP 过滤器,经过身份验证的用户,必须是过滤器返回的至少一个组的成员。
    • 过滤器语法:groupdn comparison_operator "ldap:///distinguished_name??scope?(filter)"

过滤器示例:

ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="homePostalAddress") (version 3.0;
acl "Allow manager=example setting homePostalAddress"; allow (write)
userdn = "ldap:///dc=example,dc=com??sub?(manager=example)";)

2. 不常用绑定规则

2.1 基于值的定义访问(userattr)

使用userattr关键字指定绑定条目与目标条目之间必须匹配的属性。

userattr关键字使用语法:

userattr comparison_operator "attribute_name#bind_type_or_attribute_value
1) USERDN 绑定类型

要在绑定用户DN与属性中存储的DN匹配时应用ACI。userattr关键字与USERDN绑定类型的语法:

userattr comparison_operator "attribute_name#USERDN"

Example:

ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "telephoneNumber")
(version 3.0; acl "Manager: telephoneNumber";
allow (all) userattr = "manager#USERDN";)
2) GROUPDN 绑定类型

要在绑定用户DN是属性中设置的组的成员时应用ACI。userattr关键字与GROUPDN绑定类型的语法:

userattr comparison_operator "attribute_name#GROUPDN"

Example:

ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=Social Committee,ou=Groups,dc=example,dc=com
changetype: modify
add: aci
aci: (target="ou=Social Committee,ou=Groups,dc=example,dc=com)
(targetattrfilters="del=objectClass:(objectClass=groupOfNames)")
(version 3.0; acl "Delete Group";
allow (delete) userattr = "owner#GROUPDN";)

如果使用静态组,并且和目标条目有相同的后缀,可以使用以下语法提高性能:

userattr comparison_operator "ldap:///distinguished_name?attribute_name#GROUPDN"
3) SELFDN 绑定类型

当绑定用户的DN在目标条目的单值属性中时,SELFDN绑定类型允许授予权限。userattr关键字与SELFDN绑定类型的语法:

userattr comparison_operator "attribute_name#SELFDN"

Example:

ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=otp,dc=example,dc=com
changetype: modify
add: aci
aci: (target = "ldap:///ipatokenuniqueid=*,cn=otp,dc=example,dc=com")
(targetfilter = "(objectClass=ipaToken)")(version 3.0;
acl "token-add-delete"; allow (add) userattr = "ipatokenOwner#SELFDN";)
4) LDAPURL 绑定类型

绑定DN与目标条目属性中指定的过滤器匹配时,使用LDAPURL绑定类型。userattr关键字与LDAPURL绑定类型的语法:

userattr comparison_operator "attribute_name#LDAPURL"

Example:

# ou=People,dc=example,dc=com条目的aciurl属性值为:ldap:///ou=People,dc=example,dc=com??one?(uid=user*)

ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: ou=People,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*")
(version 3.0; acl "Allow read,search "; allow (read,search)
(userattr = "aciurl#LDAPURL);)
5) 绑定用户与目标条目具有相同属性值
userattr comparison_operator "attribute_name#value"
6) userattr 继承

可以通过parent关键字并制定继承ACI目标的级数来实现。语法:

userattr comparison_operator "parent[inheritance_level].attribute_name#bind_type_or_attribute_value
  • inheritance_level: 以逗号分隔的列表,表示目标条目下继承的级别,可以为(0,1,2,3,4)五个级别,0表示目标条目。
  • attribute_name:属性值
  • bind_type_or_attribute_value:设置属性值或者绑定类型

    Example:
ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: cn=Profiles,dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr="*") (version 3.0; acl "Profile access",
allow (read,search) userattr="parent[0,1].owner#USERDN" ;)
7) 指定特定IP地址或网段(ip)

ip关键字可以设置特定IP地址或网段的访问权限。语法:

ip comparison_operator "IP_address_or_range"

Example:

ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*") (version 3.0;acl "Deny 192.168.0.2/24"; deny (all)
(userdn = "ldap:///anyone") and (ip != "192.0.2.");)
8) 指定特定主机或域(dns)

dns关键字设置特定主机或域的访问权限。语法:

dns comparison_operator "host_name_or_domain_name"

Example:

ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: dc=example,dc=com
changetype: modify
add: aci
aci: (targetattr = "*") (version 3.0;acl "Deny example.com"; deny (all)
(userdn = "ldap:///anyone") and (dns != "*.example.com");)

参考链接

FreeIPA ACI (Access Control Instructions) 访问控制说明的更多相关文章

  1. ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表

    zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题,详见官网文档:ht ...

  2. [转载] Zookeeper中的 ACL(Access Control List)访问控制列表

    zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题,详见官网文档:ht ...

  3. 【分布式】ZooKeeper权限控制之ACL(Access Control List)访问控制列表

    zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题,详见官网文档:ht ...

  4. ACL(Access Control List)

    一.ACL的简介 ACL(Access Control List 访问控制列表)是路由器和交换机接口的指令列表,用来控制端口进出的数据包.ACL的定义也是基于每一种被动路由协议的,且适用于所有的被动路 ...

  5. RBAC(Role-Based Access Control,基于角色的访问控制)

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  6. RBAC(Role-Based Access Control)基于角色的访问控制

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...

  7. Azure ARM (16) 基于角色的访问控制 (Role Based Access Control, RBAC) - 使用默认的Role

    <Windows Azure Platform 系列文章目录> 今天上午刚刚和客户沟通过,趁热打铁写一篇Blog. 熟悉Microsoft Azure平台的读者都知道,在老的Classic ...

  8. windows访问控制列表 --ACL(Access Control List)

    1.定义 ACL是一个windows中的表示用户(组)权限的列表. Access Control List(ACL) Access Control Entry(ACE) ... 2.分类 ACL分为两 ...

  9. RBAC: 基于角色的访问控制(Role-Based Access Control)

    本文只讨论两种基于角色的访问控制的不同点,不涉及权限设计的数据库设计. 基于角色的访问控制(Role-Based Access Control)可分为隐式角色访问控制和显式角色访问控制. 隐式角色访问 ...

随机推荐

  1. windows下libnet ARP

    查找自己的网卡: #include <libnet.h> #include <stdio.h> #include <iostream> #pragma commen ...

  2. Guava源码阅读-collect-Multiset

    package com.google.common.collect; 我们在进行字符统计时,同常采用的方法就是: String[] text=new String[]{"the weathe ...

  3. springBoot--组合注解RestController,GetMapping,PostMapping

    一.RestController @RestController 是@Controller和@ResponseBody的缩写 二.@getMapping和PostMapping @GetMapping ...

  4. HNOI 2012/codevs 1994:排队

    题目描述 Description 某中学有n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个 ...

  5. HanLP-基于HMM-Viterbi的人名识别原理介绍

    Hanlp自然语言处理包中的基于HMM-Viterbi处理人名识别的内容大概在年初的有分享过这类的文章,时间稍微久了一点,有点忘记了.看了 baiziyu 分享的这篇比我之前分享的要简单明了的多.下面 ...

  6. VS code 的使用

    VS code 是一个非常不错的代码编辑器.它不依赖与任何编译器或者解释器,但却能高效的利用第三方编译器或解释器来给用户提供良好的代码编写环境. 我喜欢VS code的三点,丰富强大的插件,快捷的语法 ...

  7. 前端vue组件传参

    ## 路由传参 """ 转跳: <router-link :to="'/course/'+course.id">{{course.name ...

  8. Devexpress xaf针对某个用户登录后在面板中设置导航无效的解决方法

    Devexpress xaf框架生成的项目默认情况下导航栏是显示在左侧,有时候我们用某个账户登录后,发现导航栏无法显示在左侧,操作十分不方便.我们可以去数据库删除当前登录用户的自定义布局 解决方法如下 ...

  9. k8s-jenkins pipeline部署

  10. dos(cmd)命令大全(本文摘至于网络)

    命令简介 cmd是command的缩写.即命令行 .       虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在 ...