将 OpenLDAP 配置为 Active Directory 代理

将 OpenLDAP 配置为 Active Directory 代理

我们尝试设置一个 Active Directory 服务器,用于全公司范围的身份验证。

一些需要根据 AD 进行身份验证的服务器被放置在 DMZ 中,因此我们考虑使用 LDAP 服务器作为代理,这样 DMZ 中只有 1 台服务器必须连接到放置 AD 服务器的 LAN。

通过一些谷歌搜索,发现配置 slapd 没有问题(请参阅下面的 slapd.conf),并且在使用 ldapsearch 工具时它似乎可以工作,因此我们尝试在 apache2 htaccess 中使用它通过 LDAP 代理对用户进行身份验证。

问题来了:我们发现 AD 中的用户名存储在属性“sAMAccountName”中,因此我们在 .htaccess 中对其进行了配置(见下文),但登录不起作用。

在系统日志中我们发现 ldapsearch 的过滤器不是(应该是)'(&(objectClass=*)(sAMAccountName=authtest01))' 但 '(&(objectClass=*)(?=未定义))' 我们发现这是 slapd 表示该属性不存在或该属性的值在语法上错误的方式。

我们想到了一个缺失的模式,并找到了微软架构(以及其中的 .std / .ext 文件)并尝试将它们包含在 slapd.conf 中。但不起作用。我们找不到可用的模式,因此我们只挑选了有关 sAMAccountName 的部分并构建了我们包含的 microsoft.minimal.schema(见下文)。现在我们在 syslog 中获得了更精确的日志:

Jun 16 13:32:04 breauthsrv01 slapd[21229]: get_ava: illegal value for attributeType sAMAccountName
Jun 16 13:32:04 breauthsrv01 slapd[21229]: conn=0 op=1 SRCH base="ou=xxx,dc=int,dc=xxx,dc=de" scope=2 deref=3 filter="(&(objectClass=\*)(?sAMAccountName=authtest01))"
Jun 16 13:32:04 breauthsrv01 slapd[21229]: conn=0 op=1 SRCH attr=sAMAccountName
Jun 16 13:32:04 breauthsrv01 slapd[21229]: conn=0 op=1 SEARCH RESULT tag=101 err=0 nentries=0 text=

不过,通过 LDAP 直接使用我们的 Apache htaccess 与 AD 是可行的。有人有可用的设置吗?提前感谢大家的帮助:

slapd.conf:

allow bind_v2
include         /etc/ldap/schema/core.schema
...
include         /etc/ldap/schema/microsoft.minimal.schema
...
backend         ldap
database        ldap

suffix "ou=xxx,dc=int,dc=xxx,dc=de"
uri "ldap://80.156.177.161:389"
acl-bind bindmethod=simple binddn="CN=authtest01,ou=GPO-Test,ou=xxx,dc=int,dc=xxx,dc=de" credentials=xxxxx

.htaccess 文件:

AuthBasicProvider ldap
AuthType basic
AuthName "AuthTest"
AuthLDAPURL "ldap://breauthsrv01.xxx.de:389/OU=xxx,DC=int,DC=xxx,DC=de?sAMAccountName?sub"
AuthzLDAPAuthoritative On
AuthLDAPGroupAttribute member
AuthLDAPBindDN  CN=authtest02,OU=GPO-Test,OU=xxx,DC=int,DC=xxx,DC=de
AuthLDAPBindPassword test123
Require valid-user

microsoft.minimal.schema:

attributetype ( 1.2.840.113556.1.4.221
      NAME 'sAMAccountName'
      SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
      SINGLE-VALUE )

答案1

您需要将映射添加到您的 slapd.conf 文件:

moduleload rwm
...
overlay rwm
rwm-map attribute uid sAMAccountName
rwm-map objectClass posixGroup group 
rwm-map objectClass posixAccount person
rwm-map objectClass memberUid member

然后你可以搜索用户ID属性,而不是账户名称.htaccess 文件中的属性:

AuthLDAPURL "ldap://breauthsrv01.xxx.de:389/OU=xxx,DC=int,DC=xxx,DC=de?uid?sub"

答案2

您看到以下错误消息:

get_ava:attributeType sAMAccountName 的值非法

这是因为您在定义属性sAMAccountNamemicrosoft.minimal.schema缺少匹配规则。简而言之,OpenLDAP 的架构定义允许您指定允许哪种搜索(存在、精确匹配、子字符串匹配等),而此定义没有。

尝试这个:

 attributetype ( 1.2.840.113556.1.4.221
   NAME 'sAMAccountName'
   EQUALITY caseIgnoreMatch
   SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
   SINGLE-VALUE )

答案3

乔纳森的回答为我指明了正确的方向,让我克服了:

additional info: sAMAccountName: attribute type undefined

问题。但我意识到您需要将此属性定义为人员条目的合法值,并且您需要为每个人提供允许具有该属性的 objectClass。就像您可以为 inetOrgPerson 提供的所有属性一样。

我的 microsoft.minimal.schema 文件现在是:

attributetype ( 1.2.840.113556.1.4.221
          NAME 'sAMAccountName'
          SYNTAX '1.3.6.1.4.1.1466.115.121.1.15'
          SINGLE-VALUE )

attributetype ( 1.2.840.113556.1.4.146
          NAME 'objectSid'
          SYNTAX '1.3.6.1.4.1.1466.115.121.1.40'
          SINGLE-VALUE )

objectclass ( 1.2.840.113556.1.5.6
        NAME 'securityPrincipal'
        SUP top
        AUXILIARY
        MUST (objectSid $ sAMAccountName )
        MAY () )

 #            MAY (nTSecurityDescriptor $ securityIdentifier $ supplementalCredentials $
 #                rid $ sAMAccountType $ sIDHistory $ altSecurityIdentities $ tokenGroups $
 #                    tokenGroupsNoGCAcceptable $ accountNameHistory  $
 #                                              tokenGroupsGlobalAndUniversal))

我将 MS-optional 属性替换为空,这样我就不必定义它们了。

用户输入的示例如下:

dn: uid=user2,ou=example,dc=aa,dc=ad,dc=example,dc=gov                                                                          
uid: user2                                                                                                              
sAMAccountName: user2                                                                                                   
objectSid: user2                                                                                                        
cn: User Two                                                                                                            
displayName: User Two                                                                                                   
givenName: User2                                                                                                        
sn: One                                                                                                                 
objectClass: inetOrgPerson                                                                                              
objectClass: securityPrincipal                                                                                          
mail: [email protected]                                                                                                 
 # password from slappasswd is 'user2'                                                                                   
userPassword: {SSHA}sjB5fmIIPTrUUammtmonP+6DdC93+P4L    

相关内容