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 局限性
- 如果LDAP分布在多台服務器上。
- 使用
groupdn
關鍵字的組條目的ACI必須與組條目位於同一服務器上,同時動態組成員也必須在同一個服務器上,靜態組成員可以位於遠程服務器上。 - 使用
roledn
關鍵字的ACI必須和角色定義條目在同一服務器上。
- 不能使用虛擬屬性(例如CoS)在以下的字段屬性中:
targetfilter
targetattrfilters
userattr
- 訪問控制規則僅限於當前主機,如果在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
: 關鍵字,target
、targetattr
、targetfilter
、targetattrfilters
。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
可以設置為add
或del
。attribute: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_rule
bind_rules;)
權限規則語法:
permission (rights)
permission
:設置允許(allow)還是拒絕(deny)rights
: 權限字段。
1. 用戶權限
權限 | 描述 |
---|---|
read |
設置用戶是否可以讀取目錄,僅適用於LDAP的搜索操作。 |
write |
設置用戶是否可以通過添加、修改和刪除屬性來修改條目。僅適用於LDAP中的modify 和modrdn 。 |
add |
設置用戶是否可以添加條目,僅適用於LDAP中的add 操作 |
delete |
設置用戶是否可以刪除條目,僅適用於LDAP中的delete 刪除操作。 |
search |
設置用戶是否可以搜索目錄數據。查看作為搜索結果的一部分返回,則分配search 和read 權限。僅適用於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_rule
bind_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服務器將根據member
、uniqueMember
、memberURL
、memberCertificateDescription
屬性驗證組成員身份。
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");)