簡單說一下OPENLDAP對運維管理的價值,支撐企業技術發展好比GIT,ZABBIX,JUMPSERVER,OA等大大小小系統,乃至Windows,Linux系統的認證登陸。php
若是每一個平臺都須要維護一個用戶管理體系,那麼若是一個員工擁有N個平臺權限離職及常規權限變動,對於的管理無疑也是一個挑戰,也沒法作到精細化權限管理。html
經過LDAP技術咱們能夠實現多平臺帳號集中管理,權限靈活控制,密碼強度及其有效期的約束,將用戶管理與各個平臺解耦,最終實現一次修改N處生效。前端
OpenLDAP快速安裝
本次實驗環境安裝以CentOS7.4+OpenLDAP2.4.4爲基礎環境java
安裝包說明
包名 | 做用 |
---|---|
openldap | OpenLDAP服務端和客戶端用的庫文件 |
openldap-servers | 服務端程序 |
openldap-clients | 客戶端程序 |
openldap-devel | 開發包,可選 |
openldap-servers-sql | 支持sql模塊,可選 |
migrationtools | 實現OpenLDAP用戶及用戶組的添加,導入系統帳戶,可選 |
compat-openldap | OpenLDAP 兼容性庫 |
借鑑連接:git
相關連接:<https://ldapwiki.com/wiki/0.9.2342.19200300.100.4.13>;web
配置repo源
mkdir /etc/yum.repos.d/backup mv /etc/yum.repos.d/* /etc/yum.repos.d/backup/ wget -O /etc/yum.repos.d/aliyun-centos7-base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/aliyun-centos7-epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum clean all yum makecache
OpenLDAP知識鋪墊
這裏簡單鋪墊幾個概念:正則表達式
- ldif文件:在openldap2.4的版本中增長了ldif方式修改配置的選擇,本方式是動態修改數據庫生效的,無需重啓服務,因此在後續的openLDAP版本也推薦使用該方式修改配置
- schema: 定義了openldap中可用的objectClass,而objectClass定義屬性的集合,若是須要使用某個屬性,那麼必定先引用包含該屬性的objectClass
- objectClass: 屬性的集合。
總結一下:schema文件定義objectClass,objectClass定義屬性。屬性主要是爲了人們更方便理解與定義sql
這裏若是想了解這塊,能夠參考:<https://ldapwiki.com/wiki/InetOrgPerson>;docker
舉例:增長一個用戶李莉,咱們用到了uid、cn、sn、givenName、mail、userPassword的屬性來存儲李莉的相關信息。shell
dn: uid=lili,ou=develop,ou=Users,dc=tars,dc=com objectclass: top objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson uid: lili cn: 李莉 sn: 李 givenName: 莉 mail: lili@tars.com userPassword: Az123456 ## 註解以下: uid: inetOrgPerson類包含,但使用該類,必須繼承 cn: person類必須包含,使用該類必須繼承top類 sn: person類必須包含,使用該類必須繼承top類 giveName: inetOrgPerson類包含,但使用該類,必須繼承 mail: inetOrgPerson類包含,但使用該類,必須繼承organizationalPerson userPassword: person類必須包含,使用該類必須繼承top類 ## 查看一下person類的schema: objectclass ( 2.5.6.6 NAME 'person' DESC 'RFC2256: a person' SUP top STRUCTURAL MUST ( sn $ cn ) MAY ( userPassword $ telephoneNumber $ seeAlso $ description ) ) 註解以下: 2.5.6.6 ## OID,主要用於被ldap內部數據庫引用的標示。 NAME 'person' ##objectClass類名 SUP top STRUCTURAL ##依賴的上層類 MUST ( sn $ cn ) ##使用該objectClass必須定義的屬性 MAY ##該objectClass包含的屬性列表
經常使用的屬性標示:
屬性名 | 描述 | 舉例 |
---|---|---|
uid | 用戶的登陸名 | uid=ops,ou=caller,ou=Users,dc=tars,dc=com |
cn | 一般指一我的的全名 | |
sn | 一般指一我的的姓 | |
giveName | 一般指一我的的名 | |
dn | 惟一標識名,一個對象的絕對路徑。 | uid=ops,ou=dev,ou=Users,dc=tars,dc=com |
ou | 存放對象的容器,能夠理解爲組的概念 | 好比上面uid=ops用戶,在dev組下 |
dc | 一般指一個域名 | 好比dc=tars,dc=com |
基於yum的安裝
# 安裝 yum -y install openldap openldap-servers openldap-clients compat-openldap openldap-devel migrationtools # 生成加密密鑰,這裏密碼爲root的加密字符串,這裏-s 爲生產一個新密碼的意思(生產禁止低級字符串) [root@mgt-ldap-master1 ~]# slappasswd -s root {SSHA}k63c6hDYR0kP2KVD7q6iL+t/GrkfF0Az
基於ldap配置模板生成配置
在2.4之前的版本是能夠基於slapd.conf.obsolete快速配置的,在新版本中該模板配置文件並不存在,但存在ldif的模板配置,多是爲了推廣ldif文件的使用吧。這裏使用ldif快速初始化配置,當openldap成形後,能夠維護一個模板ldif文件,來實現快速生產安裝。參考模板見文章底部補充。
這裏給一個官方連接:<https://www.openldap.org/doc/admin24/slapdconf2.html>;
openldap的守護進程爲slapd
,運行用戶爲ldap
,默認端口爲389
# cd /etc/openldap # mv slapd.d slapd.d.bak # mkdir slapd.d # cp /usr/share/openldap-servers/slapd.ldif /etc/openldap/ # cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG # vim /etc/openldap/slapd.ldif ##修改後的初始化ldif文件,配置文件見下方「初始化ldif文件示意說明」 # slapadd -n 0 -F slapd.d -l slapd.ldif ##生成配置數據庫信息 # slapadd -n 0 -F slapd.d -l slapd.ldif _#################### 100.00% eta none elapsed none fast! Closing DB... # chown -R ldap:ldap slapd.d # chown -R ldap:ldap /var/lib/ldap # systemctl start slapd # systemctl enable slapd # systemctl status slapd ## 初始化ldif文件示意說明 # 打開以下行的註釋 dn: cn=module,cn=config ## 開啓該配置 objectClass: olcModuleList ## 引入olcModuleList類 cn: module ## 聲明module位置 olcModulepath: /usr/lib64/openldap ## 引入 olcModuleload: memberof.la ## 當openldap接入第三方平臺時,使用該模塊功能 olcModuleload: ppolicy.la ## 用來設置用戶的密碼策略 olcModuleload: syncprov.la ## openldap的主從及主主等多種複製模型使用 ## 將如下配置所有打開來引入方法,方便使用。 include: file:///etc/openldap/schema/core.ldif include: file:///etc/openldap/schema/collective.ldif include: file:///etc/openldap/schema/corba.ldif include: file:///etc/openldap/schema/cosine.ldif include: file:///etc/openldap/schema/duaconf.ldif include: file:///etc/openldap/schema/dyngroup.ldif include: file:///etc/openldap/schema/inetorgperson.ldif include: file:///etc/openldap/schema/java.ldif include: file:///etc/openldap/schema/misc.ldif include: file:///etc/openldap/schema/nis.ldif include: file:///etc/openldap/schema/openldap.ldif include: file:///etc/openldap/schema/pmi.ldif include: file:///etc/openldap/schema/ppolicy.ldif dn: olcDatabase=hdb,cn=config下: olcSuffix: dc=tars,dc=com ## 設置根域名,一切基於根 olcRootDN: cn=tarsadmin,dc=tars,dc=com ## 配置管理員用戶,記住管理員認證請寫完整路徑 olcRootPW: {SSHA}/xmXwhZMnnXtpErLGiIi2EEoCPNwBQxd ## 爲了方便直接初始化時完成密碼配置,本行爲新增,該密碼爲slappasswd生成的密文密碼
建立基本域
當基本域配置完成可再次嘗試以上步驟
# ldapadd -x -D cn=superman,dc=tars,dc=com -W -f config_init.ldif dn: dc=tars,dc=com dc: tars objectClass: top objectClass: domain
客戶端測試
關於客戶端的選擇openldap的支持仍是多種多樣的,我這裏選擇的是LdapAdmin
,該工具比較小巧簡潔,且支持Linux。不過真正的生產的操做我大多數仍是基於web的ldap客戶端來完成的,用的較多的phpadmin
以及LDAP Account Manager
這裏先使用ldapadmin來完成基本的測試操做。
ldapadmin配置以下,這裏須要強調的是,對於ldap而言,用戶名在認證時非superman
而是樹狀的絕對完整路徑cn=superman,dc=tars,dc=com
配置slapd日誌
# 關於日誌級別 man SLAPD-CONFIG 搜索olcLogLevel # 配置日誌文件 mkdir /var/log/slapd touch /var/log/slapd/slapd.log chown -R ldap.ldap /var/log/slapd # 配置slapd中rsyslog接收 vim /etc/rsyslog.d/slapd.conf local4.* /var/log/slapd/slapd.log systemctl enable rsyslog;systemctl restart rsyslog # 添加日誌記錄策略 vim add_log.ldif # ldapadd -Y EXTERNAL -H ldapi:/// -f add_log.ldif dn: cn=config changetype: modify add: olcLogLevel olcLogLevel: stats ## 事實上,添加的這個過稱也能夠在初始化的文件中來完成。在初始化的slapd.ldif添加 在dn: cn=config下添加 olcLogLevel: stats # 生效日誌策略,用管理員權限報錯說權限不足,用api去配置日誌ldif ldapadd -Y EXTERNAL -H ldapi:/// -f add_log.ldif # 重啓slapd服務 systemctl restart slapd # 查看是否有新的日誌生成 tail -f /var/log/slapd/slapd.log # 可選的日誌週期性切割 cat > /etc/logrotate.d/slapd <<EOF /var/log/slapd/slapd.log{ daily #天天輪詢一次 rotate 5 #保存5個歷史日誌文件,超過的刪除 copytruncate #複製源日誌內容後,清空文件,而不是建立新文件 dateext #切割文件時,文件名帶有日期 missingok #若是指定的目錄不存在,會報錯,此選項用來抑制報錯 } EOF # systemctl restart rsyslog > 測試日誌切割,查看日否有新文件分割 # logrotate -f /etc/logrotate.d/slapd
快速建立Ldap認證框架
ldap框架圖
建立一級分組Users/Groups/Services
關於ldif的寫法能夠參考:<http://www.openldap.org/software/man.cgi?query=LDIF&sektion=5&apropos=0&manpath=OpenLDAP+2.4-Release#end>;
## 編寫配置文件 [root@localhost group]# cat groups_init.ldif ## ldif語法要求,不一樣組用空格隔開 dn: ou=Users,dc=tars,dc=com ##計劃修改對象的DN ou: Users ##操做的對象是什麼 objectClass: top ##定義對象所依賴的類名,注意類的依賴順序 objectClass: organizationalUnit dn: ou=Groups,dc=tars,dc=com ou: Groups objectClass: top objectClass: organizationalUnit dn: ou=Services,dc=tars,dc=com ou: Services objectClass: top objectClass: organizationalUnit [root@mgt-ldap-master1 init]# ldapadd -x -D cn=superman,dc=tars,dc=com -W -f groups_init.ldif Enter LDAP Password: root adding new entry "ou=Users,dc=tars,dc=com" adding new entry "ou=Groups,dc=tars,dc=com" adding new entry "ou=Services,dc=tars,dc=com"
建立Users二級子目錄
# cat users_ou_add.ldif dn: ou=risk,ou=Users,dc=tars,dc=com ou: risk objectClass: top objectClass: organizationalUnit dn: ou=develop,ou=Users,dc=tars,dc=com ou: develop objectClass: top objectClass: organizationalUnit dn: ou=bigdata,ou=Users,dc=tars,dc=com ou: bigdata objectClass: top objectClass: organizationalUnit dn: ou=disable,ou=Users,dc=tars,dc=com ou: disable objectClass: top objectClass: organizationalUnit [root@mgt-ldap-master1 init]# ldapadd -x -D cn=superman,dc=tars,dc=com -W -f users_ou_add.ldif Enter LDAP Password: root adding new entry "ou=risk,ou=Users,dc=tars,dc=com" adding new entry "ou=develop,ou=Users,dc=tars,dc=com" adding new entry "ou=bigdata,ou=Users,dc=tars,dc=com" adding new entry "ou=disable,ou=Users,dc=tars,dc=com"
建立Groups二級子目錄
# cat groups_ou_add.ldif dn: ou=manager,ou=Groups,dc=tars,dc=com ou: manager objectClass: top objectClass: organizationalUnit
建立Services二級子目錄
-
鋪墊memberof:
不少場景下,咱們須要快速的查詢某一個用戶是屬於哪個或多個組的(member of)。memberOf 正是提供了這樣的一個功能:若是某個組中經過 member 屬性新增了一個用戶,OpenLDAP 便會自動在該用戶上建立一個 memberOf 屬性,其值爲該組的 dn。
-
爲何基於memberof建立:
普通的ou只能解決存儲對象主體的問題。若是A用戶在ou=Users下已經建立,若是jumpserver服務須要給予A用戶認證權限,只須要藉助memberof的特性在jumpserver的組內添加A用戶的DN便可,而普通ou沒法作到這一點。memberof組用客戶端工具不太容易建立,建議手寫配置建立
# cat services_ou_add.ldif dn: ou=jumpserver,ou=Services,dc=tars,dc=com ou: jumpserver objectClass: top objectClass: organizationalUnit dn: ou=gitlab,ou=Services,dc=tars,dc=com ou: gitlab objectClass: top objectClass: organizationalUnit
新建用戶小王,莉莉等人到研發組,初始密碼爲Az123456
# ldapadd -x -D cn=superman,dc=tars,dc=com -W -f add_user.ldif dn: uid=lili,ou=develop,ou=Users,dc=tars,dc=com objectclass: top objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson uid: lili cn: 李莉 sn: 李 givenName: 莉 mail: lili@tars.com userPassword: Az123456 dn: uid=xiaowang,ou=develop,ou=Users,dc=tars,dc=com objectclass: top objectclass: person objectclass: organizationalPerson objectclass: inetOrgPerson uid: xiaowang cn: 小王 sn: 小 givenName: 王 mail: xiaowang@tars.com userPassword: Az123456
建立jumpserver的admin及user子組
基於memberof建立,以便於接入第三方平臺。
dn: cn=admin,ou=jumpserver,ou=Services,dc=tars,dc=com cn: admin objectClass: top objectClass: groupOfNames member: uid=xiaowang,ou=develop,ou=Users,dc=tars,dc=com dn: cn=user,ou=jumpserver,ou=Services,dc=tars,dc=com cn: user objectClass: top objectClass: groupOfNames member: uid=xiaowang,ou=develop,ou=Users,dc=tars,dc=com
建立管理員組manager
dn: cn=confadmin,ou=manager,ou=Groups,dc=tars,dc=com cn: confadmin objectClass: top objectClass: groupOfNames member: uid=xiaowang,ou=develop,ou=Users,dc=tars,dc=com dn: cn=useradmin,ou=manager,ou=Groups,dc=tars,dc=com cn: user objectClass: top objectClass: groupOfNames member: uid=lili,ou=develop,ou=Users,dc=tars,dc=com dn: cn=search_proxy,ou=manager,ou=Groups,dc=tars,dc=com cn: search_proxy objectClass: top objectClass: groupOfNames member: uid=lili,ou=develop,ou=Users,dc=tars,dc=com
最終效果:
管理員權限配置
前端權限配置:{-1}frontend,cn=config
這裏前端權限配置主要負責作一些對象的配置修改
[root@mgt-ldap-master1 init]# cat sys_front.ldif # ldapadd -Y EXTERNAL -H ldapi:/// -f sys_front.ldif dn: olcDatabase={-1}frontend,cn=config changetype: modify add: olcAccess olcAccess: to attrs=userPassword,shadowLastChange by group.exact="cn=useradmin,ou=manager,ou=Groups,dc=tars,dc=com" write by anonymous auth by self write by * none - add: olcAccess olcAccess: to dn.subtree="dc=tars,dc=com" by group.exact="cn=search_proxy,ou=manager,ou=Groups,dc=tars,dc=com" read by group.exact="cn=useradmin,ou=manager,ou=Groups,dc=tars,dc=com" write by users read - add: olcAccess olcAccess: to dn.subtree="" by * read [root@mgt-ldap-master1 init]# ldapadd -Y EXTERNAL -H ldapi:/// -f front.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={-1}frontend,cn=config"
配置文件權限配置:{0}config,cn=config
這裏配置文件權限配置作一些openldap全局服務器配置修改
[root@mgt-ldap-master1 init]# cat sys_config.ldif # ldapadd -Y EXTERNAL -H ldapi:/// -f sys_config.ldif dn: olcDatabase={0}config,cn=config changetype: modify replace: olcAccess olcAccess: to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage by group.exact="cn=confadmin,ou=manager,ou=Groups,dc=tars,dc=com" write by * none [root@mgt-ldap-master1 init]# ldapadd -Y EXTERNAL -H ldapi:/// -f sys_config.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={0}config,cn=config"
關閉匿名訪問
[root@mgt-ldap-master1 init]# cat authority.ldif dn: cn=config changetype: modify add: olcDisallows olcDisallows: bind_anon
confiadmin與useradmin效果比對
[root@mgt-ldap-master1 init]# ldapadd -x -D uid=lili,ou=develop,ou=Users,dc=tars,dc=com -W -f authority.ldif Enter LDAP Password: modifying entry "cn=config" ldap_modify: Insufficient access (50) [root@mgt-ldap-master1 init]# [root@mgt-ldap-master1 init]# ldapadd -x -D uid=xiaowang,ou=develop,ou=Users,dc=tars,dc=com -W -f authority.ldif Enter LDAP Password: modifying entry "cn=config"
關閉匿名後測試
設置用戶能夠本身修改密碼。須要對比上面已經有配置配置過了
dn: olcDatabase=frontend,cn=config olcAccess: to attrs=userPassword,shadowLastChange by dn.children="ou=Admin,dc=xiodi,dc=cn" write by anonymous auth by self write by * none
搭建LAM
# 建議外掛式配置文件,直接託管到kubernetes,能夠先配置而後將docker裏的配置文件複製出來,造成外掛式配置 docker run -p 8080:80 -it -d ldapaccountmanager/lam:stable
步驟:LAM configuration --> Edit server profiles --> 密碼lam
搭建Self Service Password
Self Service Password 該服務使用戶自助修改/找回密碼得以實現,解決密碼修改的難題。基於docker構建,每一個團隊的構建不太同樣,因此這裏僅提供思路
關於這塊可能你須要看一下關於官方的密碼修改說明:
<https://ltb-project.org/documentation/self-service-password>;
docker run -p 8081:80 --add-host=smtp.mxhichina.com:10.3.1.25 --name ssp-system -v /data1/self-service-password/conf:/var/www/html/conf -d regist-docker.mgt.tarscorp.com/3rd_ops/self-service-password:latest
接入jumpserver示例:
這裏的匹配路徑和規劃的不太一致,僅供參考。但ou=jumpserver必定是基於memberof特性的
接入redmine:
接入Windows認證:
這裏須要安裝pGina
結束語:因爲新版本2.4系列目前全網的可借鑑文檔實在太少,也不太準確。本篇文檔僅提供一個快速安裝的參考,其他的常規配置均已體如今文章之中。但密碼策略ppolicy.la及高可用syncprov.la模塊,若是有時間後續將會繼續放出咱們的實踐以及經驗分享。
補充內容:
初始化slapd.ldif文件內容補充
# # See slapd-config(5) for details on configuration options. # This file should NOT be world readable. # dn: cn=config objectClass: olcGlobal cn: config olcArgsFile: /var/run/openldap/slapd.args olcPidFile: /var/run/openldap/slapd.pid olcLogLevel: stats # # TLS settings # olcTLSCACertificatePath: /etc/openldap/certs olcTLSCertificateFile: "OpenLDAP Server" olcTLSCertificateKeyFile: /etc/openldap/certs/password # # Do not enable referrals until AFTER you have a working directory # service AND an understanding of referrals. # #olcReferral: ldap://root.openldap.org # # Sample security restrictions # Require integrity protection (prevent hijacking) # Require 112-bit (3DES or better) encryption for updates # Require 64-bit encryption for simple bind # #olcSecurity: ssf=1 update_ssf=112 simple_bind=64 # # Load dynamic backend modules: # - modulepath is architecture dependent value (32/64-bit system) # - back_sql.la backend requires openldap-servers-sql package # - dyngroup.la and dynlist.la cannot be used at the same time # dn: cn=module,cn=config objectClass: olcModuleList cn: module #olcModulepath: /usr/lib/openldap olcModulepath: /usr/lib64/openldap #olcModuleload: accesslog.la #olcModuleload: auditlog.la #olcModuleload: back_dn***v.la #olcModuleload: back_ldap.la #olcModuleload: back_mdb.la #olcModuleload: back_meta.la #olcModuleload: back_null.la #olcModuleload: back_passwd.la #olcModuleload: back_relay.la #olcModuleload: back_shell.la #olcModuleload: back_sock.la #olcModuleload: collect.la #olcModuleload: constraint.la #olcModuleload: dds.la #olcModuleload: deref.la #olcModuleload: dyngroup.la #olcModuleload: dynlist.la olcModuleload: memberof.la #olcModuleload: pcache.la olcModuleload: ppolicy.la #olcModuleload: refint.la #olcModuleload: retcode.la #olcModuleload: rwm.la #olcModuleload: seqmod.la #olcModuleload: smbk5pwd.la #olcModuleload: sssvlv.la olcModuleload: syncprov.la #olcModuleload: translucent.la #olcModuleload: unique.la #olcModuleload: valsort.la # # Schema settings # dn: cn=schema,cn=config objectClass: olcSchemaConfig cn: schema include: file:///etc/openldap/schema/core.ldif include: file:///etc/openldap/schema/collective.ldif include: file:///etc/openldap/schema/corba.ldif include: file:///etc/openldap/schema/cosine.ldif include: file:///etc/openldap/schema/duaconf.ldif include: file:///etc/openldap/schema/dyngroup.ldif include: file:///etc/openldap/schema/inetorgperson.ldif include: file:///etc/openldap/schema/java.ldif include: file:///etc/openldap/schema/misc.ldif include: file:///etc/openldap/schema/nis.ldif include: file:///etc/openldap/schema/openldap.ldif include: file:///etc/openldap/schema/pmi.ldif include: file:///etc/openldap/schema/ppolicy.ldif # # Frontend settings # dn: olcDatabase=frontend,cn=config objectClass: olcDatabaseConfig objectClass: olcFrontendConfig olcDatabase: frontend # # Sample global access control policy: # Root DSE: allow anyone to read it # Subschema (sub)entry DSE: allow anyone to read it # Other DSEs: # Allow self write access # Allow authenticated users read access # Allow anonymous users to authenticate # #olcAccess: to dn.base="" by * read #olcAccess: to dn.base="cn=Subschema" by * read #olcAccess: to * # by self write # by users read # by anonymous auth # # if no access controls are present, the default policy # allows anyone and everyone to read anything but restricts # updates to rootdn. (e.g., "access to * by * read") # # rootdn can always read and write EVERYTHING! # # # Configuration database # dn: olcDatabase=config,cn=config objectClass: olcDatabaseConfig olcDatabase: config olcAccess: to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,c n=auth" manage by * none # # Server status monitoring # dn: olcDatabase=monitor,cn=config objectClass: olcDatabaseConfig olcDatabase: monitor olcAccess: to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,c n=auth" read by dn.base="cn=tarsadmin,dc=tars,dc=com" read by * none # # Backend database definitions # dn: olcDatabase=hdb,cn=config objectClass: olcDatabaseConfig objectClass: olcHdbConfig olcDatabase: hdb olcSuffix: dc=tars,dc=com olcRootDN: cn=tarsadmin,dc=tars,dc=com olcRootPW: {SSHA}k63c6hDYR0kP2KVD7q6iL+t/GrkfF0Az olcDbDirectory: /var/lib/ldap olcDbIndex: objectClass eq,pres olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
LDAP下的LDIF編寫技巧補充
添加對象:
[root@localhost scripts]# cat config_init.ldif # ldapadd -x -D cn=tarsadmin,dc=tars,dc=com -W -f config_init.ldif dn: dc=tars,dc=com dc: tars objectClass: top objectClass: domain
變動對象值:
# modify能夠執行add,delete,replace # - 表示繼承上一個dn # 空格表示下一個條目 dn: cn=Babs Jensen,dc=example,dc=com changetype: modify add: givenName givenName: Barbara givenName: babs - replace: description description: the fabulous babs - delete: sn sn: jensen - dn: cn=Babs Jensen,dc=example,dc=com changetype: modrdn newrdn: cn=Barbara J Jensen deleteoldrdn: 0 newsuperior: ou=People,dc=example,dc=com
LDAP關於ACL的補充
訪問控制ACL介紹
訪問控制主要定義三大方面:
<what>部分選擇應用訪問的條目和/或屬性, <who>部分指定授予哪些實體訪問, <access>部分指定授予的訪問。 # 總的來看是【哪些條目】對【誰】設置【哪些權限】
具體實現格式
access to [what] by [who] [access] by [who] [access]
what (控制對什麼的訪問)
訪問規範的<what>部分肯定了應用訪問控制的條目和屬性。條目一般有三種選擇方式:
• 經過DN • 經過過濾器。 • 經過屬性
經過DN肯定
to * // 選擇全部 to dn[.<basic-style>]=<regex> // 使用正則 to dn.<scope-style>=<DN> // 使用範圍 表達式實例: access to dn.regex="uid=,+,ou=Users,dc=example,dc=com" 範圍: base,one,subtree,children
經過 filter肯定
to filter=<ldap filter> 例: access to filter=(objectClass=person) # 匹配含有person對象類的條目 access to filter="(|(|(givenName=Matt)(givenName=Barbara))(sn=Kant))" # 匹配知足(sn=Kant)或者知足(|(givenName=Matt)(givenName=Barbara)),,,而(|(givenName=Matt)(givenName=Barbara))的意思是知足(givenName=Matt)或者(givenName=Barbara)中的任意一個 access to dn.subtree="ou=Users,dc=example,dc=com「 filter="(employeeNumber=*)" # 匹配知足ou=Users,dc=example,dc=com及向下 。。。
經過attr肯定
attrs=<attribute list> attrs=<attribute> val[.<style>]=<regex> 例: to attrs=userPassword,shadowLastChange #匹配包含屬性userPassword,shadowLastChange
who(向誰授予訪問權限)
<who>部分標識被授予訪問權限的實體。注意,訪問被授予「實體」而不是「條目」。
下表總結了實體說明符:
說明 | 實體 |
---|---|
* | 全部,包括匿名和通過身份驗證的 |
anonymous | 匿名用戶(未驗證) |
users | 經過身份驗證的用戶 |
self | 與目標條目關聯的用戶 |
dn[.<basic-style>]=<regex> | 匹配正則表達式的用戶 |
dn.<scope-style>=<DN> | DN範圍內的用戶 |
access(權限定義)
顆粒權限
授予的<access>類型能夠是如下類型之一: w:對記錄或屬性的寫訪問。 r:對記錄或屬性的讀訪問。 s:對記錄或屬性的搜索訪問。 c:訪問對記錄或屬性運行比較操做。 x:訪問對記錄或屬性執行服務器端身份驗證操做。 d:訪問記錄或屬性是否存在的信息 (d表明「披露」)。 0: 不容許訪問記錄或屬性。這至關於-wrscxd。 m: 管理權限