在本文中,我们将展示如何安装在Amazon EC2虚拟机上运行的OpenLDAP实例,设置Apache / LDAP身份验证,然后使用Python执行CRUD或创建,读取,更新和删除操作。 重要的是要注意,LDAP可以安装在Fedora,Ubuntu,Red Hat,AIX®等上。 但是,出于本文的目的,我们决定专注于Amazon EC2虚拟机。 您可以在家中使用任何Linux®发行版或任何方便的环境。 最后,我们在文章中介绍了许多代码和复杂的技术。 您可能想从一开始就下载示例代码 ,并在阅读本文时将其放在方便的位置。
以编程方式控制LDAP通常与sysadmin相关的工作相关联,因此,不应该存在一个库来使用Python中的LDAP。 python-ldap模块已经存在了很长一段时间,并且在参考资料小节中有指向官方文档的链接。
我们假定您熟悉常规LDAP概念,例如目录架构,专有名称(DN),公用名(CN)以及过滤器和属性的概念。 本文不是LDAP教程。 我们宁愿少谈理论,而多谈使用和管理LDAP数据库的实际示例。
如果您想按照本文的LDAP设置部分进行操作,则需要一个Fedora Core 8实例。在本例中,我们使用了一个运行32位Fedora Core 8的Amazon EC2计算机实例。 您还可以使用所选技术将OpenLDAP安装到物理服务器或虚拟机上。 请注意,尽管存在一个建议使用example.com的RFC,但我们在所有示例中都使用了一个名为unisonis.com的示例域。
步骤1:使用yum安装openldap软件包:
[root@domU ]# yum install openldap openldap-devel
openldap-servers openldap-clients
[root@domU ]# yum list installed | grep openldap
openldap.i386 2.3.39-4.fc8 installed
openldap-clients.i386 2.3.39-4.fc8 installed
openldap-devel.i386 2.3.39-4.fc8 installed
openldap-servers.i386 2.3.39-4.fc8 installed
步骤2:设置管理员密码(我们将SSHA哈希值粘贴到slapd.conf中)。 请注意,slapd代表独立LDAP服务,因此这是控制LDAP本身的服务:
[root@domU ]# slappasswd
New password:
Re-enter new password:
步骤3:编辑slapd.conf配置文件,并添加与常规LDAP安装有关的条目,例如根DN和根/管理员密码:
[root@domU ]# vi /etc/openldap/slapd.conf
#Add entries:
database bdb
suffix "dc=unisonis,dc=com"
rootdn "cn=Manager,dc=unisonis,dc=com"
rootpw {SSHA}pasted_from_slappasswd_output
directory /var/lib/ldap
步骤4:启动LDAP服务:
[root@domU ]# service ldap start
Starting slapd: [ OK ]
步骤5:通过运行LDAP搜索'namingContexts'属性来测试现有设置:
[root@domU ]# ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (objectclass=*)
# requesting: namingContexts
#
#
dn:
namingContexts: dc=unisonis,dc=com
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
步骤6:使用LDIF文件,通过ldapadd将更多条目添加到LDAP数据库中。 请注意,LDIF代表LDAP数据交换格式,并且它是一种格式化数据以对LDAP数据库进行大型更新的结构:
[root@domU ]# cat unisonis.ldif
dn: dc=unisonis,dc=com
objectclass: dcObject
objectclass: organization
o: Example Company
dc: unisonis
dn: cn=Manager,dc=unisonis,dc=com
objectclass: organizationalRole
cn: Manager
[root@domU ]# ldapadd -x -D "cn=Manager,dc=unisonis,dc=com" -W -f
unisonis.ldif
Enter LDAP Password:
adding new entry "dc=unisonis,dc=com"
adding new entry "cn=Manager,dc=unisonis,dc=com"
步骤7:下一步是使用我们可以执行的示例条目填充LDAP目录。 我们将使用这三种方式的信息(这些条目的灵感来自LDAP文章, 网址为http://www.yolinux.com/TUTORIALS/LinuxTutorialLDAP.html ):
[root@domU ]# cat stooges.ldif; # to conserve space, we show the LDAP data for
only one of the three stooges
dn: ou=MemberGroupA,dc=unisonis,dc=com
ou: MemberGroupA
objectClass: top
objectClass: organizationalUnit
description: Members of MemberGroupA
dn: ou=MemberGroupB,dc=unisonis,dc=com
ou: MemberGroupB
objectClass: top
objectClass: organizationalUnit
description: Members of MemberGroupB
dn: cn=Larry Fine,ou=MemberGroupA,dc=unisonis,dc=com
ou: MemberGroupA
o: stooges
cn: Larry Fine
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
mail: LFine@unisonis.com
givenname: Larry
sn: Fine
uid: larry
homePostalAddress: 15 Cherry Ln. Plano TX 78888
postalAddress: 215 Fitzhugh Ave.
l: Dallas
st: TX
postalcode: 75226
telephoneNumber: (800)555-1212
homePhone: 800-555-1313
facsimileTelephoneNumber: 800-555-1414
userPassword: larrysecret
title: Account Executive
destinationindicator: /bios/images/lfine.jpg
[root@domU ]# ldapadd -x -D "cn=Manager,dc=unisonis,dc=com" -W -f stooges.ldif
如果您好奇,现在可以开始针对我们创建的LDAP数据库进行各种搜索。 以下是搜索与“ stooges”组织相关的所有LDAP条目的示例:
[root@domU conf.d]# ldapsearch -x -b 'dc=unisonis,dc=com' '(o=stooges)'
在下一部分中,我们将展示如何配置Apache以对LDAP进行身份验证,然后再进入Python和LDAP。
LDAP的最常见用途之一是为Web服务器等服务提供身份验证数据。 在本节中,我们将使用预先填充的LDAP数据库,并使用它来控制对Apache虚拟主机的访问。
首先,我们需要为使用LDAP身份验证的虚拟主机创建一个Apache配置文件。 我们将为尝试登录的用户提供有效的电子邮件和密码。如下所示:
[root@domU ]# cat /etc/httpd/conf.d/unisonis.conf
<VirtualHost *:80>
ServerName www.unisonis.com
DocumentRoot "/ebs1/www/unisonis"
<Directory "/ebs1/www/unisonis">
AuthType Basic
AuthName "unisonis.com: please login with email address"
AuthBasicProvider ldap
AuthLDAPURL ldap://localhost:389/dc=unisonis,dc=com?mail?sub?(o=stooges)
require valid-user
Order Allow,Deny
Allow from all
Options Indexes FollowSymLinks
AllowOverride None
</Directory>
</VirtualHost>
LDAP身份验证由mod_auth_ldap模块为Apache提供,该模块默认安装在Fedora Core 8 httpd软件包中。 对上面定义的Apache虚拟主机的所有访问都将需要'stooges'组织中有效的电子邮件和密码,以供尝试登录的用户使用。请注意AuthLDAPURL指令,该指令指定了我们用来进行身份验证的查询LDAP服务器上的用户。 我们搜索'mail'属性,然后应用过滤器(o = stooges)。 有关AuthLDAPURL指令的完整语法,请参见http://httpd.apache.org/docs/2.0/mod/mod_auth_ldap.html#authldapurl 。
请参阅参考资料部分,以获取有关使用Apache配置LDAP的更多信息。
现在,我们准备使用Python与LDAP进行交互。 为此,必须安装python-ldap模块。 Â如果您参考参考资料部分,则可以找到有关安装模块的更多详细信息的链接。 简而言之,您将需要执行“轻松安装”。 Â首先在此处下载Âeasy_install脚本:
http://peak.telecommunity.com/dist/ez_setup.py
然后输入:
sudo easy_install python-ldap
请注意,该程序包的某些依赖项随操作系统的不同而略有不同。 如果安装软件包有困难,请确保已阅读该软件包的安装说明。
借助python-ldap的安装,我们已经准备好进行CRUD操作。 Â让我们编写一个类来做到这一点。
#!/bin/env python
import sys, ldap
LDAP_HOST = 'localhost'
LDAP_BASE_DN = 'dc=unisonis,dc=com'
MGR_CRED = 'cn=Manager,dc=unisonis,dc=com'
MGR_PASSWD = 'mypasswd'
STOOGE_FILTER = 'o=stooges'
class StoogeLDAPMgmt:
def __init__(self, ldap_host=None, ldap_base_dn=None, mgr_cred=None,
mgr_passwd=None):
if not ldap_host:
ldap_host = LDAP_HOST
if not ldap_base_dn:
ldap_base_dn = LDAP_BASE_DN
if not mgr_cred:
mgr_cred = MGR_CRED
if not mgr_passwd:
mgr_passwd = MGR_PASSWD
self.ldapconn = ldap.open(ldap_host)
self.ldapconn.simple_bind(mgr_cred, mgr_passwd)
self.ldap_base_dn = ldap_base_dn
def list_stooges(self, stooge_filter=None, attrib=None):
if not stooge_filter:
stooge_filter = STOOGE_FILTER
s = self.ldapconn.search_s(self.ldap_base_dn, ldap.SCOPE_SUBTREE,
stooge_filter, attrib)
print "Here is the complete list of stooges:"
stooge_list = []
for stooge in s:
attrib_dict = stooge[1]
for a in attrib:
out = "%s: %s" % (a, attrib_dict[a])
print out
stooge_list.append(out)
return stooge_list
def add_stooge(self, stooge_name, stooge_ou, stooge_info):
stooge_dn = 'cn=%s,ou=%s,%s' % (stooge_name, stooge_ou, self.ldap_base_dn)
stooge_attrib = [(k, v) for (k, v) in stooge_info.items()]
print "Adding stooge %s with ou=%s" % (stooge_name, stooge_ou)
self.ldapconn.add_s(stooge_dn, stooge_attrib)
def modify_stooge(self, stooge_name, stooge_ou, stooge_attrib):
stooge_dn = 'cn=%s,ou=%s,%s' % (stooge_name, stooge_ou, self.ldap_base_dn)
print "Modifying stooge %s with ou=%s" % (stooge_name, stooge_ou)
self.ldapconn.modify_s(stooge_dn, stooge_attrib)
def delete_stooge(self, stooge_name, stooge_ou):
stooge_dn = 'cn=%s,ou=%s,%s' % (stooge_name, stooge_ou, self.ldap_base_dn)
print "Deleting stooge %s with ou=%s" % (stooge_name, stooge_ou)
self.ldapconn.delete_s(stooge_dn)
类中的方法名称很容易解释,因此让我们逐步了解实现类时可能发生的一些操作。 如果您已经按照前面的步骤来填充LDAP数据库,那么您可能还需要下载代码示例。
首先,让我们创建该类的一个实例:
l = StoogeLDAPMgmt()
至此,您的耐心得到了回报,我们已准备好执行CRUD。
接下来,使用Python以编程方式添加一些内容。 警告,您可能想从下载的源代码中粘贴此示例,因为手动输入可能会导致很多错误! 这是CRUD中的“ C”:
# add new stooge: Harry Potter
stooge_name = 'Harry Potter'
stooge_ou = 'MemberGroupB'
stooge_info = {'cn': ['Harry Potter'], 'objectClass': ['top', 'person',
'organizationalPerson', 'inetOrgPerson'],
'uid': ['harry'], 'title': ['QA Engineer'], 'facsimileTelephoneNumber':
['800-555-3318'], 'userPassword': ['harrysecret'],
'postalCode': ['75206'], 'mail': ['HPotter@unisonis.com'],
'postalAddress': ['2908 Greenville Ave.'],
'homePostalAddress': ['14 Cherry Ln. Plano TX 78888'], 'pager':
['800-555-1319'], 'homePhone': ['800-555-7777'],
'telephoneNumber': ['(800)555-1214'], 'givenName': ['Harry'], 'mobile':
['800-555-1318'], 'l': ['Dallas'],
'o': ['stooges'], 'st': ['TX'], 'sn': ['Potter'], 'ou': ['MemberGroupB'],
'destinationIndicator': ['/bios/images/hpotter.jpg'], }
try:
l.add_stooge(stooge_name, stooge_ou, stooge_info)
except ldap.LDAPError, error:
print 'problem with ldap',error
让我们用以下条目执行“ R”或“ Read”:
# see if it was added
l.list_stooges(attrib=['cn', 'mail', 'homePhone'])
现在让我们更新它,或执行“ U”:
# now modify home phone
stooge_modified_attrib = [(ldap.MOD_REPLACE, 'homePhone', '800-555-8888')]
try:
l.modify_stooge(stooge_name, stooge_ou, stooge_modified_attrib)
except ldap.LDAPError, error:
print 'problem with ldap',error
最后,让我们从缩写中获得最后一个字母“ D”,表示删除:
# now delete Harry Potter
try:
l.delete_stooge(stooge_name, stooge_ou)
except ldap.LDAPError, error:
print 'problem with ldap',error
本文简要介绍了在Amazon EC2 Fedora实例上安装OpenLDAP的过程。 我们用测试数据填充了LDAP数据库,并简要地探讨了如何从命令行进行交互。 我们展示了如何配置Apache来对示例LDAP数据库进行身份验证。 最后,我们开始从Python以编程方式控制LDAP。 Python示例的优点之一是,与使用bash编写脚本相比,该代码看起来更令人愉悦。 在处理诸如LDAP编程之类的相当复杂的操作中,Python的清晰易读的代码声名显赫。
我们并未真正探讨LDAP和Python的任何实用示例,而是处理了有关如何使用API执行常见CRUD操作的文档。 这是使用python-ldap库的实用想法。 每次创建新的TRAC实例时,您可能想用LDAP组中的所有用户填充不同的TRAC项目管理网站。 使用我们介绍的技术,这很容易做到:查询LDAP组,然后在TRAC中为该组的每个成员插入一个权限。 还有许多其他实用的LDAP脚本编写方法,因此希望本文使您对接下来可以在自己的项目中执行的操作感到兴奋。
特别感谢David Goodger帮助审阅了这篇文章。
翻译自: https://www.ibm.com/developerworks/aix/library/au-ldap_crud/index.html