OpenLdap快速落地實踐

簡單說一下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

OpenLdap快速落地實踐

OpenLdap快速落地實踐

配置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框架圖

OpenLdap快速落地實踐

建立一級分組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

最終效果:

OpenLdap快速落地實踐

管理員權限配置

前端權限配置:{-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

lam001

步驟:LAM configuration --> Edit server profiles --> 密碼lam

OpenLdap快速落地實踐OpenLdap快速落地實踐OpenLdap快速落地實踐OpenLdap快速落地實踐OpenLdap快速落地實踐OpenLdap快速落地實踐

搭建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

OpenLdap快速落地實踐

接入jumpserver示例:

這裏的匹配路徑和規劃的不太一致,僅供參考。但ou=jumpserver必定是基於memberof特性的

OpenLdap快速落地實踐

接入redmine:

OpenLdap快速落地實踐

接入Windows認證:

這裏須要安裝pGina

OpenLdap快速落地實踐

結束語:因爲新版本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編寫技巧補充

參考:<http://www.openldap.org/software/man.cgi?query=LDIF&sektion=5&apropos=0&manpath=OpenLDAP+2.4-Release#end>;

添加對象:

[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: 管理權限
經常使用權限

OpenLdap快速落地實踐

相關文章
相關標籤/搜索