1. 目录服务
目录服务更多地是一个为快速查询而优化过的数据库,也支持更新
LDAP目录结构为树型,现在更流行按dns域来划分组织架构
每个节点可以视为一个entry,该entry拥有哪些属性,是由其所归属的objectClass来决定的,objectClass本身也是一个特殊的属性
schema文件中定义有哪些objectClass
RDN指定相对路径,如ou=People,dc=ben,dc=com
DN指绝对路径,如uid=babs,ou=People,dc=ben,dc=com
一个entry通过它的DN来引用
可以像关系型数据库一样,在某个范围内(dc=ben,dc=com)查询某个entry的某些属性,指定filter过滤器
LDAPv3是一个协议,openldap是它的一个实现,slapd是其二进制启动文件
1.2 slapd特点:
- CS架构
- 支持sasl认证
- 支持tls
- acl
- 多个backend db;当前使用的是LMDB
- 线程池
- 多节点目录内容复制
- 代理缓存
- 可定制性强
apache ds网站上说,openldap原来使用 BDB as their default database,这样会破坏数据,后来openldap换成了LMDB才解决,而apache ds还没有解决,所以不建议生产环境使用
服务端口389,tls加密用636
2. 安装openldap
安装后用slapd -VVV
查看具体信息
2.1 编译
编译注意事项
编译后
bin下是ldap客户端命令
sbin下slap服务端命令
libexec下是服务启动命令slapd
2.2 yum安装
会在/usr/lib64/openldap/下有module和库文件,可以在ldif文件中通过olcModuleload: memberof.la
加载
2.3 docker
编写了官方镜像osixia的docker-compose文件,但目前版本是2.4.47,3年没更新了
2.4 yum install openldap-ltb
2.5 启动
可以man slapd查看其对-f(默认配置文件)和-F(默认启动目录)的说明
有2种启动方式:
- 先修改完slapd.ldif后,再slapadd生成目录,再启动
- 先启动,再用ldapadd/ldapmodify修改(使用这种方式)
3. 配置文件
3.1 schema
schema文件中定义有哪些objectClass,文件中也有类似SNMP 的OID这样的数字层级
schema文件位于/etc/openldap/schema目录中,该目录中同时有.schema和.ldif 两类文件
.schema文件用于在slapd.ldif中include
.ldif文件用于服务运行后,再ldapadd
3.2 slapd.ldif
2.4版本后使用slapd.ldif
ldif格式的文件,内容格式有严格要求,以空行分隔entry,每行尾不能有空白字符
配置文件中的指令:
- cn=config部分
- cn=module,cn=config
- cn=schema,cn=config;实际的schema定义已经被硬编码到slapd二进制文件中了
自定义schema时用 - frontend是一个特殊的database,它用来存放database-level选项,这些选项(如olcAccess)会被应用到其他所有database;其他database的配置也能覆盖这个全局配置
config也是一个特殊的database
config和frontend databases总是先于其他databases创建,即使没有显式定义也会创建 - olcDatabase={1}mdb,cn=config
3.3 初始化mdb
该段虽然从官方文档中查到,但现在又查不到了,没时间不用管
openldap的根目录可以先进行初始化,也可以不用,只要slapd.ldif文件中定义了olcRootDN和olcRootPW
文档上说为了避免一个先有鸡还是先有蛋的问题,不初始化也能连接
初始化就是添加base.ldif,创建dn: cn=admin,dc=ben,dc=com
4. 命令
4.1 客户端命令
客户端命令属于在线式,其所做的修改立即生效
ldapsearch
ldapmodify,ldapadd在功能上相当于ldapmodify -a
ldapdelete
ldapwhoami ldapwhoami -H ldap://:389/ -D 'banqianwanbi@choice.com' -w
,AD服务器注意-D写法
选项:
-x # 指定simple认证,需要输入密码,默认为sasl认证;使用简单认证会暴露明文密码
-D # 指定绑定的DN
-H # 指定连接的主机url
-b # 指定searchbase,必须指定,没有默认值
-A # 只显示属性名,不显示值
-LLL # 指定显示信息的详细程序
-c # 出错继续,不退出
-n # dry run
执行报错时,查看日志
4.2 离线式
直接修改数据库,没怎么用过
slapadd
slapcat
slapindex
5. 访问控制
olcAccess指令格式
olcAccess:access to [what] by [who] [control]
当没有显式定义olcAccess时,acl list 为空,此时会追加默认全局只读权限
否则,acl list非空,此时会追加全局无任何权限(access to * by * none)
当使用ldapsearch查看olcAccess时,有多条acl,会用{0}、{1}这样的序号来表示,若要修改,也需要指定具体的序号
6. tls
6.1 服务端
需要定义这几个:
olcTLSCACertificateFile: olcTLSCertificateFile: olcTLSCertificateKeyFile:
6.2 客户端
不管是使用ldapsearch等命令行,还是linux主机通过ldap账户登录,都需要信任(为服务端签发证书的)CA证书,并在配置文件中指定证书路径;或者用tls_reqcert never/allow
使用ldapsearch等命令行
在linux主机的/etc/openldap/ldap.conf文件中添加
linux主机通过ldap账户登录
此时GUI中Apache DS Studio可以连接
Apache DS Studio在修改时,会有操作日志
定义密码策略、密码审计、使用ldap集中管理sudo权限
##
x. 客户端接入
yum install openldap后会有/etc/openldap/ldap.conf
可以在其中配置默认的ldap server信息,这样就不用在命令行中输入
也可以用其他配置文件,如.ldaprc,具体man ldap.conf
x.1 先集中创建用户账号
x.2 linux服务器
原来centos7上可以直接认证成功(通过yum安装,自定义的olcAccess),
后来使用docker安装又试,开始失败了;应该是这条“by self read”导致不能直接认证,需要验证一个账户权限后再读取dc=ben,dc=com的条目,才开始登录用户认证
这时在/etc/nslcd.conf文件中添加bind认证信息,再用systemctl restart nslcd
重启服务后可以了
centos8系统接入时, 参考,会自动创建家目录
在/etc/sssd/sssd.conf文件中添加bind认证信息,再用systemctl restart sssd oddjobd
重启服务后可以了
x.3 vsftpd
首先需要vsftpd服务器本身先作为linux服务器接入,然后在user_conf目录下创建对应的用户信息,此时可以通过在FTP_ROOT下手动创建用户家目录,或者直接将FTP_ROOT设置为/home,然后自动创建家目录,并通过autofs自动挂载
y. web-ui客户端
y.1 ssp
在官网上有详细文件,编写了docker-compose启动文件,可以自助修改密码
容器可以直接使用宿主机的dns解析
z. 启用memberOf
- 加载memberof和refint模块
- 添加2个overlay
- 使用迁移工具生成的group.ldif中,posixGroup中有属性memberUid来定义组成员,但没有member属性
- 目前决定ou=Group专门用来存储posixGroup组,用于linux操作系统登录;其他应用系统再创建
dn: ou=app_group,dc=ben,dc=com
,用来存放objectClass: groupOfNames
类型的组,供其他应用登录
jenkins和pve中,指定通过memberOf属性来查询用户的组信息,用户登录成功后,能看到组信息,然后再对组进行授权
gitea中,虽然界面显示通过memberUid来在组中查询包含的用户信息,也有通过将ldap中组映射成gitea的组织和团队,但都不生效
未完成的部分
6. 备份
- mdb_copy命令
- slapcat命令
slapcat -F slapd.d -n0 -l extracted_config.ldif
slapcat -f slapd.conf -b "dc=example,dc=com"
还原时再使用slapadd命令
使用yum install openldap-ltb安装后,带有slapd-cli.sh脚本,可以执行多种任务,包括备份、还原