Apache gegen mehrere Verzeichnisse authentifizieren

Ich verwalte einen Server der gegen zwei unterschiedliche Verzeichnisse autorisiert, einmal gegen Active Directory und einmal gegen einen lokalen LDAP-Server. Im lokalen LDAP-Server werden Accounts von Projektpartnern angelegt die nicht direkt ins AD sollen.

Dazu wurde bisher gegen Atlassian Crowd authentifiziert, da die Applikationen auf dem Server hauptsächlich von Atlassian sind und ebenfalls gegen Crowd authentifizieren.

Der Server ist nun etwas in die Jahre gekommen und muss dringend erneuert werden. Ein Problem dabei ist, dass der Crowd Connector für Apache seit 2014 End of Life ist, mit Apache 2.4 nicht mehr funktioniert, und mich die von der Community weiterentwickelten Projekte nicht ausreichend überzeugen dass ich sie auf einem wichtigen Produktivserver einsetzen möchte.

Auf meiner Suche nach Alternativen bin ich mehr oder weniger zufällig darüber gestolpert, dass man in der Apache Config Aliase für AuthProvider anlegen kann. Nach einem bisschen herumprobieren war ich dann mit der folgenden Konfiguration erfolgreich:

LDAPConnectionPoolTTL 0

<AuthnProviderAlias ldap ad>
    AuthLDAPBindDN "user@example.com"
    AuthLDAPBindPassword "secret"
    AuthLDAPUrl ldaps://dc.example.com/dc=ad,dc=example,dc=com?sAMAccountName?sub?(&(objectclass=user)(!(objectclass=computer)))
    LDAPReferrals Off
</AuthnProviderAlias>

<AuthnProviderAlias ldap local-ldap>
    AuthLDAPBindDN cn=crowd,dc=server,dc=example,dc=com
    AuthLDAPBindPassword secret
    AuthLDAPURL ldap://server.example.com/dc=server,dc=example,dc=com?mail?sub?(objectclass=inetorgperson)
</AuthnProviderAlias>

<Location "/">
  AuthName "Geschützter Bereich"
  AuthType Basic
  AuthBasicProvider ad local-ldap
  <RequireAny>
    Require valid-user
    Require local
    Require ip 1.2.3.4
  </RequireAny>
</Location>

Hier definiere ich zwei AuthProvider, die ich dann hinterher im Location Block angeben kann. Beim AD ist die Direktive LDAPReferrals Off wichtig, über LDAPConnectionPoolTTL hatte ich bereits gebloggt.

Die Authentifizierung wird an die Atlassian-Applikationen durchgereicht, die direkte Kommunikation mit Crowd ist damit nicht mehr nötig.

Confluence Seite mit Unterseiten in anderen Space kopieren [Update]

Confluence bietet zwar die Möglichkeit einzelne Seiten in andere Spaces zu kopieren, aber dabei bleiben Anhänge und Unterseiten auf der Strecke. Mit dem Atlassian Command Line Interface lassen sich eine Menge netter Befehle auf der Kommandozeile ausführen, darunter auch dieser:

./confluence.sh -s https://server.local/confluence/ -u username -p secret \
-a copyPage --space currentSpace --title pageTitle --newSpace newSpace \
--parent newParentPage --descendents --copyAttachments --copyComments --copyLabels

Der Befehl verbindet sich mit dem Server und kopiert die Seite pageTitle im Space currentSpace mit all ihren Unterseiten, Dateianhängen und Kommentaren in den Space newSpace als Unterseite von newParentPage.

Die aktuelle Version des Command Line Interface kostet zwar mittlerweile Geld, die letzte freie Version (unter BSD Lizenz) ist jedoch immer noch zum Download verfügbar und kann auch schon eine ganze Menge.

Quelle: (The pain of) managing content in Confluence

Ergänzung 29.10.2012

Mit der hier beschriebenen Methode konnte ich die meisten Seiten migrieren, leider gab es in einem Punkt Probleme: Die Confluence Remote Schnittstelle kommt mit dem Upload von größeren Dateien nicht klar, die Grenze scheint irgendwo bei 5MB oder so zu liegen. Der Fehler ist bereits seit einem Jahr bekannt, hier hat sich jedoch noch nichts getan.

Dafür hat mich die Dokumentation von Confluence zum Löschen von Seiten auf eine Idee gebracht:

  • Seite aus dem alten Space in einen neuen, temporären Space 1 verschieben
  • temporären Space kopieren
  • Seite aus temporärem Space 1 zurück in den alten Space verschieben
  • Seite aus temporärem Space 2 in den Ziel-Space verschieben
  • beide temporäre Spaces löschen

Die Prozedur habe ich noch nicht getestet, ich sehe allerdings keinen Grund wieso es nicht funktionieren sollte.