当前位置: 首页 > 工具软件 > Python-LDAP > 使用案例 >

ldap python_Python和LDAP

汪兴为
2023-12-01

在本文中,我们将展示如何安装在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设置部分进行操作,则需要一个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

 类似资料: