简单说一下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: 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: 管理权限
常用权限
来源:oschina
链接:https://my.oschina.net/u/4361003/blog/4258251