Home Archives Categories Tags

Linux LDAP 搭建部署

发布时间: 更新时间: 总字数:3145 阅读时间:7m 作者: 分享

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 服务器保持同步的服务器

  • 对网络上的目录进行操作的客户机程序。下面这两个程序是一对儿:

    • ldapadd:打开一个到 LDAP 服务器的连接,绑定、修改或增加条目
    • ldapsearch:打开一个到 LDAP 服务器的连接,绑定并使用指定的参数进行搜索

  • 对本地系统上的数据库进行操作的几个程序:

    • slapadd:将以 LDAP 目录交换格式(LDIF)指定的条目添加到 LDAP 数据库中
    • slapcat:打开 LDAP 数据库,并将对应的条目输出为 LDIF 格式


安装LDAP客户端

yum install openldap-clients

命令行工具:

# ls /usr/bin/ | grep ldap
ldapadd
ldapcompare
ldapdelete
ldapexop
ldapmodify
ldapmodrdn
ldappasswd
ldapsearch
ldapurl
ldapwhoami

管理工具

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

使用 olcRootDNolcRootPW 登陆::

  • 用户名:cn=Manager,dc=xiexianbin,dc=cn
  • 密码:密码明文

参考

最新评论
加载中...