AD-Integration für WordPress

This post is also available in: English (Englisch)

Es gibt einen Nachfolger von ADI: Next ADI. Du kannst es auf wordpress.org herunterladen. Professionellen Support für Next ADI gibt es auf https://www.active-directory-wp.com/. ADI 1.x wird nicht länger unterstützt.
Diese Seiten beschreiben das WordPress-Plugin Active Directory Integration.

Warum?

Ich brauchte ein WordPress mit Active Directory Integration. Nichts leichter als das – dachte ich. Es wird doch bestimmt ein Plugin geben, dass es mir ermöglicht Benutzer gegebenüber einem Active Directory zu authentifizieren und am besten auch noch zu authorisieren. Mit drupal mache ich das schließlich auch. Ich habe dann auch tatsächlich ein entsprechendes Plugin gefunden: Active Directory Authenticationvon Jonathan Marc Bearak. Es ist ein tolles Plugin und nach kurzem herumspielen funktionierte es auch. Allerdings hatte ich ein riesiges Problem damit: Sicherheit! Und so musste ich dann selber ran.

Sicherheit

In Jonathans Plugin war eine verschlüsselte Kommunikation zwischen WordPress und dem AD Server nicht vorgesehen. Die benutzte adLDAP-Libraryunterstützt zwar LDAPS, aber das ganze ist sehr frickelig und LDAPS ist sowieso deprecated. Stattdessen sollte man START-TLS verwenden. Die Library unterstützt das allerdings nicht. Blöd! Also musste ich auch noch adLDAP anpassen. Wenn wir nun die Authentifizierung eines öffentlichen WordPress-Blogs mittels AD vornehmen, dann ist einer Brute-Force-Attacke Tür und Tor geöffnet. Somit habe ich eine Funktionalität implementiert, die dem einen Riegel vorschiebt. Wenn man nun noch HTTPS für das gesamte Blog oder zumindest den Login verwendet, können wir uns recht sicher sein, dass nichts schief geht.

Funktionalität

Active Directory Integration gestattet es WordPress Benutzer gegen eine Active Directory zu authentifizieren, authorisieren, sowie Benutzer automatisch in WordPress anzulegen und upzudaten. Das Plugin lässt sich sehr einfach installieren und konfigurieren. Einfach das Plugin aktivieren, Domain Controller eintragen und fertig! Allerdings kann man noch mehr damit anstellen.

  • Benutzer gegen einen oder mehrere AD Server authentifizieren,
  • Benutzer über Gruppenmitgliedschaft authorisieren,
  • Benutzer die sich am AD authentifizieren können in WordPress anlegen und updaten,
  • Zuweisung von WordPress-Rollen auf Basis von AD Gruppen,
  • sichere Kommunikation zum AD Server mittels TLS (empfohlen),
  • Benutzung von Nicht-Standard-Ports für die Kommunikation zu AD Servern,
  • Schutz vor Brute-Force-Attacken,
  • sendet E-Mails an Benutzer und/oder Administratoren, wenn eine Benutzerkonto durch den Brute-Force-Schutz gesperrt wurde,
  • Mehrsprachiges Backend (Englisch und Deutsch bereits enthalten),
  • „rückstandsloses“ Deinstallieren des Plugins,
  • setzen des Anzeigenamens aus AD Attributen (sAMAccountName, displayName, description, SN, CN, givenName oder mail).

Anforderungen

  • WordPress ab 2.7.1 (nur getestet mit 2.7.1 und 2.8.x, wahrscheinlich funktioniert es aber ab 2.5.x)
  • PHP 5 (wegen Verwendung der aktuellen adLDAP-Library)
  • LDAP Unterstützung (auf dem Server muss die LDAP Unterstützung aktiviert sein)
  • OpenSSL Unterstützung (damit TLS funktioniert, muss die OpenSSL Unterstützung auf dem Server aktiviert sein)

Download

Das Plugin kann von wordpress.orgheruntergeladen werden.

Installation

  1. Mit Administrationsrechten am WP anmelden, z.B. als Benutzer „admin“.
  2. Den Ordner active-directory-integration in den Plugins-Ordner hochladen, normalerweise ist das „wp-content/plugins“.
  3. Auf der Plugins-Seite das Plugin aktivieren.
  4. Unter „Einstellungen > Active Directory Integration“ das Plugin konfigurieren und dabei möglichst TLS aktivieren.
  5. Aktivieren des Admin-SSL-Modes durch hinzufügen der Zeile
    define('FORCE_SSL_ADMIN', true);

    zur wp-config.php damit die Kennwörter nicht im Klartext über das Netz gehen.

174 Gedanken zu „AD-Integration für WordPress

  1. Hallo André,
    die Unit Tests für ADI 2 laufen gegen PHP 7.0.3 und 7.0.7 ohne Probleme durch, ebenso funktioniert die Oberfläche ohne Probleme. Bei einer Migration nach ADI 2 sollte es also keine Probleme mit der PHP-Version geben.

    ADI wird nun von der NeosIT weiterentwickelt und ADI2 befindet sich kurz vor dem Release. ADI 1.x wird nicht mehr supported.

    Im NeosIT-Blog (https://neos-it.de/2016/05/presenting-active-directory-integration-2/) findest Du weitere Infos für die neue Version. Wir hoffen, dass wir in den nächsten Wochen die neue Website online stellen können. Der Quellcode an sich befindet sich im (produktiven) Beta-Status und kann unter https://github.com/NeosIT/active-directory-integration2 bezogen werden.

    Beste Grüße
    Christoph

  2. Hallo,
    wir haben das Plugin ebenfalls im Einsatz.
    Allerdings funktioniert dieses nicht mit der aktuellen PHP Version (PHP V7, fast-cgi, 64 Bit Variante). In der 5er Version von PHP funktioniert es einwandfrei.

    Wie sind die Pläne bzgl. eines Updates?

    VG
    André

  3. Hi Christoph

    Many thanks for the plugin – Really helpful.

    Two questions please:
    Now I’m using the plugin, there doesn’t seem to be any way of changing the password for users that only exist in WP. Is that expected behaviour?

    The second is more of a beg for a feature – Please, please, please can you add setting the profile picture from the AD user image?
    (Preferably by allowing choosing the attribute to be used from the list of all AD attributes not just the thumbnailphoto one in case we’re linking to an image file rather than keeping it in AD)

    Many thanks
    Paul

  4. Ist es nicht möglich einen Auto-Login über eine angepasste Apache-Konfiguration zu ermöglichen? Also den LDAP-Login direkt über Apache durchzureichen?

  5. The plugin doesn’t support SSO right now. But this feature is on our agenda.

  6. First of all..
    Thanks for the great plugin,

    I got the problem when try to login after bulk import, when first time login the wordress says that the password missmatch. Why it can be occur? When i try to reset the password through the Active Directory and bulk import again success to login, but I don’t want to do login with that way. Please help me.

  7. Hi Matt,
    this shouldn’t be very difficult, but I think the code in ADI wouldn’t be very helpful. Search for the method public function show_AD_attributes($user) in ad-integration.php (should be around line 1122.

    What I would do:
    1. get a list of all users (or iterate through them) http://codex.wordpress.org/Function_Reference/get_users
    2. get the meta data of each user http://codex.wordpress.org/Function_Reference/get_user_meta
    3. sort out the users disabled by ADI (if (get_user_meta($user_id, ‚adi_user_disabled‘, true)) { … )
    4. most of user meta data keys added by ADI have the prefix „adi_“

    Good luck
    Christoph

  8. Hi,

    First of, thank you for this plugin, it easy to use and configure.

    I just have one question.

    I like the feature you have for displaying AD Attributes on a user profile page, I was wondering can I take the code that generates that, an place it in a template.php file so I can display the information for all users in a single page, using it as a contact list or global directory type of page?

    I’m sure I can, do it, I was just after being pointed to the right direction for the actual blocks of code that I need to use.

  9. Hi, wir verwenden das Plugin für unser Intranet mit Single-Sign-On und um zusätzliche Benutzerdaten aus dem AD auszulesen (z.B. Abteilung)
    In der Hauptdomäne funktioniert alles wie gewünscht, aber Benutzer aus einer Subdomäne können sich nur authentifizieren, die AD-Daten werden nicht aktualisiert.

    Also:
    domain.local -> SSO funktioniert -> AD-Datenimport funktioniert
    sub.domain.local -> SSO funktioniert -> AD-Datenimport funktioniert nicht

    Sind Subdomänen im Bulk-Import einfach nur nicht vorgesehen, oder haben wir noch etwas nicht richtig konfiguriert?

    Gruß,
    Christian…

  10. Hi Andreas,
    please try to use another BaseDN first. Please build a BaseDN like „dc=mydomain,dc=internal“ and do not use an OU. Feel free to let me know if it works.

    Hallo Andreas,
    ich denke die BaseDN ist nicht korrekt. Zunächst solltest Du mal die OU weglassen. Außerdem ist die Domain wahrscheinlich falsch angegeben. Die BaseDN sollte eher so aussehen: „dc=mydomain,dc=internal“ oder wie immer deine interne AD-Domain aussieht.

    Gib mir Bescheid, ob das geholfen hat.

    Christoph

  11. Hi,
    I have a problem with configuring the OpenLDAP access correctly:

    I have an basic Openlpap running with the following content:

    dn: ou=People,dc=nodomain
    objectClass: organizationalUnit
    ou: People

    dn: ou=Groups,dc=nodomain
    objectClass: organizationalUnit
    ou: Groups

    dn: cn=miners,ou=Groups,dc=nodomain
    objectClass: posixGroup
    cn: miners
    gidNumber: 5000

    dn: uid=john,ou=People,dc=nodomain
    objectClass: inetOrgPerson
    objectClass: posixAccount
    objectClass: shadowAccount
    uid: john
    sn: Doe
    givenName: John
    cn: John Doe
    displayName: John Doe
    uidNumber: 10000
    gidNumber: 5000
    userPassword: johnldap
    gecos: John Doe
    loginShell: /bin/bash
    homeDirectory: /home/john

    In the Active Directory Integration Plugin configuration I configured:

    BaseDN: ou=People,dc=nodomain
    Account Suffix:,ou=People,dc=nodomain

    With this configuration I’m able to autheticate the user uid=john. The user uidjohn is then created in wordpress, but as you see in the log at the end of this post I don’t get al attributes from the ldap and of course thats not how it should work. Iwould expect that it works with the configuration

    BaseDN: ou=People,dc=nodomain
    Account Suffix:@nodomain

    But then I’m not able to autenticate neither with uid=john nor with john.

    What am I doing wrong here?
    Why is the account suffix @nodomain not working in the ldap?
    Why do I need to enter uid=john instead of john in the login for a first auth success?

    Help is very much appreciated,

    best regards
    Andreas

    [INFO] method authenticate() called
    [INFO] ——————————————
    PHP version: 5.5.6
    WP version: 4.0.9
    ADI version: 1.1.8
    OS Info : Windows NT 6.1 build 7601 (Windows 7 Business Edition Service Pack 1) i586
    Web Server : apache2handler
    adLDAP ver.: 3.3.2 EXTENDED (201302271401)
    ——————————————
    [INFO] LDAP paging: enabled
    [NOTICE] username: uid=john
    [NOTICE] password: **not shown**
    [INFO] Options for adLDAP connection:
    – account_suffix: ,ou=People,dc=nodomain
    – base_dn: ou=People,dc=nodomain
    – domain_controllers: 192.168.162.135
    – ad_port: 389
    – use_tls: 0
    – network timeout: 5
    [INFO] Checking domain controller ports:
    [INFO] – 192.168.162.135:389 – OK
    [NOTICE] adLDAP object created.
    [INFO] max_login_attempts: 0
    [NOTICE] trying account suffix „,ou=People,dc=nodomain“
    [NOTICE] Authentication successfull for „uid=john,ou=People,dc=nodomain“
    [NOTICE] cleaning up failed logins for user „uid=john“
    [DEBUG] ATTRIBUTES TO LOAD: Array
    (
    [0] => cn
    [1] => givenname
    [2] => sn
    [3] => displayname
    [4] => description
    [5] => mail
    [6] => samaccountname
    [7] => userprincipalname
    [8] => useraccountcontrol
    )

    [DEBUG] USERINFO[0]:

    [NOTICE] Creating user ‚uid=john‘ with following data:
    – email :
    – first name :
    – last name :
    – display name : uid=john
    – account suffix:
    – role :
    [DEBUG] Setting random password.
    [NOTICE] – user_id :
    [FATAL] Error creating user.
    Error creating user!

  12. Hi Mauricio,
    have tried to turn on debugging (set define(‚WP_DEBUG‘, true); in wp-config.php)? Perhaps we get further information what is going wrong.

    Greetz
    Christoph

  13. All in a sudden Bulk import stop working. I am using AD Integration 1.1.8, WP 4.4, PHP 5.6.16 and IIS 7.5, Windows Server 2008 R2 SP1, OpenLDAP 20433.
    All my users are disabled after bulk import, what can it be wrong?

    [INFO] ————————————-
    START OF BULK IMPORT
    2016-01-13 / 15:21:18
    ————————————
    [INFO] Options for adLDAP connection:
    – base_dn: DC=MYDOMAIN,DC=CA
    – domain_controllers: srv-v-dc1.mydomain.ca
    – ad_username: vacanada\administrator
    – ad_password: **not shown**
    – ad_port: 389
    – use_tls: 1
    – network timeout: 5
    [NOTICE] adLDAP object created.
    [INFO] Domain Controller: srv-v-dom.vacanada.ca
    [ERROR] Error retrieving group members for group „App_Intranet_Group1“.
    [ERROR] Error retrieving group members for group „App_Intranet_Group2“.
    [INFO] Number of users to import/update: 553 (list generated in 1 seconds)
    [INFO] User „user1“ not found in Active Directory.
    [WARN] User „user1“ disabled.
    [INFO] User „user2“ not found in Active Directory.
    [WARN] User „user2“ disabled.
    [INFO] User „user3“ not found in Active Directory.
    [WARN] User „user3“ disabled.

    ….. and so on for all users ….

    [INFO] 0 Users added.
    [INFO] 0 Users updated.
    [INFO] In 17 seconds.
    [INFO] ————————————-
    END OF BULK IMPORT
    2016-01-13 / 15:21:35
    ————————————-
    Bulk Import returned no error.

  14. Hallo,
    hier nachzufragen ist vielleicht nicht der beste Weg, aber ich brauche dringend Hilfe. Ich habe für die Firma ein WP aufgesetzt, welches ich zur Zeiterfassung über eine Weboberfläche nutzen möchte. Eine Zeiterfassungs-DB haben wir bereits und ein AD sowieso. Als erstes möchte ich unser AD einbinden, damit sich jeder Nutzer mit seinen individuellen Benutzerdaten authentifizieren kann. Anschließend sollen die gebuchten Stunden von unserer Zeiterfassungs-DB ausgelesen und über die GUI ausgegeben werden (natürlich nur für den jeweiligen Nutzer). Für letzteres wollte ich vielleicht das Plugin Adminer nutzen, falls es funktioniert. Allerdings kenne ich mich nicht so wirklich damit aus und weiß nicht, wie ich genau anfangen soll.
    Könnt ihr mir dabei helfen?

    Liebe Grüße
    Annalena

  15. Hi Sascha,
    das ist toll. Wir melden uns bei Dir, sobald die Beta fertig ist.

    Bis dann
    Christoph

  16. Hi Mikael,
    perhaps we have a problem with your BaseDN. Please try to use „CN=Users,DC=company,DC=com“ or even „DC=company,DC=com“.

    Let us know, if it works with a changed BaseDN.

    Christoph

  17. I don’t get the first and last name from AD when using the plugin. First and last name is defined in AD and works for other systems. I am using Windows Server 2012. What is wrong? See below for debug info:

    AD Integration Logon Test

    openLDAP installed

    [INFO] method authenticate() called
    [INFO] ——————————————
    PHP version: 5.2.6
    WP version: 4.4.1
    ADI version: 1.1.8
    OS Info : Linux wpsrvr 2.6.27.5-117.fc10.x86_64 #1 SMP Tue Nov 18 11:58:53 EST 2008 x86_64
    Web Server : apache2handler
    adLDAP ver.: 3.3.2 EXTENDED (201302271401)
    ——————————————
    [INFO] LDAP paging: not available
    [NOTICE] username: username
    [NOTICE] password: **not shown**
    [INFO] Options for adLDAP connection:
    – account_suffix: @company.com
    – base_dn: CN=administrator,CN=Users,DC=company,DC=com
    – domain_controllers: 192.168.1.31;192.168.1.32
    – ad_port: 389
    – use_tls: 0
    – network timeout: 5
    [INFO] Checking domain controller ports:
    [INFO] – 192.168.1.31:389 – OK
    [INFO] – 192.168.1.32:389 – OK
    [NOTICE] adLDAP object created.
    [INFO] max_login_attempts: 3
    [INFO] users failed logins: 0
    [NOTICE] trying account suffix „@company.com“
    [NOTICE] Authentication successfull for „username@company.com“
    [NOTICE] cleaning up failed logins for user „username“
    [DEBUG] ATTRIBUTES TO LOAD: Array
    (
    [0] => cn
    [1] => givenname
    [2] => sn
    [3] => displayname
    [4] => description
    [5] => mail
    [6] => samaccountname
    [7] => userprincipalname
    [8] => useraccountcontrol
    [9] => lastlogon
    [10] => whencreated
    [11] => homephone
    [12] => otherhomephone
    [13] => adi_givenname
    [14] => adi_lastname
    )

    [DEBUG] USERINFO[0]:

    [NOTICE] Updating user „username“ with following data:
    – email : username@company.com
    – first name :
    – last name :
    – display name : username
    – account suffix:
    – role :
    [NOTICE] – user_id : 15
    [NOTICE] Setting local password to the one used for this login.
    [DEBUG] cn is empty. Local value of meta key adi_cn left unchanged.
    [DEBUG] givenname is empty. Local value of meta key adi_givenname left unchanged.
    [DEBUG] sn is empty. Local value of meta key adi_sn left unchanged.
    [DEBUG] displayname is empty. Local value of meta key adi_displayname left unchanged.
    [DEBUG] description is empty. Local value of meta key adi_description left unchanged.
    [DEBUG] mail is empty. Local value of meta key adi_mail left unchanged.
    [DEBUG] samaccountname is empty. Local value of meta key adi_samaccountname left unchanged.
    [DEBUG] userprincipalname is empty. Local value of meta key adi_userprincipalname left unchanged.
    [DEBUG] useraccountcontrol is empty. Local value of meta key adi_useraccountcontrol left unchanged.
    [DEBUG] lastlogon = January 1, 1601 / 5:30 am / type = timestamp / meta key = last_logon_time
    [DEBUG] whencreated = November 30, 1999 / 12:00 am / type = time / meta key = user_created_on

    [NOTICE] FINISHED

    User logged on.

  18. Hi Christoph,

    ja klar, gerne. Kannst mir die Beta zukommen lassen. Werde dir dann fleissig berichten, falls Fehler auftauchen.

    Danke und Gruss

    Sascha

Kommentare sind geschlossen.