简单说一下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: 管理权限