FreeIPA ACI (Access Control Instructions) 訪問控制說明


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");)

參考鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM