it-swarm.com.de

LDAP-Stammabfragesyntax zum Durchsuchen mehrerer bestimmter Organisationseinheiten

Ich muss eine einzelne LDAP-Abfrage ausführen, die zwei bestimmte Organisationseinheiten (OUs) in der Stammabfrage durchsucht. Ich habe die folgenden Abfragen ausprobiert und keine waren erfolgreich:

(|(OU=Staff,DC=my,DC=super,DC=org)(OU=Vendors,DC=my,DC=super,DC=org))

((OU=Staff,DC=my,DC=super,DC=org) | (OU=Vendors,DC=my,DC=super,DC=org))

Meine Frage ist; Ist es möglich, mehr als eine einzelne Organisationseinheit abzufragen in einer einzelnen Abfrage? Angenommen, es ist die richtige Syntax für diesen Ausdruckstyp in der LDAP-Stammabfrage.

24
James

Du kannst!!! Kurz gesagt, verwenden Sie dies als Verbindungszeichenfolge:

ldap://<Host>:3268/DC=<my>,DC=<domain>?cn

zusammen mit Ihrem Suchfilter, z.

(&(sAMAccountName={0})(&((objectCategory=person)(objectclass=user)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf:1.2.840.113556.1.4.1941:=CN=<some-special-nested-group>,OU=<ou3>,OU=<ou2>,OU=<ou1>,DC=<dc3>,DC=<dc2>,DC=<dc1>))))

Das wird im sogenannten Global Catalogue suchen, das in unserer Umgebung sofort verfügbar war.

Anstelle der bekannten/gebräuchlichen anderen Versionen (oder Kombinationen davon), die NICHT in unserer Umgebung funktioniert haben mit mehreren Organisationseinheiten:

ldap://<Host>/DC=<my>,DC=<domain>
ldap://<Host>:389/DC=<my>,DC=<domain>  (standard port)
ldap://<Host>/OU=<someOU>,DC=<my>,DC=<domain>
ldap://<Host>/CN=<someCN>,DC=<my>,DC=<domain>
ldap://<Host>/(|(OU=<someOU1>)(OU=<someOU2>)),DC=<my>,DC=<domain> (search filters here shouldn't work at all by definition)

(Ich bin ein Entwickler, kein AD/LDAP-Guru :) Verdammt, ich hatte fast 2 Tage lang überall nach dieser Lösung gesucht und beinahe aufgegeben, um mich an den Gedanken zu gewöhnen, dass ich dieses offensichtlich sehr häufige Szenario von Hand implementieren muss ( mit Jasperserver/Spring-Sicherheit (/ Tomcat)). (Dies soll also eine Erinnerung sein, wenn jemand anderes oder ich dieses Problem in Zukunft erneut haben sollten: O))

Hier sind einige andere verwandte Themen, die ich während meiner Recherche gefunden habe und die größtenteils wenig geholfen haben:

Und hier werde ich unsere anonymisierte Tomcat LDAP-Konfiguration bereitstellen, falls dies hilfreich sein sollte (/var/lib/Tomcat7/webapps/jasperserver/WEB-INF/applicationContext-externalAUTH-LDAP.xml):

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

<!-- ############ LDAP authentication ############ - Sample configuration 
    of external authentication via an external LDAP server. -->


<bean id="proxyAuthenticationProcessingFilter"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.BaseAuthenticationProcessingFilter">
    <property name="authenticationManager">
        <ref local="ldapAuthenticationManager" />
    </property>
    <property name="externalDataSynchronizer">
        <ref local="externalDataSynchronizer" />
    </property>

    <property name="sessionRegistry">
        <ref bean="sessionRegistry" />
    </property>

    <property name="internalAuthenticationFailureUrl" value="/login.html?error=1" />
    <property name="defaultTargetUrl" value="/loginsuccess.html" />
    <property name="invalidateSessionOnSuccessfulAuthentication"
        value="true" />
    <property name="migrateInvalidatedSessionAttributes" value="true" />
</bean>

<bean id="proxyAuthenticationSoapProcessingFilter"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.DefaultAuthenticationSoapProcessingFilter">
    <property name="authenticationManager" ref="ldapAuthenticationManager" />
    <property name="externalDataSynchronizer" ref="externalDataSynchronizer" />

    <property name="invalidateSessionOnSuccessfulAuthentication"
        value="true" />
    <property name="migrateInvalidatedSessionAttributes" value="true" />
    <property name="filterProcessesUrl" value="/services" />
</bean>

<bean id="proxyRequestParameterAuthenticationFilter"
    class="com.jaspersoft.jasperserver.war.util.ExternalRequestParameterAuthenticationFilter">
    <property name="authenticationManager">
        <ref local="ldapAuthenticationManager" />
    </property>
    <property name="externalDataSynchronizer" ref="externalDataSynchronizer" />

    <property name="authenticationFailureUrl">
        <value>/login.html?error=1</value>
    </property>
    <property name="excludeUrls">
        <list>
            <value>/j_spring_switch_user</value>
        </list>
    </property>
</bean>

<bean id="proxyBasicProcessingFilter"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.ExternalAuthBasicProcessingFilter">
    <property name="authenticationManager" ref="ldapAuthenticationManager" />
    <property name="externalDataSynchronizer" ref="externalDataSynchronizer" />

    <property name="authenticationEntryPoint">
        <ref local="basicProcessingFilterEntryPoint" />
    </property>
</bean>

<bean id="proxyAuthenticationRestProcessingFilter"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.DefaultAuthenticationRestProcessingFilter">
    <property name="authenticationManager">
        <ref local="ldapAuthenticationManager" />
    </property>
    <property name="externalDataSynchronizer">
        <ref local="externalDataSynchronizer" />
    </property>

    <property name="filterProcessesUrl" value="/rest/login" />
    <property name="invalidateSessionOnSuccessfulAuthentication"
        value="true" />
    <property name="migrateInvalidatedSessionAttributes" value="true" />
</bean>



<bean id="ldapAuthenticationManager" class="org.springframework.security.providers.ProviderManager">
    <property name="providers">
        <list>
            <ref local="ldapAuthenticationProvider" />
            <ref bean="${bean.daoAuthenticationProvider}" />
            <!--anonymousAuthenticationProvider only needed if filterInvocationInterceptor.alwaysReauthenticate 
                is set to true <ref bean="anonymousAuthenticationProvider"/> -->
        </list>
    </property>
</bean>

<bean id="ldapAuthenticationProvider"
    class="org.springframework.security.providers.ldap.LdapAuthenticationProvider">
    <constructor-arg>
        <bean
            class="org.springframework.security.providers.ldap.authenticator.BindAuthenticator">
            <constructor-arg>
                <ref local="ldapContextSource" />
            </constructor-arg>
            <property name="userSearch" ref="userSearch" />
        </bean>
    </constructor-arg>
    <constructor-arg>
        <bean
            class="org.springframework.security.ldap.populator.DefaultLdapAuthoritiesPopulator">
            <constructor-arg index="0">
                <ref local="ldapContextSource" />
            </constructor-arg>
            <constructor-arg index="1">
                <value></value>
            </constructor-arg>

            <property name="groupRoleAttribute" value="cn" />
            <property name="convertToUpperCase" value="true" />
            <property name="rolePrefix" value="ROLE_" />
            <property name="groupSearchFilter"
                value="(&amp;(member={0})(&amp;(objectCategory=Group)(objectclass=group)(cn=my-nested-group-name)))" />
            <property name="searchSubtree" value="true" />
            <!-- Can setup additional external default roles here <property name="defaultRole" 
                value="LDAP"/> -->
        </bean>
    </constructor-arg>
</bean>

<bean id="userSearch"
    class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
    <constructor-arg index="0">
        <value></value>
    </constructor-arg>
    <constructor-arg index="1">
        <value>(&amp;(sAMAccountName={0})(&amp;((objectCategory=person)(objectclass=user)(mail=*)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(memberOf:1.2.840.113556.1.4.1941:=CN=my-nested-group-name,OU=ou3,OU=ou2,OU=ou1,DC=dc3,DC=dc2,DC=dc1))))
        </value>
    </constructor-arg>
    <constructor-arg index="2">
        <ref local="ldapContextSource" />
    </constructor-arg>
    <property name="searchSubtree">
        <value>true</value>
    </property>
</bean>

<bean id="ldapContextSource"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.ldap.JSLdapContextSource">
    <constructor-arg value="ldap://myhost:3268/DC=dc3,DC=dc2,DC=dc1?cn" />
    <!-- manager user name and password (may not be needed) -->
    <property name="userDn" value="CN=someuser,OU=ou4,OU=1,DC=dc3,DC=dc2,DC=dc1" />
    <property name="password" value="somepass" />
    <!--End Changes -->
</bean>
<!-- ############ LDAP authentication ############ -->

<!-- ############ JRS Synchronizer ############ -->
<bean id="externalDataSynchronizer"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.ExternalDataSynchronizerImpl">
    <property name="externalUserProcessors">
        <list>
            <ref local="externalUserSetupProcessor" />
            <!-- Example processor for creating user folder -->
            <!--<ref local="externalUserFolderProcessor"/> -->
        </list>
    </property>
</bean>

<bean id="abstractExternalProcessor"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.processors.AbstractExternalUserProcessor"
    abstract="true">
    <property name="repositoryService" ref="${bean.repositoryService}" />
    <property name="userAuthorityService" ref="${bean.userAuthorityService}" />
    <property name="tenantService" ref="${bean.tenantService}" />
    <property name="profileAttributeService" ref="profileAttributeService" />
    <property name="objectPermissionService" ref="objectPermissionService" />
</bean>

<bean id="externalUserSetupProcessor"
    class="com.jaspersoft.jasperserver.api.security.externalAuth.processors.ExternalUserSetupProcessor"
    parent="abstractExternalProcessor">
    <property name="userAuthorityService">
        <ref bean="${bean.internalUserAuthorityService}" />
    </property>
    <property name="defaultInternalRoles">
        <list>
            <value>ROLE_USER</value>
        </list>
    </property>

    <property name="organizationRoleMap">
        <map>
            <!-- Example of mapping customer roles to JRS roles -->
            <entry>
                <key>
                    <value>ROLE_MY-NESTED-GROUP-NAME</value>
                </key>
                <!-- JRS role that the <key> external role is mapped to -->
                <value>ROLE_USER</value>
            </entry>
        </map>
    </property>
</bean>

<!--bean id="externalUserFolderProcessor" class="com.jaspersoft.jasperserver.api.security.externalAuth.processors.ExternalUserFolderProcessor" 
    parent="abstractExternalProcessor"> <property name="repositoryService" ref="${bean.unsecureRepositoryService}"/> 
    </bean -->

<!-- ############ JRS Synchronizer ############ -->
19

Die Antwort lautet NEIN, das kannst du nicht. Warum?

Weil der LDAP-Standard eine LDAP-SEARCH als eine Art Funktion mit 4 Parametern beschreibt:

  1. Der Knoten, an dem die Suche beginnen soll. Hierbei handelt es sich um einen eindeutigen Namen (Distinguish Name, DN).
  2. Die Attribute, die Sie zurückholen möchten
  3. Die Tiefe der Suche (Basis, einstufig, Teilbaum)
  4. Der Filter

Sie interessieren sich für den Filter. Sie haben eine Zusammenfassung hier (von Microsoft für Active Directory bereitgestellt, von einem Standard). Der Filter setzt sich auf boolesche Weise aus dem Ausdruck vom Typ Attribute Operator Value Zusammen.

Der von Ihnen angegebene Filter hat also keine Bedeutung.

Aus theoretischer Sicht gibt es ExtensibleMatch , das Buildind-Filter für den DN-Pfad zulässt, von Active Directory jedoch nicht unterstützt wird.

Soweit mir bekannt ist, müssen Sie in AD ein Attribut verwenden, um die Unterscheidung für Benutzer in den beiden Organisationseinheiten vorzunehmen.

Es kann sich um ein beliebiges vorhandenes Diskriminatorattribut handeln oder beispielsweise um das Attribut OU, das von der Klasse organizationalPerson geerbt wird. Sie können festlegen (es ist nicht automatisch und wird nicht beibehalten, wenn Sie die Benutzer verschieben), dass für einige Benutzer "staff" und für andere Benutzer "vendors" festgelegt wird, und sie verwenden den Filter:

(&(objectCategory=person)(|(ou=staff)(ou=vendors)))
14
JPBlanc

Es ist einfach. Ändern Sie einfach den Port. Verwenden Sie 3268 anstelle von 389. Wenn Ihr Domain-Name DOMAIN.LOCAL lautet, setzen Sie DC = DOMAIN, DC = LOKAL

Port 3268: Dieser Port wird für Abfragen verwendet, die speziell für den globalen Katalog bestimmt sind. An Port 3268 gesendete LDAP-Anforderungen können zum Durchsuchen von Objekten in der gesamten Gesamtstruktur verwendet werden. Es können jedoch nur die Attribute zurückgegeben werden, die für die Replikation in den globalen Katalog markiert sind.

Port 389: Dieser Port wird zum Anfordern von Informationen vom Domänencontroller verwendet. An Port 389 gesendete LDAP-Anforderungen können verwendet werden, um Objekte nur innerhalb der Stammdomäne des globalen Katalogs zu suchen. Die Anwendung kann jedoch alle Attribute gesuchter Objekte erhalten.

5
zied omrani

Ich denke nicht, dass dies mit AD möglich ist. Das Attribut distinguishedName ist das einzige, von dem ich weiß, dass es das OU-Element enthält, nach dem Sie suchen möchten. Sie benötigen daher einen Platzhalter, um Ergebnisse für Objekte unter diesen OUs zu erhalten. Leider wird das Platzhalterzeichen wird nicht unterstützt auf DNs.

Wenn möglich, würde ich dies in zwei Abfragen mit OU = Staff ... und OU = Vendors ... als Basis-DNs versuchen.

2
vinny

Nach einem Gespräch mit einem LDAP-Experten ist dies nicht möglich. Eine Abfrage kann nicht mehr als eine DC oder OU suchen.

Ihre Möglichkeiten sind:

  1. Führen Sie mehr als 1 Abfrage aus und analysieren Sie das Ergebnis.
  2. Verwenden Sie einen Filter, um die gewünschten Benutzer/Objekte anhand eines anderen Attributs wie einer AD-Gruppe oder anhand des Namens zu finden.
1
Philip Rego