我们尝试设置一个 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 的值非法
这是因为您在定义属性sAMAccountName
时microsoft.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