LDAP(Lightweight Directory Access Protocol)轻量目录访问协议,是常见的认证方式。本文介绍 Linux LDAP 搭建部署与使用教程。
LDAP
Lightweight Directory Access Protocol,轻量目录访问协议,他是基于 X.500(目录访问协议)的DAP发展过来的,与LDAP一样提供类似的目录服务软件还有ApacheDS、Active Directory、Red Hat Directory Service。
LDAP的特点
- LDAP基于TCP/IP
- LDAP的结构用树来表示
- LDAP读快写慢
- Client/server模型,Server 用于存储数据,Client提供操作目录信息树的工具,LDIF格式
- LDAP是一种开放Internet标准,LDAP协议是跨平台的Interent协议
LDAP一些概念
- 目录树:在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
- Entry:条目,也叫记录项,是LDAP中最基本的颗粒,就像字典中的词条,或者是数据库中的记录。通常对LDAP的添加、删除、更改、检索都是以条目为基本对象的。
- ObjectClass:对象类是属性的集合,LDAP预想了很多人员组织机构中常见的对象,并将其封装成对象类。比如人员(person)含有姓(sn)、名(cn)、电话(telephoneNumber)、密码(userPassword)等属性,单位职工(organizationalPerson)是人员(person)的继承类,除了上述属性之外还含有职务(title)、邮政编码(postalCode)、通信地址(postalAddress)等属性。
- Attribute:每个条目都可以有很多属性(Attribute),比如常见的人都有姓名、地址、电话等属性。每个属性都有名称及对应的值,属性值可以有单个、多个,比如你有多个邮箱。
- Schema:对象类(ObjectClass)、属性类型(AttributeType)、语法(Syntax)分别约定了条目、属性、值,他们之间的关系如下图所示。所以这些构成了模式(Schema)——对象类的集合。条目数据在导入时通常需要接受模式检查,它确保了目录中所有的条目数据结构都是一致的。一般存放路径为/etc/openldap/schema,一个条目的属性必须存在于已定义的schema中
- LDIF(LDAP Data Interchange Format):LDIF 是一种普遍使用的文件格式,用来描述目录信息或可对目录执行的修改操作。
- dc(Domain Component):域名的部分,其格式是将完整的域名分成几部分,如域名为example.com变成dc=example,dc=com(一条记录的所属位置)
- o(Organization):组织-公司
- ou(Organization Unit):组织单位,组织单位可以包含其他各种对象(包括其他组织单元),如“oa组”(一条记录的所属组织)
- c(Country Name):国家
- cn(Common Name):常用名称,如“Thomas Johansson”(一条记录的名称)
- dc(Domain Component):域名
- sn(Surname):姓,如“谢”
- rdn(Relative dn):相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分,如“uid=tom”或“cn=Thomas Johansson”
- uid(User Id):用户ID xianbin.xie(一条记录的ID)
- dn(Distinguished Name):“uid=songtao.xu,ou=oa组,dc=example,dc=com”,一条记录的位置(唯一)
- olc:on-line configuration 在线配置
- olcAccess: acl访问控制列表
示例
+-------------+
| |
| dc=CN <---+ 顶 级 域 名
| |
+------+------+
|
|
+------v------+
| <---------+下 一 级 域 名
|dc=xiexianbin+-----------+
| | |
+-----+-------+ |
| |
| |
+-----v------+ +-----v------+
| | | |
+----------+ ou=Tech | | ou=Finance <-----+ 组 织
| | | | |
| +------+-----+ +-----+------+
| | |
| | |
+-----v-----+ +------v-----+ +-----v------+
| | | | | |
| ou=Web | | ou=App | | uid=abc <-----+ 对 象
| | | | | |
+-----+-----+ +------+-----+ +------------+
| |
| |
+-----v-----+ +------v-----+
| | | |
| uid=foo | | uid=bar |
| | | |
+-----------+ +------------+
DN 示例:
- dn:dc=xiexianbin,dc=CN
- dn:ou=Tech,dc=xiexianbin,dc=CN
- dn:uid=foo,ou=Web,ou=Tech,dc=xiexianbin,dc=CN
DN 规则:
- DN的写法是从下向上,用逗号间隔;
- DN是唯一的,否则就没法确定一条entry了;
- rdn就是DN最左边的entry。
安装 LDAP 服务端
安装 LDAP 服务端
SELINUX=disabled
yum install openldap openldap-servers
版本:
# slapd -V
@(#) $OpenLDAP: slapd 2.4.44 (Aug 4 2017 14:23:27) $
mockbuild@c1bm.rdu2.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd
操作命令:
- systemctl enable slapd
- systemctl start slapd
- systemctl status slapd
安装 Berkeley DB
yum install -y db4 db4-utils
openldap使用Berkeley DB存储数据。
进程介绍
OpenLDAP 包在服务器上安装了很多程序:
守护进程:
- slapd:主 LDAP 服务器
- slurpd:负责与复制 LDAP 服务器保持同步的服务器
- slapd:主 LDAP 服务器
对网络上的目录进行操作的客户机程序。下面这两个程序是一对儿:
- ldapadd:打开一个到 LDAP 服务器的连接,绑定、修改或增加条目
- ldapsearch:打开一个到 LDAP 服务器的连接,绑定并使用指定的参数进行搜索
- ldapadd:打开一个到 LDAP 服务器的连接,绑定、修改或增加条目
对本地系统上的数据库进行操作的几个程序:
- slapadd:将以 LDAP 目录交换格式(LDIF)指定的条目添加到 LDAP 数据库中
- slapcat:打开 LDAP 数据库,并将对应的条目输出为 LDIF 格式
- slapadd:将以 LDAP 目录交换格式(LDIF)指定的条目添加到 LDAP 数据库中
安装LDAP客户端
yum install openldap-clients
命令行工具:
# ls /usr/bin/ | grep ldap
ldapadd
ldapcompare
ldapdelete
ldapexop
ldapmodify
ldapmodrdn
ldappasswd
ldapsearch
ldapurl
ldapwhoami
管理工具
- Apache Directory Studio
- phpLDAPadmin
- Self Service Password
- JXplorer
- LDAP Administrator
LDAP 配置
配置目录结构
# tree /etc/openldap -L 1 /etc/openldap ├── certs # 存放TLS认证的CA证书等 ├── check_password.conf ├── ldap.conf # openldap client 的配置文件 ├── schema └── slapd.d ├── cn=config # 存放数据库的配置文件 │ ├── cn=schema # 存放.ldif文件 │ ├── cn=schema.ldif │ ├── olcDatabase={0}config.ldif │ ├── olcDatabase={-1}frontend.ldif │ ├── olcDatabase={1}monitor.ldif │ └── olcDatabase={2}hdb.ldif └── cn=config.ldif
生产管理员密码
slappasswd -s 123123 # 输入2次,示例密码为:123123 {SSHA}pHDo26ZYkXQFbmFQHPdBLV7aHSP7JTIz
配置域信息
vim /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif
修改:
olcSuffix: dc=my-domain,dc=com
olcRootDN: cn=Manager,dc=my-domain,dc=com
为:
olcSuffix: dc=xiexianbin,dc=cn
olcRootDN: cn=Manager,dc=xiexianbin,dc=cn
olcRootPW: {SSHA}pHDo26ZYkXQFbmFQHPdBLV7aHSP7JTIz # 新增密码
- 监控权限
vim /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}monitor.ldif
修改:
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" read by dn.base="cn=Manager,dc=my-domain,dc=com" read by * none
为:
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" read by dn.base="cn=Manager,dc=xiexianbin,dc=cn" read by * none
- 设置 Database Cache
OpenLDAP默认使用的数据库是BerkeleyDB,现在来开始配置OpenLDAP数据库,使用如下命令:
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap -R /var/lib/ldap
chmod 700 -R /var/lib/ldap
# ll /var/lib/ldap/
total 348
-rwx------. 1 ldap ldap 2048 Jul 18 14:01 alock
-rwx------. 1 ldap ldap 286720 Jul 18 14:01 __db.001
-rwx------. 1 ldap ldap 32768 Jul 18 14:01 __db.002
-rwx------. 1 ldap ldap 49152 Jul 18 14:01 __db.003
-rwx------. 1 ldap ldap 845 Jul 18 14:16 DB_CONFIG
-rwx------. 1 ldap ldap 8192 Jul 18 14:01 dn2id.bdb
-rwx------. 1 ldap ldap 32768 Jul 18 14:01 id2entry.bdb
-rwx------. 1 ldap ldap 10485760 Jul 18 14:01 log.0000000001
测试配置文件
# # slaptest -u 5d313f73 ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif" 5d313f73 ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif" config file testing succeeded
重启slapd服务
systemctl restart slapd.service
导入模版
ls /etc/openldap/schema/*.ldif | xargs -I {} sudo ldapadd -Y EXTERNAL -H ldapi:/// -f {}
填加根域条目
LDIF(LDAP Data Interchanged Format)
在/etc/openldap/
目录下,创建一个base.ldif
:
cat > /etc/openldap/base.ldif << EOF
dn: dc=xiexianbin,dc=cn
o: Manager
objectclass: dcObject
objectclass: organization
EOF
执行:
# ldapadd -f /etc/openldap/base.ldif -x -D cn=Manager,dc=xiexianbin,dc=cn -W
Enter LDAP Password:
adding new entry "dc=xiexianbin,dc=cn"
- -f 指定文件,相当于mysql的.sql类文件
- -x 简单用户认证
- -D 绑定的dn
- -W 提示输入绑定dn的密码
说明:以上命令解决 phpldapadmin
左侧 This base cannot be created with PLA
- 导入用户组
group.ldif
内容:
cat > /etc/openldap/group.ldif << EOF
dn: ou=Dev,dc=xiexianbin,dc=cn
ou: Dev
objectClass: top
objectClass: organizationalUnit
dn: ou=Web,dc=xiexianbin,dc=cn
ou: Web
objectClass: top
objectClass: organizationalUnit
EOF
# ldapadd -f /etc/openldap/group.ldif -x -D cn=Manager,dc=xiexianbin,dc=cn -W
Enter LDAP Password:
adding new entry "ou=Dev,dc=xiexianbin,dc=cn"
adding new entry "ou=Web,dc=xiexianbin,dc=cn"
导入用户
cat > /etc/openldap/user.ldif << EOF dn: sn=dev1,ou=Dev,dc=xiexianbin,dc=cn cn: xie sn: dev1 userPassword: 123123 telephoneNumber: 16666666666 email: xiedev1@xiexianbin.cn description: "des" olcAllows: ture objectClass: person dn: sn=web1,ou=Web,dc=xiexianbin,dc=cn cn: xie sn: web1 userPassword: 123123 telephoneNumber: 16666666666 email: xieweb1@xiexianbin.cn description: "des" olcAllows: ture objectClass: person EOF
ldapadd -f /etc/openldap/user.ldif -x -D cn=Manager,dc=xiexianbin,dc=cn -W Enter LDAP Password: adding new entry "sn=dev1,ou=Dev,dc=xiexianbin,dc=cn" adding new entry "sn=web1,ou=Web,dc=xiexianbin,dc=cn"
LDAP client
# ldapsearch -x -b "dc=xiexianbin,dc=cn" -H ldap://127.0.0.1
# extended LDIF
#
# LDAPv3
# base <dc=xiexianbin,dc=cn> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# xiexianbin.cn
dn: dc=xiexianbin,dc=cn
o:: eGlleGlhbmJpbiA=
objectClass: dcObject
objectClass: organization
dc: xiexianbin
# Dev, xiexianbin.cn
dn: ou=Dev,dc=xiexianbin,dc=cn
ou: Dev
objectClass: top
objectClass: organizationalUnit
# Web, xiexianbin.cn
dn: ou=Web,dc=xiexianbin,dc=cn
ou: Web
objectClass: top
objectClass: organizationalUnit
# search result
search: 2
result: 0 Success
# numResponses: 4
# numEntries: 3
phpldapadmin
yum install phpldapadmin php httpd
- /etc/httpd/conf.d/phpldapadmin.conf # httpd 配置
- /usr/share/phpldapadmin/ # phpldapadmin 目录
- /etc/phpldapadmin/config.php # phpldapadmin 配置文件
修改 /etc/phpldapadmin/config.php
,找到Define your LDAP servers in this section
,去掉注释:
$servers->setValue('server','host','127.0.0.1');
$servers->setValue('server','port',389);
$servers->setValue('server','base',array('dc=xiexianbin,dc=cn')); # 有修改,在array中输入设置的olcSuffix
$servers->setValue('login','auth_type','session');
//$servers->setValue('login','attr','uid');
修改权限vim /etc/httpd/conf.d/phpldapadmin.conf
:
Alias /phpldapadmin /usr/share/phpldapadmin/htdocs
Alias /ldapadmin /usr/share/phpldapadmin/htdocs
<Directory /usr/share/phpldapadmin/htdocs>
<IfModule mod_authz_core.c>
# Apache 2.4
Require local
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from ::1
</IfModule>
</Directory>
为:
Alias /phpldapadmin /usr/share/phpldapadmin/htdocs
Alias /ldapadmin /usr/share/phpldapadmin/htdocs
<Directory /usr/share/phpldapadmin/htdocs>
<IfModule mod_authz_core.c>
# Apache 2.4
Require local
Require all granted
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
# Deny from all
Allow from all
</IfModule>
</Directory>
配置 http 访问
[root@xiexianbin_cn ~]# getsebool httpd_can_connect_ldap httpd_can_connect_ldap --> off [root@xiexianbin_cn ~]# setsebool -P httpd_can_connect_ldap on [root@xiexianbin_cn ~]# getsebool httpd_can_connect_ldap httpd_can_connect_ldap --> on
启动服务
systemctl start httpd
访问:
- http://
: /phpldapadmin - http://
: /ldapadmin
使用 olcRootDN
和 olcRootPW
登陆::
- 用户名:cn=Manager,dc=xiexianbin,dc=cn
- 密码:密码明文