您的位置 首页 > 数码极客

【ldap是什么意思】LDAP安全搜索(干产品共享)

关于0x01 LDAP的几个简单科普

“LDAP”是基于tcp/ip的轻量级目录访问协议,是X.500目录协议族的简化版本

可以暂时粗暴地解释为“特殊类型的数据库”。通常,此数据库文件后缀为`.' ldif ',可以使用特殊的节点查找语句获取相应的数据。

在实际生产环境中,主要用于执行各种查询。查询,也就是说会有很多读取操作。

Ldap支持简单的更新功能(写功能),但由于写效率不高,因此不常用。(威廉莎士比亚、LDAP、LDAP、LDAP、LDAP、LDAP、LDAP)

如果真的写得多,最好直接用各种关系数据库代替。不需要使用LDAP。毕竟术业有专攻。

此外,LDAP跨平台、功能简洁、管理、配置、读取性能也很好。另外,可以分散分发。不知道能否将它的分布理解为windows域的目录树。“森林概念”

最常用的是“集中认证”。最后,还必须知道,LDAP中的所有数据基本上都是以明文直接传输的,很容易被拦截,但支持SSL。

0x02其他常用目录服务工具

X.500太大,太肥大

Ldap轻量级和简单配置

Windows active directory有平台限制

NIS个人还没有接触过。

了解0x03 LDAP内部数据的一般存储方式

与常规关系数据库不同,LDAP不通过常规库、表和字段的方式存储数据

相反,根据特殊的逆树层次结构组织管理数据。其中树表示目录信息树,即“DIT”。

目录信息树相当于只读数据库

DIT内部包含n个条目“entry”,相当于常规数据库表中的每个特定记录。

项目的内容是由具有唯一辨别名称' DN '的属性[Attribute]和与属性相对应的值[value]组成的集合。

条目是LDAP中最基本的业务实体。通常,LDAP添加和删除查询以条目为基本单位

以下是完整的项目信息,实际上相当于普通关系数据库中的记录。

Dn :cn=aima aima,ou=people,DC=ldapmaster,DC=org

对象类: POSIX帐户

ObjectClass: inetOrgPerson

object class : organizationalperson

ObjectClass: person

ObjectClass: shadowAccount

标志外壳:/bin/bash

Uid: aima

Cn: aima aima

Uid号: 10000

Gid号: 173

Sn: sec

GivenName: aima

HomeDirectory: /home/aima

ShadowLastChange: 17520

user password :3360 e 1 nts ef 9 oexmz 2 fyuhqzegl 2k 0 rscwvoq 09ma 0 lxtnkxtwrvee 4=

0x04识别LDAP中常见缩写的含义

与Linux文件系统的绝对路径类似的dn唯一标注可以通过dn快速查找目录信息树中的所有节点

Basedn是我们称之为目录信息树的根,rdn是相对标签名,即相对路径。

Dc通常用于将整个域名分为多个部分。例如,roo将显示为“dc=rootkit,dc=org”

Uid用户id。通常派生自/etc/passwd

Cn名称(通常在/etc/group中提供)

Sn城

o组织[公司]的名称,这些在逻辑上是分开的

Ou单位[部门]名称

0x05与许多服务一样,LDAP服务也在C/S体系结构模式下工作

服务器端负责提供整个目录信息树,客户端拿着相应的信息树查询工具向服务器端提交查询请求后,服务器端会响应特定的项目数据,或者直接返回指针。

如果服务器端返回指针,则客户端必须将指针移回指定的LDAP服务器,以查询相应的项目数据。

此次演示环境

cen IP : 192 . 168 . 3 . 68 LDAP master

cenip : 192 . 168 . 3 . 69 LDAP slave

0x06开始实战部署OpenLDAP,对于OpenLDAP本身没什么好说的。这就是LDAP协议的具体实现。

部署前准备环境、安装完整的基本环境软件包、集成所有系统时间、系统名称.

# yum group install ' development tools '-y

# /usr/sbin/ntpdate

# crontab -e

*/2 * * */2 * * */usr/sbin/ntpdate每两分钟同步一次时间

# crontab -l

# vi /etc/hosts

192.168.3.68 lda

192.168.3.69 lda

安装openldap及其必要的依赖库

# yum install openldap openldap-* -y

# yum -y install nscd nss-pam-ldapd pcre pcre-*

# yum -y update nss-softokn-freebl 此处软件包有冲突,最好分开装

# yum -y install nss-*

# rpm -qa | grep openldap

# id ldap 安装完成后,会自动创建一个名为ldap的系统伪用户,专用用来跑ldap服务

# slapd -V 此处演示的openldap版本为2.4

0x07 以上没问题后,我们开始来配置OpenLdap,此处依然使用兼容2.3版本的配置方式

# cd /etc/openldap/

# cp /usr/share/openldap-server

# ls -l

设置ldap管理员密码,还是那句话,实际生产环境中,这个密码务必要足够的强壮

# slappasswd -s klion 生成ldap管理员密码hash,并把它追加到ldap主配置中

# slappasswd -s klion | sed -e "s#{SSHA}#rootpw\t{SSHA}#g" >>/etc/openldap/

# tail -n 1 /etc/openldap/

rootpw {SSHA}rkmKIPz4B5y6MmGLqSZbMZy0JMVY/gzK

# cp _`date +%Y%m%d`.bak

修改ldap数据库及日志设置,注意配置文件中的所有配置项必须顶格写

# vi /etc/openldap/

# 先把默认的数据库配置全部注释掉

# database definitions

# database bdb

# suffix "dc=my-domain,dc=com"

# checkpoint 1024 15

# rootdn "cn=Manager,dc=my-domain,dc=com"

# 再来新增自己的数据库配置

database bdb # 指定使用的数据库格式

suffix "dc=ldapmaster,dc=org" # 指定域名

rootdn "cn=klion,dc=ldapmaster,dc=org" # 指定ldap管理员的dn

rootpw {SSHA}rkmKIPz4B5y6MmGLqSZbMZy0JMVY/gzK # ldap管理员的密码hash,就是我们上面设置的klion

# 设置ldap日志

loglevel 296 指定日志级别

cachesize 2000 可以缓存的记录总数

checkpoint 2048 10 每到2048K或者每10分钟把内存中的数据往数据库中写一次

# 修改ldap默认的ACL,此处,支持直接用正则表示,严禁允许直接匿名访问,非常危险,极易造成大量敏感信息泄露

# 建议把默认的access项全部注释掉,换成如下权限,所谓的 `ldap未授权` 的根源也就在这里

# 下面ACL只做简单demo参考,大家可根据自己的实际情况,把to后的*换成更具体的范围,把by 后的权限控制的更精细些

access to *

by self write

by anonymous auth

by user read

# egrep -v "^$|#" /etc/openldap/ 最后,检查配置

详细的ACL编写,可直接参考其官方说明,如下

0x08 让rsyslog记录ldap日志

# cp /etc /etc_`date +%Y%m%d`.bak

# echo "local4.* /var/log; >> /etc

# tail -n 1 /etc

# /etc restart

0x09 修改ldap数据库的存放路径

# grep bdb /etc/openldap/

# cp /usr/share/openldap-server /var/lib/ldap/DB_CONFIG

# chown ldap.ldap /var/lib/ldap/DB_CONFIG

# chmod 700 /var/lib/ldap/

# ll /var/lib/ldap/

# egrep -v "#|^$" /var/lib/ldap/DB_CONFIG

# slaptest -u 检查配置是否正确

# egrep -v "^#|^$" /etc/openldap/

0x10 一切配置就绪后,我们尝试启动openldap服务,默认它工作在tcp的389端口,如果是加密通信,默认端口则为636

# /etc start

# netstat -tulnp | grep 389

# ps aux | grep slapd 查看ldap默认的服务运行权限

# chkconfig slapd on

# chkconfig --list | grep slapd

# tail /var/log

# 查询当前ldap数据库中的所有用户信息,默认肯定是空的,因为我们此时还没有导入任何信息

# ldapsearch -LLL -W -x -H ldap://lda -D "cn=klion,dc=ldapmaster,dc=org" -b "dc=ldapmaster,dc=org" "(uid=*)"

# rm -rf /etc/openlda* 上述第一次查询可能会有问题,把该目录下的配置全部删掉,重启服务再查基本就没问题了

# slaptest -f /etc/openldap/ -F /etc/openlda

# chown -R ldap.ldap /etc/openlda

# /etc restart

# netstat -tunlp |grep slapd

0x11 到此为止,ldap基本就算搭建好了,接下来,我们开始往ldap数据库中添加用户数据,在添加之前我们需要先把它转成符合ldap数据库的数据格式,如下

安装migrationtools工具,因为我们要它来导出本地用户数据

# yum install migrationtools -y

# vi /usr/share/migrationtool 修改为自己的域名和BaseDN

$DEFAULT_MAIL_DOMAIN = "lda";

$DEFAULT_BASE = "dc=ldapmaster,dc=org";

使用migrationtools内置的脚本来进行导出

# export LC_ALL=C

# echo "export LC_ALL=C" >> /etc/profile

# /usr/share/migrationtool > ba

# /usr/share/migrationtool /etc/passwd >

# /usr/share/migrationtool /etc/group > group.ldif

使用ldapadd的添加条目,即 增,往ldap数据库中添加刚刚导出的数据

# ldapadd -x -H ldap://lda -D "cn=klion,dc=ldapmaster,dc=org" -W -f ba

# ldapadd -x -H ldap://lda -D "cn=klion,dc=ldapmaster,dc=org" -W -f

# ldapadd -x -H ldap://lda -D "cn=klion,dc=ldapmaster,dc=org" -W -f group.ldif

使用ldapdelete删除指定条目,即 删

# ldapdelete -x -H ldap://lda -D "cn=klion,dc=ldapmaster,dc=org" -w klion "cn=test,ou=Group,dc=ldapmaster,dc=org"

使用ldapmodify修改指定条目,即 改

# ldapmodify -x -W -H ldap://lda -D "cn=klion,dc=ldapmaster,dc=org" -f

使用ldapsearch查询指定条目,即 查询指定basedn下的所有条目

# ldapsearch -LLL -w klion -x -H ldap://lda -D "cn=klion,dc=ldapmaster,dc=org" -b "dc=ldapmaster,dc=org"

# ldapsearch -LLL -w klion -x -H ldap://lda -D "cn=klion,dc=ldapmaster,dc=org" -b "dc=ldapmaster,dc=org" "(uid=aima)"

备份ldap数据库

# ldapsearch -LLL -w klion -x -H ldap://lda -D "cn=klion,dc=ldapmaster,dc=org" -b "dc=ldapmaster,dc=org" "(uid=*)" >bak.ldif

0x12 使用各种ldap客户端管理工具来操作ldap数据库,此处暂以web端管理接口为例进行演示

# yum install httpd php php-ldap php-gd -y

# cd /var/www/html/

# tar xf lda

# mv lda ldap

# cd ldap/config

# cp con con.bak

# cp lam.conf_sample lam.con

# mv con con

# mv lam.conf_sample lam.conf

serverURL: ldap://ldapmaster:389

admins: cn=klion,dc=ldapmaster,dc=org

treesuffix: dc=ldapmaster,dc=org

types: suffix_user: ou=People,dc=ldapmaster,dc=org

types: suffix_group: ou=group,dc=ldapmaster,dc=org

types: suffix_host: ou=machines,dc=ldapmaster,dc=org

types: suffix_smbDomain: dc=ldapmaster,dc=org

# chown -R a /var/www/html/ldap

# vi /etc/httpd/con

<VirtualHost *:80>

ServerAdmin lda

DocumentRoot /var/www/html/ldap

ServerName lda

ErrorLog logs/lda-error_log

CustomLog logs/lda-access_log common

</VirtualHost>

# /etc start

# chkconfig httpd on

http://lda/template 做好host解析后访问此url即可全图形化管理ldap

虽然这种纯图形化的工具貌似是很好用,但个人还是不太建议在实际生产环境中用,验证过于简单,比较危险,毕竟只是个web脚本,很容易被入侵者扫目录,扫域名时扫到,另外,也极易被各类搜索引擎抓到,如下

1

inurl:template intitle:LDAP Account Manager

0x13 启用sasl,让指定的服务都通过ldap的方式进行集中身份验证

# yum install *sasl* -y

# rpm -qa | grep sasl

# saslauthd -v sasl所支持的所有认证类型

# sed -i 's#MECH=pam#MECH=ldap#g' /etc/sysconfig/saslauthd

# grep -i mech /etc/sysconfig/saslauthd

MECH=ldap

# /etc start

# chkconfig saslauthd on

# vi /etc

ldap_bind_dn: cn=klion,dc=ldapmaster,dc=org

ldap_bind_pw: klion

ldap_search_base: ou=People,dc=ldapmaster,dc=org

ldap_filter: uid=%U

ldap_password_attr: userPassword

# ps -ef | grep sasl

# testsaslauthd -u super -p admin 此时便会用ldap账户来进行验证

0x14 以让svn服务通过ldap进行认证为例,其实非常简单,首先,你需要先在本机快速部署好svn,至于具体的部署方法,请参考之前的相关文章,当然,除了svn,像vsftpd,samba这类的基础服务也都可以通过ldap进行身份验证,并非重点此处不再赘述

# 让svn通过ldap进行验证,不再走svn自己的验证了

# vi /etc/sasl2

pwcheck_method: saslauthd

mech_list: PLAIN LOGIN

# 编辑svn主配置文件

# vi /svn/svndata/svndoc/con

[general]

anon-access = none

auth-access = write

password-db = /svn/svnpasswd/passwd

authz-db = /svn/svnpasswd/authz

[sasl]

use-sasl = true # 开启svn的sasl验证

# 把svn本地用户全部注释掉,因为一旦开启sasl就不再走svn本地验证了

# vi /svn/svnpasswd/passwd

[users]

# harry = harryssecret

# sally = sallyssecret

# web = 654321

# webadmin = admin110

# admin = 123456

# bakuser = admin

# guest = svn110

# svn = svnadmin

# 另外,还需要把ldap用户加到svn认证文件中,不然,依然是登不上svn的

# 虽然用户密码验证过程不走本地,但权限认证过程还是在本地进行的

# vi /svn/svnpasswd/authz

[aliases]

[groups]

administrator = web

sec = webadmin,admin

ldap_user = svnnew,super

[svndoc:/]

svn = rw

@administrator = rw

@ldap_user = rw

[svndoc:/web01]

bakuser = rw

[svndoc:/web02]

guest = rw

下面是svn通过ldap进行认证的实际效果

0x15 关于ldap主从同步,后续有机会再说,这次我们先初步入个门 ^_^

0x16 最后,我们再来关注下openldap的一些安全问题,最重要的可能就是允许匿名访问,对此的利用没什么好说的,直接用各种ldap客户端工具,如,LDAPSoft Ldap Browser或者JXplorer都行,只需指定正确的ip,端口和dn,然后用匿名的方式连上去即可

后话:

建议实际生产环境中直接使用加密传输,另外,可根据实际业务需求配置更具针对性的ACL,至于针对web层的ldap注入 [ 其实跟sql注入没什么两样,只是查询语言不同而已 ],篇幅原因,我们在后续的相关章节中还会再做详细说明,待续……

关于作者: luda

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐