OpenLdap快速落地实践

简单说一下OPENLDAP对运维管理的价值,支撑企业技术发展比如GIT,ZABBIX,JUMPSERVER,OA等大大小小系统,乃至Windows,Linux系统的认证登录。

如果每个平台都需要维护一个用户管理体系,那么如果一个员工拥有N个平台权限离职及常规权限变更,对于的管理无疑也是一个挑战,也无法做到精细化权限管理。

通过LDAP技术我们可以实现多平台账号集中管理,权限灵活控制,密码强度及其有效期的约束,将用户管理与各个平台解耦,最终实现一次修改N处生效。

OpenLDAP快速安装

本次实验环境安装以CentOS7.4+OpenLDAP2.4.4为基础环境

安装包说明

包名 作用
openldap OpenLDAP服务端和客户端用的库文件
openldap-servers 服务端程序
openldap-clients 客户端程序
openldap-devel 开发包,可选
openldap-servers-sql 支持sql模块,可选
migrationtools 实现OpenLDAP用户及用户组的添加,导入系统账户,可选
compat-openldap OpenLDAP 兼容性库

借鉴链接:

相关链接:<https://ldapwiki.com/wiki/0.9.2342.19200300.100.4.13>;

配置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定义属性。属性主要是为了人们更方便理解与定义

这里如果想了解这块,可以参考:<https://ldapwiki.com/wiki/InetOrgPerson>;

举例:增加一个用户李莉,我们用到了uid、cn、sn、givenName、mail、userPassword的属性来存储李莉的相关信息。

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: [email protected]
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包含的属性列表

常用的属性标示:

扫描二维码关注公众号,回复: 11145466 查看本文章
属性名 描述 举例
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: [email protected]
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: [email protected]
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快速落地实践

猜你喜欢

转载自blog.51cto.com/swiki/2491033