[追100分]如何关闭LDAP服务?
LDAP
(or Lightweight Directory Access Protocol )轻量级目录访问协议已经为一般的标准
邮件服务器所支持的协议。LDAP 是更复杂的目录访问协议X500 Directory Access
Protocol 的一个子集。作为Windows NT 的服务程序,LDAP 服务可以完全的在后台运
行或者是有部分交互的得运行。在你登出Windows NT 系统以后,LDAP 服务将会继续运
行。想了解更多的有关于LDAP 的信息,请参考Internet Requests for
Comments (RFCs)。IMail 服务器是依据RFC-2251 实现LDAP 服务。
Imail 的LDAP 的实现
IMail 服务器为IMail 用户数据库提供了一个LDAP 借口。IMail 用户数据库已经被扩
展包含了标准的LDAP属性(例如名字,地址,组织名字,电话号码)和其他的自定义的属
性。用户数据库不支持树状结构的组织形式。每一个Imail 系统中的用户有一个LDAP
纪录。当一个用户被加入到Imail 用户数据库中以后,LDAP 的属性有以下得属性:
ObjectClass 记录类型。该值应该是“Person”
CN CommonName 用户的全名。
Mail 该用户的Imail 服务器上的邮件地址。该;邮件地址由用户账号和主机名构成。
UID Imail 服务器中的用户的帐号。
利用LDAP 客户端, 用户可以在他自己的LDAP 记录中增加,删除,修改信息。用户不可
以修改其它的用户的LDAP 信息。下面描述了用户可以增加的一些属性。
在LDAP 记录中这些属性实最常用的。其他的一些属性可以由系统管理员或者用户自己定
义。
系统管理员可以增加,删除用户,增加LDAP 属性,修改LDAP 属性:
• IMail Administrator — 想了解更多的相关信息,请参考第四章。
• A web browser 想了解更多的相关得信息,请参考第六章。
注意
你可以用LDAP 客户端增加/修改属性(但不能增加/删除用户)。
SurName 用户名字的最后一个名字。
Organization 用户所在的公司的名字。
OrgUnit 用户所在的公司部门。
Street 用户的地址信息。
City 用户所在得城市。
ST 用户所在的省市。
Postal 用户所在区域的邮政编码。
C 用户的国籍。
Telephone 用户的联络电话号码。
对LDAP 目录服务的完整的支持
IMail 服务器支持LDAP 版本3, 该版本有以下得性能:
• 允许用户使用LDAP 客户端比如Netscape Communicator to:
• 确定LDAP 目录信息包括名字,电话号码,邮件地址,组织名称,部门和地址。
• 列出一台主机上的所有的用户。
• 根据给定的条件搜索用户。
• 在LDAP 目录中修改用户自己的信息。
• 主机管理员和系统管理员可以利用LDAP 客户端增加,删除,修改用户账号,包括
LDAP 目录信息.
• 你可以监视LDAP 服务器的运行状况.在服务器当机的时候可以收到警告.更具体得信
息可以参考第16章.
为没有登记的用户提供LDAP 信息
LDAP 的用户必须同时是Imail 邮件服务器中的用户.必须在邮件主机中有相应得邮件账
号.如果你想为没有邮件账号的用户提供LDAP 信息,你必须为他们创建账号然后在账号
的属性中选择Account Access Disabled .
从Microsoft 的邮件客户端访问LDAP 信息
如果你有客户使用Outlook Express 作为邮件客户端,无法从Imail 邮件服务器上访问
LDAP 信息, 用户可以更改Outlook Express 的设置. 如果该用户还没有建立IMail
LDAP 记录, 需要以下得步骤创建:
1 在Outlook Express 中, 在Tools 菜单中选择Accounts --> Directory Service -
->Add --> Directory Service .
2 在文本框Internet directory (LDAP) server 中,输入Imail 服务器的名字或者是
IP 地址和其他的信息.
3 完成以后单击按钮Finish
一旦用户建立了LDAP 记录,用户必须编辑以下得LDAP 属性:
1 在Outlook Express 中, 选择Accounts -> Directory Service
2 选择LDAP account
3 选择Properties, 然后单击Advanced 标签
4 在文本框Search Base 中, 输入:
objectclass=Person
5 单击Apply, 然后单击OK, 接着单击Close
Populating the LDAP Database
如果你需要一次加入大量的用户,你可能希望能够批处理的完成.请参考
“Populating the LDAP Database (ldaperexe)”.
登入
缺省的,LDAP 服务用系统账号登入。你可以在用Windows NT/2000 控制面板中的
Services applet小程序更改这个设定。
1 在控制面板中,双击小程序Services 。
2 选择IMail LDAP Server 然后单击Startup
3 (可选)选择希望的Startup Type
4 在Log On As 下,选择正确的账号:
System Account 如果您有邮件主机使用Windows NT 用户数据库作为主机用户数据库,
请采用该账号。
Allow Service to Interact with Desktop选在该方式在服务启动以后将会在桌面上创
建一个Imail 的图标。任何帐号都可以看到该图标。
This Account Select如果你没有邮件主机采用Windows NT 用户数据库作为主机数据
库,你可以指定一个用户账号登入。请确认,该账号是某一邮件主机的管理员。
注意
如果你有某个邮件主机的用户数据库是基于外部数据库的,请确认该用户账号有权限访问
外部数据库。
配置LDAP 服务器
1 在IMail Administrator 中, 在左边的面板中选择“localhost”.
2 选择目录“Services”, 然后单击按钮LDAP LDAP 标签出现.
3 输入在后面描述的选项配置LDAP 服务器.
4 单击按钮Apply 保存你得设置.
5 更改设置以后,停止服务,等待5-10 秒然后重新启动服务以确保设置生效.设置将会
被自动的保留.
日志选项
在框Log To 中,选择你希望使用得日志记录方式。
• sysMMDDTXT 改选项会把事件信息记录到一个纯文本文件中。mm 代表月份, dd 代表日
期。改文件存在于目录Spool
• No Log 该选项关闭日志功能。
• App Log 该选项利用Windows NT 应用程序日志记录事件日志。
• Log Server 该选项利用日志服务器文件记录日志。文件由标签Log Files 中指定,存
在于目录Spool 中。
Allow queries only 当选中该选项时,LDAP 客户端向LDAP 服务器查询LDAP 信息,
得到查询结果。但是不能输入或者修改LDAP 信息。
Allow “Search All” requests 你可以关闭该选项以强迫LDAP 客户端在进行查询时
提供查询的条件。
Maximum number of matches returned per request 设置该数值为一个较低的数字,以
限制因为LDAP 请求产生的服务数目。
Referrals 设置对其他的LDAP 数据库的引用 该功能可以在LDAP 客户端无法在本地
的LDAP 服务器上找到需要的信息时,可以在其它的哪些LDAP 服务器寻找:
Mode 决定了对于LDAP 客户端的查询的反馈。
• Send data only 只反馈Imail LDAP 服务器上的数据,不返回引用。
• Send referral only 只反馈其他的LDAP 服务器的主机名的引用。
• Send both 反馈Imail LDAP 服务器上的数据,同时也反馈其他的LDAP 服务器的主机
名的引用。
Hosts 输入其他的远端的LDAP 服务器的主机名。你可以输入多个主机名,之间用逗号
隔开。
Server Status 在按钮Start/Stop 左边出现的显示当前服务器状态的信息。包括版本
信息,服务是否正在运行。
Start/Stop Service 该按钮用来启动/停止服务
1 安装LDAP插件
[ https://pluginsjenkinsio/ldap/]
2 添加一个Jenkins LDAP配置
Server :这里填写LDAP server的地址即可
root DN : 这里填写你需要的base路径, 如果这里不填则勾选 Allow blank rootDN ,但是user search base和group search base则不能为空,否则会报找不到object的错误
User search base :可以不填,则会查找改root DN下的所有用户
User search filter :一般包含三种, uid={0}; cn={0}; sAMAccountName={0}, 如果不确定LDAP Server怎样设置的,则可以依次尝试
Group search base : 可以不填,则会查找改root DN下的所有组
Manager DN :认证查询该LDAP服务器的用户DN,包括该用户的完整CN, OU, DC
Manager Password : 上述用户的密码
其他可以保持默认配置
3 添加另外一个LDAP Server 的配置
点击 Add Server , 可以按照上述配置继续配置,这两个可以是不同的配置
配置多个ldap时建议勾选上 Ignore if unavailable ,这样如果其中一个ldap server不可用,会尝试使用下一些个ldap server。
4 配置过程中遇到的问题
41 错误日志:
User lookup: failed for user "your_username" LdapCallback;null; nested exception is javaxnamingPartialResultException [Root exception is javaxnamingCommunicationException: dc1dc2dc3:389 [Root exception is javanetUnknownHostException: dc1dc2dc3]] LDAP Group lookup: could not verify
其中your_username是你试图登陆的一个AD用户; dc1dc2dc3是你设置的DC=dc1, DC=dc2, DC=dc3,我这里出现了该问题是因为LDAP server我提供的是一个IP地址
原因:该问题是找不到 dc1dc2dc3该域名,请在AD上配置域名解析 your_LDAP_IP 到dc1dc2dc3或者临时在系统的/etc/hosts文件中添加该域名解析
42 错误日志:
LdapCallback;LDAP response read timed out, timeout used:60000ms; nested exception is javaxnamingNamingException: LDAP response read timed out, timeout used:60000ms; remaining name ''
这个问题是因为connection pool的连接有问题,解决方案是在Jenkins的LDAP配置中添加一个环境变量 comsunjndildapconnectpool 设为 false , 具体可参考:[ https://guvcloud/post/jenkins-and-ldap/]
43 我使用的是docker 容器跑的Jenkins,有一些有用的命令
docker logs --following container_name/ID 查看日志
docker exec --user root -it container_name/ID /bin/bash 以root用户登陆该容器
44 如果登陆速度较慢,可以enable cache来减少查询LDAP server的负载
这就需要说说LDAP的主要优势是什么:
1、查询速度快,贼快,特别是在大数据量的情况下
2、分布式部署方便,远不是数据库所能比的
最大缺点是修改速度慢、不支持事务。
所以需要用数据库做日常管理和存储,用ldap做查询认证
什么是LDAP
LDAP的英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X500标准的,
但是简单多了并且可以根据需要定制。与X500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP
的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。现在LDAP技术不仅
发展得很快而且也是激动人心的。在企业范围内实现LDAP可以让运行在几乎所有计算机平台上的所有的应
用程序从LDAP目录中获取信息。LDAP目录中可以存储各种类型的数据:电子邮件地址、邮件路由信息、人力
资源数据、公用密匙、联系人列表,等等。通过把LDAP目录作为系统集成中的一个重要环节,可以简化员工
在企业内部查询信息的步骤,甚至连主要的数据源都可以放在任何地方。
LDAP目录的优势
如果需要开发一种提供公共信息查询的系统一般的设计方法可能是采用基于WEB的数据库设计方式,即前端
使用浏览器而后端使用WEB服务器加上关系数据库。后端在Windows的典型实现可能是Windows NT + IIS + Acess
数据库或者是SQL服务器,IIS和数据库之间通过ASP技术使用ODBC进行连接,达到通过填写表单查询数据的功能;
后端在Linux系统的典型实现可能是Linux+ Apache + postgresql,Apache和数据库之间通过PHP3提供的函数进
行连接。使用上述方法的缺点是后端关系数据库的引入导致系统整体的性能降低和系统的管理比较繁琐,因为需
要不断的进行数据类型的验证和事务的完整性的确认;并且前端用户对数据的控制不够灵活,用户权限的设置一
般只能是设置在表一级而不是设置在记录一级。
目录服务的推出主要是解决上述数据库中存在的问题。目录与关系数据库相似,是指具有描述性的基于属性的记
录集合,但它的数据类型主要是字符型,为了检索的需要添加了BIN(二进制数据)、CIS(忽略大小写)、CES
(大小写敏感)、TEL(电话型)等语法(Syntax),而不是关系数据库提供的整数、浮点数、日期、货币等类型,
同样也不提供象关系数据库中普遍包含的大量的函数,它主要面向数据的查询服务(查询和修改操作比一般是大于
10:1),不提供事务的回滚(rollback)机制,它的数据修改使用简单的锁定机制实现All-or-Nothing,它的目标
是快速响应和大容量查询并且提供多目录服务器的信息复制功能。
现在该说说LDAP目录到底有些什么优势了。现在LDAP的流行是很多因数共同作用的结果。可能LDAP最大的优势是:
可以在任何计算机平台上,用很容易获得的而且数目不断增加的LDAP的客户端程序访问LDAP目录。而且也很容易
定制应用程序为它加上LDAP的支持。
LDAP协议是跨平台的和标准的协议,因此应用程序就不用为LDAP目录放在什么样的服务器上操心了。实际上,LDAP
得到了业界的广泛认可,因为它是Internet的标准。产商都很愿意在产品中加入对LDAP的支持,因为他们根本不用
考虑另一端(客户端或服务端)是怎么样的。LDAP服务器可以是任何一个开发源代码或商用的LDAP目录服务器(或
者还可能是具有LDAP界面的关系型数据库),因为可以用同样的协议、客户端连接软件包和查询命令与LDAP服务器
进行交互。与LDAP不同的是,如果软件产商想在软件产品中集成对DBMS的支持,那么通常都要对每一个数据库服务
器单独定制。不象很多商用的关系型数据库,你不必为LDAP的每一个客户端连接或许可协议付费 大多数的LDAP服务
器安装起来很简单,也容易维护和优化。
LDAP服务器可以用“推”或“拉”的方法复制部分或全部数据,例如:可以把数据“推”到远程的办公室,以增加
数据的安全性。复制技术是内置在LDAP服务器中的而且很容易配置。如果要在DBMS中使用相同的复制功能,数据库
产商就会要你支付额外的费用,而且也很难管理。
LDAP允许你根据需要使用ACI(一般都称为ACL或者访问控制列表)控制对数据读和写的权限。例如,设备管理员可
以有权改变员工的工作地点和办公室号码,但是不允许改变记录中其它的域。ACI可以根据谁访问数据、访问什么数
据、数据存在什么地方以及其它对数据进行访问控制。因为这些都是由LDAP目录服务器完成的,所以不用担心在客
户端的应用程序上是否要进行安全检查。
LDAP(Lightweight Directory Acess Protocol)是目录服务在TCP/IP上的实现(RFC 1777 V2版和RFC 2251
V3版)。它是对X500的目录协议的移植,但是简化了实现方法,所以称为轻量级的目录服务。在LDAP中目录是按照
树型结构组织,目录由条目(Entry)组成,条目相当于关系数据库中表的记录;条目是具有区别名DN(Distinguished
Name)的属性(Attribute)集合,DN相当于关系数据库表中的关键字(Primary
Key);属性由类型(Type)和多个值(Values)组成,相当于关系数据库中的域(Field)由域名和数据类型组成,
只是为了方便检索的需要,LDAP中的Type可以有多个Value,而不是关系数据库中为降低数据的冗余性要求实现的各
个域必须是不相关的。LDAP中条目的组织一般按照地理位置和组织关系进行组织,非常的直观。LDAP把数据存放在
文件中,为提高效率可以使用基于索引的文件数据库,而不是关系数据库。LDAP协议集还规定了DN的命名方法、存
取控制方法、搜索格式、复制方法、URL格式、开发接口等
LDAP对于这样存储这样的信息最为有用,也就是数据需要从不同的地点读取,但是不需要经常更新。
例如,这些信息存储在LDAP目录中是十分有效的:
l 公司员工的电话号码簿和组织结构图
l 客户的联系信息
l 计算机管理需要的信息,包括NIS映射、email假名,等等
l 软件包的配置信息
l 公用证书和安全密匙
什么时候该用LDAP存储数据
大多数的LDAP服务器都为读密集型的操作进行专门的优化。因此,当从LDAP服务器中读取数据的时候会比从专门为
OLTP优化的关系型数据库中读取数据快一个数量级。也是因为专门为读的性能进行优化,大多数的LDAP目录服务器
并不适合存储需要需要经常改变的数据。例如,用LDAP服务器来存储电话号码是一个很好的选择,但是它不能作为
电子商务站点的数据库服务器。
如果下面每一个问题的答案都是“是”,那么把数据存在LDAP中就是一个好主意。
l 需要在任何平台上都能读取数据吗?
l 每一个单独的记录项是不是每一天都只有很少的改变?
l 可以把数据存在平面数据库(flat database)而不是关系型数据库中吗?换句话来说,也就是不管什么范式不
范式的,把所有东西都存在一个记录中(差不多只要满足第一范式)。
最后一个问题可能会唬住一些人,其实用平面数据库去存储一些关系型的数据也是很一般的。例如,一条公司员工
的记录就可以包含经理的登录名。用LDAP来存储这类信息是很方便的。一个简单的判断方法:如果可以把保数据存
在一张张的卡片里,就可以很容易地把它存在LDAP目录里。
安全和访问控制
LDAP提供很复杂的不同层次的访问控制或者ACI。因这些访问可以在服务器端控制,这比用客户端的软件保证数据的
安全可安全多了。
用LDAP的ACI,可以完成:
l 给予用户改变他们自己的电话号码和家庭地址的权限,但是限制他们对其它数据(如,职务名称,经理的登录名,
等等)只有“只读”权限。
l 给予“HR-admins"组中的所有人权限以改变下面这些用户的信息:经理、工作名称、员工号、部门名称和部门号。
但是对其它域没有写权限。
l 禁止任何人查询LDAP服务器上的用户口令,但是可以允许用户改变他或她自己的口令。
l 给予经理访问他们上级的家庭电话的只读权限,但是禁止其他人有这个权限。
l 给予“host-admins"组中的任何人创建、删除和编辑所有保存在LDAP服务器中的与计算机主机有关的信息
l 通过Web,允许“foobar-sales"组中的成员有选择地给予或禁止他们自己读取一部分客户联系数据的读权限。这
将允许他们把客户联系信息下载到本地的笔记本电脑或个人数字助理(PDA)上。(如果销售人员的软件都支持LDAP,
这将非常有用)
l 通过Web,允许组的所有者删除或添加他们拥有的组的成员。例如:可以允许销售经理给予或禁止销售人员改变Web
页的权限。也可以允许邮件假名(mail aliase)的所有者不经过IT技术人员就直接从邮件假名中删除或添加用户。
“公用”的邮件列表应该允许用户从邮件假名中添加或删除自己(但是只能是自己)。也可以对IP地址或主机名加以
限制。例如,某些域只允许用户IP地址以192168200开头的有读的权限,或者用户反向查找DNS得到的主机名必须
为foobarcom。
LDAP目录树的结构
LDAP目录以树状的层次结构来存储数据。如果你对自顶向下的DNS树或UNIX文件的目录树比较熟悉,也就很容易掌握
LDAP目录树这个概念了。就象DNS的主机名那样,LDAP目录记录的标识名(Distinguished Name,简称DN)是用来读取
单个记录,以及回溯到树的顶部。后面会做详细地介绍。
为什么要用层次结构来组织数据呢?原因是多方面的。下面是可能遇到的一些情况:
l 如果你想把所有的美国客户的联系信息都“推”到位于到西雅图办公室(负责营销)的LDAP服务器上,但是你不想
把公司的资产管理信息“推”到那里。
l 你可能想根据目录树的结构给予不同的员工组不同的权限。在下面的例子里,资产管理组对“asset-mgmt"部分有完
全的访问权限,但是不能访问其它地方。
l 把LDAP存储和复制功能结合起来,可以定制目录树的结构以降低对WAN带宽的要求。位于西雅图的营销办公室需要每
分钟更新的美国销售状况的信息,但是欧洲的销售情况就只要每小时更新一次就行了。
刨根问底:基准DN
LDAP目录树的最顶部就是根,也就是所谓的“基准DN"。基准DN通常使用下面列出的三种格式之一。假定我在名为FooBar
的电子商务公司工作,这家公司在Internet上的名字是foobarcom。
o="FooBar, Inc", c=US
(以X500格式表示的基准DN)
在这个例子中,o=FooBar, Inc 表示组织名,在这里就是公司名的同义词。c=US 表示公司的总部在美国。以前,一般
都用这种方式来表示基准DN。但是事物总是在不断变化的,现在所有的公司都已经(或计划)上Internet上。随着
Internet的全球化,在基准DN中使用国家代码很容易让人产生混淆。现在,X500格式发展成下面列出的两种格式。
o=foobarcom
(用公司的Internet地址表示的基准DN)
这种格式很直观,用公司的域名作为基准DN。这也是现在最常用的格式。
dc=foobar, dc=com
(用DNS域名的不同部分组成的基准DN)
就象上面那一种格式,这种格式也是以DNS域名为基础的,但是上面那种格式不改变域名(也就更易读),而这种格式
把域名:foobarcom分成两部分 dc=foobar, dc=com。在理论上,这种格式可能会更灵活一点,但是对于最终用户来说
也更难记忆一点。考虑一下foobarcom这个例子。当foobarcom和gizmocom合并之后,可以简单的把“dc=com"当作基
准DN。把新的记录放到已经存在的dc=gizmo, dc=com目录下,这样就简化了很多工作(当然,如果foobarcom和wocketedu
合并,这个方法就不能用了)。如果LDAP服务器是新安装的,我建议你使用这种格式。再请注意一下,如果你打算使用活动
目录(Actrive Directory),Microsoft已经限制你必须使用这种格式。
更上一层楼:在目录树中怎么组织数据
在UNIX文件系统中,最顶层是根目录(root)。在根目录的下面有很多的文件和目录。象上面介绍的那样,LDAP目录也是
用同样的方法组织起来的。
在根目录下,要把数据从逻辑上区分开。因为历史上(X500)的原因,大多数LDAP目录用OU从逻辑上把数据分开来。OU
表示“Organization Unit",在X500协议中是用来表示公司内部的机构:销售部、财务部,等等。现在LDAP还保留ou=这
样的命名规则,但是扩展了分类的范围,可以分类为:ou=people, ou=groups, ou=devices,等等。更低一级的OU有时用
来做更细的归类。例如:LDAP目录树(不包括单独的记录)可能会是这样的:
dc=foobar, dc=com
ou=customers
ou=asia
ou=europe
ou=usa
ou=employees
ou=rooms
ou=groups
ou=assets-mgmt
ou=nisgroups
ou=recipes
单独的LDAP记录
DN是LDAP记录项的名字
在LDAP目录中的所有记录项都有一个唯一的“Distinguished Name",也就是DN。每一个LDAP记录项的DN是由两个部分
组成的:相对DN(RDN)和记录在LDAP目录中的位置。
RDN是DN中与目录树的结构无关的部分。在LDAP目录中存储的记录项都要有一个名字,这个名字通常存在cn(Common Name)
这个属性里。因为几乎所有的东西都有一个名字,在LDAP中存储的对象都用它们的cn值作为RDN的基础。如果我把最喜欢的
吃燕麦粥食谱存为一个记录,我就会用cn=Oatmeal Deluxe作为记录项的RDN。
l 我的LDAP目录的基准DN是dc=foobar,dc=com
l 我把自己的食谱作为LDAP的记录项存在ou=recipes
l 我的LDAP记录项的RDN设为cn=Oatmeal Deluxe
上面这些构成了燕麦粥食谱的LDAP记录的完整DN。记住,DN的读法和DNS主机名类似。下面就是完整的DN:
cn=Oatmeal Deluxe,ou=recipes,dc=foobar,dc=com
举一个实际的例子来说明DN
现在为公司的员工设置一个DN。可以用基于cn或uid(User ID),作为典型的用户帐号。例如,FooBar的员工Fran Smith
(登录名:fsmith)的DN可以为下面两种格式:
uid=fsmith,ou=employees,dc=foobar,dc=com
(基于登录名)
LDAP(以及X500)用uid表示“User ID",不要把它和UNIX的uid号混淆了。大多数公司都会给每一个员工唯一的登录名,
因此用这个办法可以很好地保存员工的信息。你不用担心以后还会有一个叫Fran Smith的加入公司,如果Fran改变了她的
名字(结婚?离婚?或宗教原因?),也用不着改变LDAP记录项的DN。
cn=Fran Smith,ou=employees,dc=foobar,dc=com
(基于姓名)
可以看到这种格式使用了Common Name(CN)。可以把Common Name当成一个人的全名。这种格式有一个很明显的缺点就是:
如果名字改变了,LDAP的记录就要从一个DN转移到另一个DN。但是,我们应该尽可能地避免改变一个记录项的DN。
定制目录的对象类型
你可以用LDAP存储各种类型的数据对象,只要这些对象可以用属性来表示,下面这些是可以在LDAP中存储的一些信息:
l 员工信息:员工的姓名、登录名、口令、员工号、他的经理的登录名,邮件服务器,等等。
l 物品跟踪信息:计算机名、IP地址、标签、型号、所在位置,等等。
l 客户联系列表:客户的公司名、主要联系人的电话、传真和电子邮件,等等。
l 会议厅信息:会议厅的名字、位置、可以坐多少人、电话号码、是否有投影机。
l 食谱信息:菜的名字、配料、烹调方法以及准备方法。
因为LDAP目录可以定制成存储任何文本或二进制数据,到底存什么要由你自己决定。LDAP目录用对象类型
(object classes)的概念来定义运行哪一类的对象使用什么属性。在几乎所有的LDAP服务器中,你都要根据
自己的需要扩展基本的LDAP目录
的功能,创建新的对象类型或者扩展现存的对象类型。
LDAP目录以一系列“属性对”的形式来存储记录项,每一个记录项包括属性类型和属性值(这与关系型数据库
用行和列来存取数据有根本的不同)。下面是我存在LDAP目录中的一部分食谱记录:
dn: cn=Oatmeal Deluxe, ou=recipes, dc=foobar, dc=com
cn: Instant Oatmeal Deluxe
recipeCuisine: breakfast
recipeIngredient: 1 packet instant oatmeal
recipeIngredient: 1 cup water
recipeIngredient: 1 pinch salt
recipeIngredient: 1 tsp brown sugar
recipeIngredient: 1/4 apple, any type
请注意上面每一种配料都作为属性recipeIngredient值。LDAP目录被设计成象上面那样为一个属性保存多个值的,
而不是在每一个属性的后面用逗号把一系列值分开。
因为用这样的方式存储数据,所以数据库就有很大的灵活性,不必为加入一些新的数据就重新创建表和索引。更
重要的是,LDAP目录不必花费内存或硬盘空间处理“空”域,也就是说,实际上不使用可选择的域也不会花费你
任何资源。
作为例子的一个单独的数据项
让我们看看下面这个例子。我们用Foobar, Inc的员工Fran Smith的LDAP记录。这个记录项的格式是LDIF,用来
导入和导出LDAP目录的记录项。
dn: uid=fsmith, ou=employees, dc=foobar, dc=com
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: foobarPerson
uid: fsmith
givenname: Fran
sn: Smith
cn: Fran Smith
cn: Frances Smith
telephonenumber: 510-555-1234
roomnumber: 122G
o: Foobar, Inc
mailRoutingAddress: fsmith@foobarcom
mailhost: mailfoobarcom
userpassword: 3x1231v76T89N
uidnumber: 1234
gidnumber: 1200
homedirectory: /home/fsmith
loginshell: /usr/local/bin/bash
属性的值在保存的时候是保留大小写的,但是在默认情况下搜索的时候是不区分大小写的。某些特殊的属性
(例如,password)在搜索的时候需要区分大小写。
让我们一点一点地分析上面的记录项。
dn: uid=fsmith, ou=employees, dc=foobar, dc=com
这是Fran的LDAP记录项的完整DN,包括在目录树中的完整路径。LDAP(和X500)使用uid(User ID),不要
把它和UNIX的uid号混淆了。
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
objectclass: foobarPerson
可以为任何一个对象根据需要分配多个对象类型。person对象类型要求cn(common name)和sn(surname)
这两个域不能为空。persion对象类型允许有其它的可选域,包括givenname、telephonenumber,等等。
organizational Person给person加入更多的可选域,inetOrgPerson又加入更多的可选域(包括电子邮件信息)。
最后,foobarPerson是为Foobar定制的对象类型,加入了很多定制的属性。
uid: fsmith
givenname: Fran
sn: Smith
cn: Fran Smith
cn: Frances Smith
telephonenumber: 510-555-1234
roomnumber: 122G
o: Foobar, Inc
以前说过了,uid表示User ID。当看到uid的时候,就在脑袋里想一想“login"。
请注意CN有多个值。就象上面介绍的,LDAP允许某些属性有多个值。为什么允许有多个值呢?假定你在用
公司的LDAP服务器查找Fran的电话号码。你可能只知道她的名字叫Fran,但是对人力资源处的人来说她的
正式名字叫做Frances。因为保存了她的两个名字,所以用任何一个名字检索都可以找到Fran的电话号码、
电子邮件和办公房间号,等等。
mailRoutingAddress: fsmith@foobarcom
mailhost: mailfoobarcom
就象现在大多数的公司都上网了,Foobar用Sendmail发送邮件和处理外部邮件路由信息。Foobar把所有用户
的邮件信息都存在LDAP中。最新版本的Sendmail支持这项功能。
Userpassword: 3x1231v76T89N
uidnumber: 1234
gidnumber: 1200
gecos: Frances Smith
homedirectory: /home/fsmith
loginshell: /usr/local/bin/bash
注意,Foobar的系统管理员把所有用户的口令映射信息也都存在LDAP中。FoobarPerson类型的对象具有这
种能力。再注意一下,用户口令是用UNIX的口令加密格式存储的。UNIX的uid在这里为uidnumber。提醒你一下,
关于如何在LDAP中保存NIS信息,有完整的一份RFC。在以后的文章中我会谈一谈NIS的集成。
LDAP复制
LDAP服务器可以使用基于“推”或者“拉”的技术,用简单或基于安全证书的安全验证,复制一部分或者所
有的数据。
例如,Foobar有一个“公用的”LDAP服务器,地址为ldapfoobarcom,端口为389。Netscape Communicator
的电子邮件查询功能、UNIX的“ph"命令要用到这个服务器,用户也可以在任何地方查询这个服务器上的员工
和客户联系信息。公司的主LDAP服务器运行在相同的计算机上,不过端口号是1389。
你可能即不想让员工查询资产管理或食谱的信息,又不想让信息技术人员看到整个公司的LDAP目录。为了解决
这个问题,Foobar有选择地把子目录树从主LDAP服务器复制到“公用”LDAP服务器上,不复制需要隐藏的信息。
为了保持数据始终是最新的,主目录服务器被设置成即时“推”同步。这些种方法主要是为了方便,而不是安全,
因为如果有权限的用户想查询所有的数据,可以用另一个LDAP端口。
假定Foobar通过从奥克兰到欧洲的低带宽数据的连接用LDAP管理客户联系信息。可以建立从ldapfoobarcom:1389
到munich-ldapfoobarcom:389的数据复制,象下面这样:
periodic pull: ou=asia,ou=customers,o=sendmailcom
periodic pull: ou=us,ou=customers,o=sendmailcom
immediate push: ou=europe,ou=customers,o=sendmailcom
“拉”连接每15分钟同步一次,在上面假定的情况下足够了。“推”连接保证任何欧洲的联系信息发生了变化就
立即被“推”到Munich。
用上面的复制模式,用户为了访问数据需要连接到哪一台服务器呢?在Munich的用户可以简单地连接到本地服务
器。如果他们改变了数据,本地的LDAP服务器就会把这些变化传到主LDAP服务器。然后,主LDAP服务器把这些变化
“推”回本地的“公用”LDAP服务器保持数据的同步。这对本地的用户有很大的好处,因为所有的查询(大多数是读)都在本地的服务器上进行,速度非常快。当需要改变信息的时候,最终用户不需要重新配置客户端的软件,因为LDAP目录服务器为他们完成了所有的数据交换工作。
作为一名网络管理员,您需要为您所需管理的每个网络设备存放用于管理的用户信息。但是网络设备通常只支持有限的用户管理功能。学习如何使用Linux上的一个外部RADIUS服务器来验证用户,具体来说是通过一个LDAP服务器进行验证,可以集中放置存储在LDAP服务器上并且由RADIUS服务器进行验证的用户信息,从而既可以减少用户管理上的管理开销,又可以使远程登录过程更加安全。
数据安全作为现代系统中网络安全的一部分,与系统安全一样的重要,所以保护数据--确保提供机密性、完整性和可用性--对管理员来说至关重要。
在本文中,我将谈到数据安全性的机密性方面:确保受保护的数据只能被授权用户或系统访问。您将学习如何在Linux系统上建立和配置一个Remote Authentication Dial-In User Service 服务器(RADIUS),以执行对用户的验证、授权和记帐(AAA)。
各组成元素介绍
首先让我们谈一谈RADIUS协议、AAA组件以及它们如何工作,另外还有LDAP协议。
Remote Authentication Dial-In User Service 协议是在IET的RFC 2865中定义的(请参阅参考资料获得相关链接)。它允许网络访问服务器(NAS)执行对用户的验证、授权和记帐。RADIUS是基于UDP的一种客户机/服务器协议。RADIUS客户机是网络访问服务器,它通常是一个路由器、交换机或无线访问点(访问点是网络上专门配置的节点;WAP是无线版本)。RADIUS服务器通常是在UNIX或Windows 2000服务器上运行的一个监护程序。
RADIUS和AAA
如果NAS收到用户连接请求,它会将它们传递到指定的RADIUS服务器,后者对用户进行验证,并将用户的配置信息返回给NAS。然后,NAS接受或拒绝连接请求。
功能完整的RADIUS服务器可以支持很多不同的用户验证机制,除了LDAP以外,还包括:
PAP(Password Authentication Protocol,密码验证协议,与PPP一起使用,在此机制下,密码以明文形式被发送到客户机进行比较);
CHAP(Challenge Handshake Authentication Protocol,挑战握手验证协议,比PAP更安全,它同时使用用户名和密码);
本地UNIX/Linux系统密码数据库(/etc/passwd);
其他本地数据库。
在RADIUS中,验证和授权是组合在一起的。如果发现了用户名,并且密码正确,那么RADIUS服务器将返回一个Access-Accept响应,其中包括一些参数(属性-值对),以保证对该用户的访问。这些参数是在RADIUS中配置的,包括访问类型、协议类型、用户指定该用户的IP地址以及一个访问控制列表(ACL)或要在NAS上应用的静态路由,另外还有其他一些值。
RADIUS记帐特性(在RFC 2866中定义;请参阅参考资料获得相关链接)允许在连接会话的开始和结束发送数据,表明在会话期间使用的可能用于安全或开单(billing)需要的大量资源--例如时间、包和字节。
轻量级目录访问协议
轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)是一种开放标准,它定义了用于访问和更新类X500 目录中信息的一种方法。LDAP可用于将用户信息保存在一个中央场所,从而不必将相同的信息存储在每个系统上。它还可以用于以一种一致的、可控制的方式维护和访问信息。
LDAP在一个集中的目录中管理用户,从而简化了用户管理工作。除了存储用户信息外,在LDAP中定义用户还可以使一些可选特性得到启用,例如限制登录的数量。在本文中,您将学习如何配置RADIUS服务器,以便基于LDAP验证用户--由于本文的重点在于RADIUS,我不会描述关于LDAP服务器的安装和配置的细节。
OpenLDAP是LDAP的一种开放源码实现。在OpenLDAPorg上可以找到关于它的详细信息(请参阅参考资料获得相关链接)。
场景
想像以下场景:
用户在家里可以通过拨号验证访问他公司的内部网。
带无线支持的笔记本电脑可以通过无线验证连接到一个校园网。
管理员使用他们的工作站通过管理用户验证以telnet或HTTP登录到网络设备。
所有这些验证任务都可以通过一个RADIUS服务器基于一个中央LDAP服务器来完成(见图 1)。
图1 通过RADIUS和LDAP进行验证
在本文中,我将重点描述对最后一种选项的实现,作为对该解决方案的一个介绍。首先安装RADIUS服务器。
安装 RADIUS
RADIUS服务器软件可以从多个地方获得。在本文中,我将使用FreeRADIUS(请参阅参考资料获得相关链接),但Cisco Secure Access Control Server (ACS)是一种集中式用户访问控制框架,可用于跨UNIX和Windows上多个Cisco设备的用户管理,并支持Cisco 特有的协议TACACS+(据说在支持TACACS+的设备上可拥有更多的特性)。
FreeRADIUS是来自开放源码社区的一种强大的Linux上的RADIUS服务器,可用于如今的分布式和异构计算环境。FreeRADIUS 102 支持LDAP、MySQL、PostgreSQL和Oracle数据库,并与诸如EAP和Cisco LEAP之类的网络协议兼容。FreeRADIUS目前被部署在很多大型生产网络系统中。
下面的步骤演示如何在Red Hat Enterprise Linux Advanced Server 30上安装和测试FreeRADIUS 102:
清单1 安装和测试FreeRADIUS
tar -zxvf freeradius-102targz - extract it with gunzip and tar
/configure
make
make install - run this command as root
radiusd or - start RADIUS server
radiusd -X - start RADIUS server in debug mode
radtest test test localhost 0 testing123 - test RADIUS server
如果radtest收到一个响应,则表明FreeRADIUS服务器工作正常。
同时我还推荐另一种免费工具,那就是NTRadPing,它可用于测试来自Windows客户机的验证和授权请求。它可以显示从RADIUS服务器发回的详细的响应,例如属性值。
现在让我们来配置FreeRADIUS。
配置FreeRADIUS
RADIUS服务器的配置包括对服务器、客户机和用户的配置(都是用于验证和授权)。出于不同的需要,对RADIUS服务器可以有不同的配置。幸运的是,大多数配置都是类似的。
配置服务器
FreeRADIUS配置文件通常位于/etc/raddb文件夹下。首先,我们需要像下面这样修改radiusdconf文件。
清单2 修改radiusdconf
1) Global settings:
log_auth = yes - log authentication requests to the log file
log_auth_badpass = no - don't log passwords if request rejected
log_auth_goodpass = no - don't log passwords if request accepted
2) LDAP Settings:
modules {
ldap {
server = "bluepagesibmcom" - the hostname or IP address of the LDAP server
port = 636 - encrypted communications
basedn = "ou=bluepages,o=ibmcom" - define the base Distinguished Names (DN),
- under the Organization (O) "ibmcom",
- in the Organization Unit (OU) "bluepages"
filter = "(mail=%u)" - specify search criteria
base_filter = "(objectclass=person)" - specify base search criteria
}
authenticate { - enable authentication against LDAP
Auth-Type LDAP {
ldap
}
参数被设为使用 IBM BluePages,这是LDAP服务的一个实例。对于其他LDAP服务器,参数可能有所不同。
配置客户机
客户机是在/etc/raddb/clientsconf 文件中配置的。有两种方式可用于配置RADIUS客户机。您可以按IP subnet将NAS分组(清单 3),或者可以按主机名或 IP 地址列出NAS(清单4)。如果按照第二种方法,可以定义shortname和nastype。
清单3 按IP subnet将NAS分组
client 19216800/24 {
secret = mysecret1 - the "secret" should be the same as configured on NAS
shortname = mylan - the "shortname" can be used for logging
nastype = cisco - the "nastype" is used for checkrad and is optional
}
清单4 按主机名或 IP 地址列出 NAS
client 19216801 {
secret = mysecret1
shortname = myserver
nastype = other
}
为验证而配置用户
文件 /etc/raddb/user 包含每个用户的验证和配置信息。
清单5 /etc/raddb/user 文件
1) Authentication type:
Auth-Type := LDAP - authenticate against LDAP
Auth-Type := Local, User-Password == "mypasswd"
- authenticate against the
- password set in /etc/raddb/user
Auth-Type := System - authenticate against the system password file
- /etc/passwd or /etc/shadow
2) Service type:
Service-Type = Login, - for administrative login
为授权而配置用户
下面的验证服务器属性-值对(AV)应该为用户授权而进行配置。在验证被接受后,这个属性-值对被返回给NAS,作为对管理员登录请求的响应。
对于Cisco路由器,有不同的权限级别:
级别1是无特权(non-privileged)。提示符是 router>,这是用于登录的默认级别。
级别15是特权(privileged)。 提示符是 router#,这是进入 enable 模式后的级别。
级别2到14 在默认配置中不使用。
下面的命令可以使一个用户从网络访问服务器登录,并获得对EXEC命令的立即访问:
cisco-avpair ="shell:priv-lvl=15"
下面的代码处理相同的任务,这一次是对于Cisco无线访问点:
Cisco:Avpair= "aironet:admin-capability=write+snmp+ident+firmware+admin"
任何功能组合都和这个属性一起返回:
Cisco:Avpair = "aironet:admin-capability=ident+admin"
Cisco:Avpair = "aironet:admin-capability=admin"
请与 Cisco 联系,以获得关于这些命令的更多信息。
配置网络访问服务器
接下来我们将配置NAS,首先是配置一个Cisco路由器,然后轮到一个Cisco WAP。
对于Cisco IOS 121路由器,我们将启用AAA,然后配置验证、授权和记帐。
清单6 启用AAA
aaa new-model
radius-server host 1921680100
radius-server key mysecret1
AAA 在路由器上应该被启用。然后,指定能为 NAS 提供 AAA 服务的 RADIUS 服务器的列表。加密密钥用于加密 NAS 和 RADIUS 服务器之间的数据传输。它必须与 FreeRADIUS 上配置的一样。
清单7 配置验证
aaa authentication login default group radius local
line vty 0 4
login authentication default
在这个例子中,网络管理员使用 RADIUS 验证。如果 RADIUS 服务器不可用,则使用 NAS 的本地用户数据库密码。
清单8 配置授权
aaa authorization exec default group radius if-authenticated
允许用户在登录到 NAS 中时运行 EXEC shell。
清单9 配置记帐
aaa accounting system default start-stop group radius
aaa accounting network default start-stop group radius
aaa accounting connection default start-stop group radius
aaa accounting exec default stop-only group radius
aaa accounting commands 1 default stop-only group radius
aaa accounting commands 15 default wait-start group radius
必须对路由器进行特别的配置,以使之发送记帐记录到RADIUS服务器。使用清单9中的命令记录关于NAS系统事件、网络连接、输出连接、EXEC操作以及级别1和级别15上的命令的记帐信息。
这样就好了。现在让我们看看为Cisco无线访问点而进行的配置。下面的配置适用于带有Firmware 1201T1的Cisco 1200 Series AP。如图2中的屏幕快照所示,您:
输入服务器名或 IP 地址和共享的秘密。
选择“Radius”作为类型,并选中“User Authentication”。
图2 为WAP配置NAS
实际上,在这里您还可以配置EAP Authentication,使FreeRADIUS可用于验证无线LAN的一般用户。
记帐:工作中的RADIUS
现在所有配置都已经完成,FreeRADIUS服务器可以开始记录NAS发送的所有信息,将该信息存储在/var/log/radius/radiuslog文件中,就像这样:
清单10 /var/log/radius/radiuslog文件
Thu Mar 3 21:37:32 2005 : Auth: Login OK: [David] (from client
mylan port 1 cli 192168094)
Mon Mar 7 23:39:53 2005 : Auth: Login incorrect: [John] (from
client mylan port 1 cli 192168094)
详细的记帐信息被存放在/var/log/radius/radacct目录中。清单11表明,David在2005年3月4日19:40到19:51这段时间里从 192168094登录到了路由器19216801。这么详细的信息对于正在调查安全事故以及试图维护易于审计的记录的管理员来说无疑是一大帮助。
清单11 RADIUS 提供的记帐细节示例
Fri Mar 4 19:40:12 2005
NAS-IP-Address = 19216801
NAS-Port = 1
NAS-Port-Type = Virtual
User-Name = "David"
Calling-Station-Id = "192168094"
Acct-Status-Type = Start
Acct-Authentic = RADIUS
Service-Type = NAS-Prompt-User
Acct-Session-Id = "00000026"
Acct-Delay-Time = 0
Client-IP-Address = 19216801
Acct-Unique-Session-Id = "913029a52dacb116"
Timestamp = 1109936412
Fri Mar 4 19:51:17 2005
NAS-IP-Address = 19216801
NAS-Port = 1
NAS-Port-Type = Virtual
User-Name = "David"
Calling-Station-Id = "192168094"
Acct-Status-Type = Stop
Acct-Authentic = RADIUS
Service-Type = NAS-Prompt-User
Acct-Session-Id = "00000026"
Acct-Terminate-Cause = Idle-Timeout
Acct-Session-Time = 665
Acct-Delay-Time = 0
Client-IP-Address = 19216801
Acct-Unique-Session-Id = "913029a52dacb116"
Timestamp = 1109937077
结束语
通过遵循本文中列出的简单步骤,您可以建立一个Remote Authentication Dial-In User Service服务器,该服务器使用一个外部的LDAP服务器来处理为网络安全问题而进行的验证、授权和记帐。本文提供了以下内容来帮助您完成此任务:
对RADIUS和LDAP服务器以及AAA概念的介绍。
一个融入了安装和配置任务的场景。
关于安装和配置RADIUS服务器的说明。
关于配置网络访问服务器的细节。
RADIUS将提供和管理的详细信息的一个示例。
这些指示可以快速确保受保护的数据只能由Linux系统上已授权的实体访问。
JIRA与LDAP集成的工作机制是这样的:
1 用户信息依旧需要在JIRA中进行管理
2 只有密码验证在LDAP中完成
3 在LDAP中不存在的用户依旧可以通过JIRA本身的密码验证机制(OSUser)来进行身份校验
4 并非全部的LDAP用户都具有JIRA访问权限
配置JIRA与LDAP集成的方法是(以JIRA 421为例):
1 进入Admin(管理) -> System(系统) -> LDAP
2 在LDAP Host(LDAP主机)中填入LDAP服务器地址
3 在BaseDN中填入LDAP的根节点名称
4 在Search Attribute中填入LDAP中包含JIRA登录用户名的属性名称
5 保存LDAP的修改
6 进入Admin(管理) -> General Configuration(通用设置)
7 打开External Password Management(外部密码管理)
8 保存退出并重启服务
除了可以利用JIRA现有的LDAP集成机制外,也可以考虑Atlassian Crowd这款独立的单点登录工具,Crowd和JIRA的结合非常好。JIRA的用户可完全在Crowd中进行管理。Crowd支持LDAP,Windows Active Directory等多种目录服务器,应用程序上支持JIRA、Confluence、FishEye、Crucible、GoogleApp、SVN等应用。可实现一个账户访问全部应用,并支持单点登录。
C#提供了 LdapConnection 类用于连接Microsoft Active Directory 域服务或 LDAP 服务器的 TCP/IP 或 UDP LDAP 连接。 下面是连接 Ldap的连接方法和大家分享下:
1static LdapConnection ldapConnection;
2 static string ldapServer;
3 static NetworkCredential credential;
4 static string targetOU;
5 static string pwd;
6 public void LdapBind()
7 {
8 ldapServer = "1721869204:389";
9 targetOU = "cn=Manager,dc=tst,dc=com";
10 pwd = "000000";
11
12 //credential = new NetworkCredential(StringEmpty, StringEmpty);
13 credential = new NetworkCredential(targetOU, pwd);
0条评论