OpenLDAP与Linux、apache、squid、pureftp整合

LDAP是轻量目录访问协议(Lightweight Directory Access Protocol)的缩写,其实是一种目录服务,类似于我们在文件系统中所使用的目录,类似于我们查询电话号码使用的电话号码簿,类似于我们所使用诸如 NIS(Network Information Service)、DNS (Domain Name Service)等网络目录。
LDAP是一种特殊的数据库。但是LDAP和一般的数据库不同,明白这一点是很重要的。 LDAP对查询进行了优化,与写性能相比LDAP的读性能要优秀很多。
一般地,目录服务提供什么样的服务呢?
通常是根据查询的标准返回一定的信息。
LDAP目录 (我们将在下面详细阐述)
目录基础或根
在上面我们所提到的任何一种目录服务中都有一个我们开始浏览或搜索的开始点。 这个开始点就是通常所谓的根。 这和一棵数的根也很类似。每棵都有一个根,以及很多的树枝树叶。
* 文件系统的根是 /
* NIS 的根是域名,比如 “extmail.org”
* DNS 根是Internic(译者注:Internet网络信息中心, Internet的管理组织)
* LDAP同样有一个可定义的根,比如 “dc=extmail.org” ;
每个根都可以衍生出好多枝叶,对于文件系统来说,它的枝叶就是一个个文件及子目录。每一个枝叶都有一些属性。比如文件系统的枝叶(文件及子目录)有以下的属性:
* 名称
* 修改时间
* 所有者
* 组
* 等等
在LDAP中,一个条目的区分名称叫做“dn”或者叫做区分名。在一个目录中这个名称总是唯一的。比如,我的dn是”uid=root, ou=market, dc=extmail.org”。不可能有相同的dn,但是我们可以有诸如”uid=root, ou=tech, dc=extmail.org”的dn。这同文件系统中/etc/passwd 和 /usr/passwd的例子很类似。我们有独一无二的属性,在”ou=tech, dc=extmail.org” 中uid和在”ou=market, dc=extmail.org”中的uid。这并不矛盾。
LDAP四种基本模型:
信息模型:描述LDAP的信息表示方式
在LDAP中信息以树状方式组织,在树状信息中的基本数据单元是条目,而每个条目由属性构成,属性中存储有属性值;LDAP中的信息模式,类似于面向对象的概念,在LDAP中每个条目必须属于某个或多个对象类(Object Class),每个Object Class由多个属性类型组成,每个属性类型有所对应的语法和匹配规则;对象类和属性类型的定义均可以使用继承的概念。每个条目创建时,必须定义所属的对象类,必须提供对象类中的必选属性类型的属性值,在LDAP中一个属性类型可以对应多个值。
在LDAP中把对象类、属性类型、语法和匹配规则统称为Schema,在LDAP中有许多系统对象类、属性类型、语法和匹配规则,这些系统Schema在LDAP标准中进行了规定,同时不同的应用领域也定义了自己的Schema,同时用户在应用时,也可以根据需要自定义Schema。这有些类似于XML,除了XML标准中的XML定义外,每个行业都有自己标准的DTD或DOM定义,用户也可以自扩展;也如同XML,在LDAP中也鼓励用户尽量使用标准的Schema,以增强信息的互联互通。
在Schema中最难理解的是匹配规则,这是LDAP中为了加快查询的速度,针对不同的数据类型,可以提供不同的匹配方法,如针对字符串类型的相等、模糊、大于小于均提供自己的匹配规则。
命名模型:描述LDAP中的数据如何组织
LDAP中的命名模型,也即LDAP中的条目定位方式。在LDAP中每个条目均有自己的DN和RDN。DN是该条目在整个树中的唯一名称标识,RDN是条目在父节点下的唯一名称标识,如同文件系统中,带路径的文件名就是DN,文件名就是RDN。
功能模型:描述LDAP中的数据操作访问
在LDAP中共有四类10种操作:查询类操作,如搜索、比较;更新类操作,如添加条目、删除条目、修改条目、修改条目名;认证类操作,如绑定、解绑定;其它操作,如放弃和扩展操作。除了扩展操作,另外9种是LDAP的标准操作;扩展操作是LDAP中为了增加新的功能,提供的一种标准的扩展框架,当前已经成为LDAP标准的扩展操作,有修改密码和StartTLS扩展,在新的RFC标准和草案中正在增加一些新的扩展操作,不同的LDAP厂商也均定义了自己的扩展操作。
安全模型:描述LDAP中的安全机制
LDAP中的安全模型主要通过身份认证、安全通道和访问控制来实现。
身份认证 在LDAP中提供三种认证机制,即匿名、基本认证和SASL(Simple Authentication and Secure Layer)认证。匿名认证即不对用户进行认证,该方法仅对完全公开的方式适用;基本认证均是通过用户名和密码进行身份识别,又分为简单密码和摘要密码认证;SASL认证即LDAP提供的在SSL和TLS安全通道基础上进行的身份认证,包括数字证书的认证。
通讯安全 在LDAP中提供了基于SSL/TLS的通讯安全保障。SSL/TLS是基于PKI信息安全技术,是目前Internet上广泛采用的安全服务。LDAP通过StartTLS方式启动TLS服务,可以提供通讯中的数据保密性、完整性保护;通过强制客户端证书认证的TLS服务,同时可以实现对客户端身份和服务器端身份的双向验证。
访问控制 虽然LDAP目前并无访问控制的标准,但从一些草案中或是事实上LDAP产品的访问控制情况,我们不难看出:LDAP访问控制异常的灵活和丰富,在LDAP中是基于访问控制策略语句来实现访问控制的,这不同于现有的关系型数据库系统和应用系统,它是通过基于访问控制列表来实现的,无论是基于组模式或角色模式,都摆脱不了这种限制。
在使用关系型数据库系统开发应用时,往往是通过几个固定的数据库用户名访问数据库。对于应用系统本身的访问控制,通常是需要建立专门的用户表,在应用系统内开发针对不同用户的访问控制授权代码,这样一旦访问控制策略变更时,往往需要代码进行变更。总之一句话,关系型数据库的应用中用户数据管理和数据库访问标识是分离的,复杂的数据访问控制需要通过应用来实现。
而对于LDAP,用户数据管理和访问标识是一体的,应用不需要关心访问控制的实现。这是由于在LDAP中的访问控制语句是基于策略语句来实现的,无论是访问控制的数据对象,还是访问控制的主体对象,均是与这些对象在树中的位置和对象本身的数据特征相关。
在LDAP中,可以把整个目录、目录的子树、制定条目、特定条目属性集或符合某过滤条件的条目作为控制对象进行授权;可以把特定用户、属于特定组或所有目录用户作为授权主体进行授权;最后,还可以定义对特定位置(例如IP地址或DNS名称)的访问权。
LDAP的LDIF
LDIF(LDAP Interchange Format)是指存储LDAP配置信息及目录内容的标准文本文件格式,之所以使用文本文件来格式来存储这些信息是为了方便读取和修改,这也是其它大多数服务配置文件所采取的格式。LDIF文件常用来向目录导入或更改记录信息,这些信息需要按照LDAP中schema的格式进行组织,并会接受schema的检查,如果不符合其要求的格式将会出现报错信息。
LDAP的Schema
LDAP中,schema用来指定一个目录中所包含的Objects的类型(ObjectClass)以及每一个ObjectClass中的各个必备(mandatory)和可选(optional)的属性(attribute)。因此,Schema是一个数据模型,它被用来决定数据怎样被存储,被跟踪的数据的是什么类型,存储在不同的Entry下的数据之间的关系。schema需要在主配置文件slapd.conf中指定,以用来决定本目录中使用到的ObjectClass。管理员可以自己设计制定schema,一般包括属性定义(AttributeDefinition)、类定义(ClassDefinition)以及语法定义(SyntaxDefinition)等部分。 为了满足你的需要,你可以定义自己的ObjectClass,每一个ObjectClass中的属性都可以设计成reqired(必选的)或optional(可选的)。
LDAP的ObjectClass
LDAP中,一条记录必须包含一个ObjectClass属性,且其需要赋予至少一个值。每一个值将用作一条LDAP记录进行数据存储的模板;模板中包含了一条记录中数个必须被赋值的属性和一系列可选的属性。ObjectClass有着严格的等级之分,最顶层的类是top和alias。例如,organizationalPerson这个objectClass隶属于Person,而Person又是top的子类。ObjectClass大致分为三类:结构型的(如:person和organizationUnit)、辅助型的(如:extensibeObject)和抽象型的(这类不能直接使用)。
LDAP的Attribute
简单的说,Attribute类同于编程语言中的变量,它可以被赋值,就像是可以存放一个单一类型信息的容器。官方声明了许多常用的Attribute,如果其中没有你所需要的,你可以自己定义,但要避免重名。ObjectClass是一种特殊的Attribute,它包含其它用到的Attribute以及它自身。常见的Attribute如:givenName、l、objectClass、dc、ou、cn、c、mail、telephoneNumber、sn、uid等。
LDAP的Object Identifiers
对象标识符(OID)是被LDAP内部数据库引用的数字标识。Attribute的名字是设计为方便人们读取的,但为了方便计算机的处理,通常使用一组数字来标识这些对象,这类同于SNMP中的MIB2。例如,当计算机接收到dc这个Attribute时,它会将这个名字转换为对应的OID:1.3.6.1.4.1.1466.115.121.1.26。
构建LDAP目录
下面我们将介绍设置一个LDAP服务器的步骤。
步骤:
* 下载并安装openLDAP
* 配置 LDAP server
* 配置本地环境指向LDAP 安装
* 初始化LDAP 数据库
下载并安装OpenLDAP
可以从www.openldap.com下载源代码包并根据它的相关文档进行安装,或者安装预先编译好的包。
配置LDAP服务器
在我们的例子中,我将为extmail.org构建LDAP服务器。你可以用你喜欢的编辑器编辑slapd.conf和ldap.comf配置文件来更改名称等参数以适应你的具体需求。
在我的服务器上配置文件在/etc/openldap目录下,你的配置文件可能在/usr/local/etc/openldap或者别的地方,这要根据你的linux发行版本或者编译openldap的具体情况而定。
######### /etc/openldap/slapd.conf ###################################
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/nis.schema
# 定义LDAP 使用的schema
allow bind_v2
# 支持V2版本
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
# 设置pid和args文档位置
database bdb
# 定义使用的数据库类型。
suffix “dc=extmail.org”
# 后缀或者根. 这是你LDAP目录的顶节点
directory /var/lib/ldap
# LDAP的dbs 保存的位置
rootdn “cn=Manager,dc=extmail.org”
# 目录管理员的区分名
rootpw secret
# 保存ldap目录管理员的明文密码是很糟糕的,但是我们将在刚刚开始使用ldap时这样做
编辑你的 /etc/openldap/ldap.conf配置文件
该文件位于ldap客户端(我们将使用同一计算机作为服务器和客户端,当然这可以在同一计算机或不同的计算机上)
通常诸如ldapdelete 、ldapadd等等的ldap客户端会读该文件的内容。
##########/etc/openldap/ldap.conf#########
# LDAP 的缺省设置
# 查看 ldap.conf 可以获取更多的信息
# 本文件应该设置为对所有人可读
# 定义ldap服务器,可以用主机名或ip地址
host 127.0.0.1
# 定义我们要查询的目录的根
# 我们将要使用的顶节点,这不一定是目录的根,比如我们可以使用
# base = ou=Manager,dc=extmail.org
# 这时我们的一切查询都将从树根dc=extmail.org的分支开始
现在启动ldap服务器。
# /etc/init.d/ldap start
如果你是使用缺省设置自己编译并安装的,你可以用/usr/local/libexec/slapd &启动ldap服务器。如果没有使用缺省设置,请找到slapd文件并运行它。
在LDAP服务器上添加数据
到现在为止,你的ldap服务器已经运行起来了,可以准备添加数据了。最标准的往ldap服务器中添加数据的方法是建立一个LDIF(LDAP目录交换格式)文件。你可以通过阅读man ldif来获得更多关于ldif的信息。
简单说来,ldif是ldap条目的文本表示。这些条目是很好读懂的,并且可以在来自两个不同的厂家的LDAP服务器间交换数据,哪怕使用的是不同的数据库后台或者是运行在不同的操作系统上。
就让我们一起来建立ldif文件,而不要感到任何的忙乱。一些应该记住的要点:ldif 文件中的每一记录/条目都应用一个空行分开。
下面是一个ldif文件extmail.org.ldif
dn: cn=liu shaobo,ou=market,dc=extmail.org
givenName: liu
sn: shaobo
cn: liu shaobo
uid: liu
userPassword: liu
uidNumber: 600
gidNumber: 600
homeDirectory: /home/liu
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
dn: cn=print,ou=market,dc=extmail.org
gidNumber: 600
objectClass: posixGroup
objectClass: top
cn: print
dn: ou=market,dc=extmail.org
ou: market
objectClass: organizationalUnit
objectClass: top
dn: dc=extmail.org
objectClass: organization
objectClass: dcObject
dc: extmail.org
o: extmail.org
下面我们将这些数据加入ldap目录。我们使用命令行程序ldapadd
# ldapadd -x -D “cn=Manager, dc=extmail.org” -w secret -f extmail.org.ldif
该命令使用“cn=Manager, dc=extmail.org”作为管理员的区分名(dn),使用secret作为密码,然后从extmail.org.ldif文件中读取数据并写入ldap目录。
如果一切正常的话你可以准备开始查询你的ldap目录了,
LDAP常用关键字与对应的含义
关键字 含义   关键字 含义
dc 域名部分 sn 姓
dn 区分名 givenName 名
uid 用户ID rdn 相对区分名
userPassword 用户密码 objectClass 定义对象类
ou 组织单位 c 国家
cn 公共名称 o 组织名
客户机系统验证使用OpenLDAP  (2009.3.7更新)
  
as4 使用 authconfig 、 as5 请使用 authconfig-tui
选择以下选项:
  Use LDAP
  Use MD5 Passwords
  Use Shadow Passwords
  Use LDAP Authentication
选择下一步:
备注:如果没有使用TLS, 请勿选择使用TLS。
  输入ldap服务器的IP地址或主机名。
  输入base dn
现在我们就可以从客户端用Openldap上的用户来登陆了,并且,服务器本身也可以使用自己的Openldap服务器来进行用户验证
Apache 验证使用OpenLDAP (2009.4.10更新)
1、编辑Apache的主配置文件httpd.conf,添加以下内容:
Alias /mysecret “/usr/local/extmail”

AuthType Basic
AuthName “login”
AuthLDAPURL AuthLDAPURL “ldap://IP/dc=extmail.org”
require valid-user

2、测试 LDAP 用户访问虚拟目录、
添加测试页
# echo ‘‘ >/var/www/html/index.php
重启apache服务
# /etc/init.d/httpd restart
访问http://IP/extmail输入LDAP用户名和密码就可以了
Squid 验证使用OpenLDAP (2009.4.17更新)
编辑squid.conf,输入以下内容:
auth_param basic program /usr/lib/squid/squid_ldap_auth -b “ou=Users,dc=extamil.org” -v 3
在acl标签下,输入以下内容:
acl all src 0.0.0.0/0.0.0.0
acl ldapauth proxy_auth REQUIRED
http_access allow ldapauth
http_access deny all
在浏览器设置好代理服务器,就可以访问了;
Pureftp 验证使用OpenLDAP (2009.4.28更新)
1、安装
#./configure –prefix=/usr/local/pureftpd
–with-ldap
–with-virtualchroot
–with-virtualhosts
–with-virtualroot
–with-diraliases
–with-uploadscript
–with-cookie
–with-quotas
–with-sysquotas
–with-ratios
–with-throttling
–with-largefile
–with-peruserlimits
–with-paranoidmsg
–with-welcomemsg
–with-ftpwho
–with-language=simplified-chinese
# make
# make install
2、生成pureftp配置脚本
# cp configuration-file/pure-config.pl /usr/local/pureftpd/sbin/
# chmod +x /usr/local/pureftpd/sbin/pure-config.pl
将 pure-ftpd 服务添加到系统中
# cd contrib
# vi redhat.init
找到 “fullpath=/usr/local/sbin/$prog”,其改为 “fullpath=/usr/local/pureftpd/sbin/$prog”;
找到 “pureftpwho=/usr/local/sbin/pure-ftpwho”,其改为 “pureftpwho=/usr/local/pureftpd/sbin/pure-ftpwho”
# cp redhat.init /etc/init.d/pure-ftpd
# chmod +x /etc/init.d/pure-ftpd
# chkconfig –add pure-ftpd
# chkconfig pure-ftpd on
3、编辑pureftpd-ldap.conf配置文件,内容如下:
LDAPPort 389
LDAPBaseDN dc=extmail.org
LDAPBindDN cn=Manager,dc=extmail.org
LDAPBindPW secret
4、编辑pure-ftpd.conf配置文件,内容如下:
ChrootEveryone yes
MaxClientsNumber 50
MaxClientsPerIP 8
AnonymousOnly no
NoAnonymous yes
SyslogFacility ftp
FortunesFile /etc/ftpmsg
MaxIdleTime 15
LDAPConfigFile /etc/pureftpd-ldap.conf
AnonymousCanCreateDirs no
MaxLoad 4
AntiWarez yes
Bind 192.168.0.7,21
AllowUserFXP yes
AllowAnonymousFXP no
AutoRename no
AnonymousCantUpload no
CreateHomeDir yes
MaxDiskUsage 99
PerUserLimits 3:20
5、重启pure-ftpd,用LDAP建立的用户登陆FTP
# /etc/init.d/pureftpd start
# ftp 192.168.0.7 21

发表评论

电子邮件地址不会被公开。 必填项已用*标注