ldap python

    技术2024-06-02  77

    在本文中,我们将展示如何安装在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是什么,其用途是什么?

    那么LDAP是什么? 根据严格的定义,术语LDAP代表轻型目录访问协议。 但是,该名称已与实际的目录体系结构同步。 通常,当有人提到LDAP时,他指的不是协议,而是目录服务。

    LDAP的最新版本是V3或版本3。LDAP被设计为通用目录,但是有一些约定。 一条记录由DN和在属性定义中定义的一个或多个属性组成。 LDAP数据库的模式与典型的关系数据库模式定义语言有很大不同。 一个例子是典型的关系数据库是基于表的,而LDAP包含继承。 如果您想进一步了解一般的LDAP理论,我们强烈建议您阅读参考资料部分列出的OpenLDAP书籍。

    现在是关于它的用途的问题。 几乎令人惊奇的是,它用于构建IT基础架构的人员的身份验证。 它也可以与Samba很好地配合使用,因此与其他专有目录解决方案不同,有经验的sysadmin可以以零成本建立非常复杂的IT基础架构。 需要明确的是,“身份验证”只是意味着基础架构中的所有机器都可以通过与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。

    设置Apache 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执行CRUD操作

    现在,我们准备使用Python与LDAP进行交互。 为此,必须安装python-ldap模块。 Â如果您参考参考资料部分,则可以找到有关安装模块的更多详细信息的链接。 简而言之,您将需要执行“轻松安装”。 Â首先在此处下载Âeasy_install脚本:

    http://peak.telecommunity.com/dist/ez_setup.py

    然后输入:

    sudo easy_install python-ldap

    请注意,该程序包的某些依赖项随操作系统的不同而略有不同。 如果安装软件包有困难,请确保已阅读该软件包的安装说明。

    借助python-ldap的安装,我们已经准备好进行CRUD操作。 Â让我们编写一个类来做到这一点。

    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”:

    LDAP创建
    # 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”:

    LDAP读取
    # see if it was added l.list_stooges(attrib=['cn', 'mail', 'homePhone'])

    现在让我们更新它,或执行“ U”:

    LDAP更新
    # 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”,表示删除:

    LDAP删除
    # 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

    相关资源:jdk-8u281-windows-x64.exe
    Processed: 0.022, SQL: 9