AD-Integration für WordPressAD-Integration for WordPress

There is a new ADI: Next ADI. You can download it from wordpress.org. You can get professional support for Next ADI on https://www.active-directory-wp.com/. ADI 1.x is not longer supported.

This page describes the WordPress-Plugin Active Directory Integration.

Why?

I needed a WordPress blog with Active Directory integration. Shouldn’t be too hard, I thought. Surely there must be a plugin out there that allows me to authenticate and preferrably also authorize users against an Active Directory. I can do just that with drupal after all. An existing plugin was soon found: Active Directory Authenticationby Jonathan Marc Bearak. It’s a great plugin and – after a bit of tweaking – it worked just fine. Unfortunately, I soon noticed that it lacked something vital: security! It was time for me to put some work in.

Security

Jonathan’s plugin did not facilitate encrypted communication between WordPress and the AD server. The adLDAP-Libraryused in the plugin does support LDAPS, but it’s very fiddly. To add insult to injury, the usage of LDAPS has been deprecated. START-TLS would have been a much better choice, but unfortunately the library didn’t support it. Damn! So in the end I had to go and modify adLDAP aswell. Now, if we start using AD for authentication in a public WordPress blog, it would usually be wide open to brute force attacks, but I managed to implement some functionality to avoid this. That just leaves us to use HTTPS for either the whole blog or just the login, so we can be sure that nothing will go wrong.

Functionality

Active Directory Integration enables the authentication and authorisation of WordPress users against an Active Directory, aswell as automatic registration and updating of users in WordPress. It is easy to install and configure: Just activate the plugin, add your domain controller and you’re done! But it can do a lot more.

  • Authenticate users against one or more AD server(s),
  • authorise users via group membership,
  • users that authenticate in the AD are registered and updated in WordPress,
  • assignment of WordPress roles based on AD groups,
  • secure communication with the AD server via TLS (recommended),
  • usage of non-standard ports for communication with AD servers,
  • protection against brute force attacks,
  • sends e-mails to users and/or administrators when a user account is blocked due to Brute-Force-Protection,
  • multilanguage backend (english and german already included),
  • „residue-free“ uninstall,
  • determine WP display name from AD attributes (sAMAccountName, displayName, description, SN, CN, givenName or mail).

Requirements

  • WordPress version 2.7.1 or above (only tested with 2.7.1 and 2.8.x, but it might work with 2.5.x or above)
  • PHP 5 (for utilization of the adLDAP-Library)
  • LDAP support (must be enabled on the server)
  • OpenSSL support (must be enabled on the server for TLS to work)

Installation

  1. Login to WP with administrative rights, for example as “admin”.
  2. Upload the active-directory-integration folder to the plugins directory, normally “wp-content/plugins”.
  3. Activate the plugin on the plugins page.
  4. Configure the plugin under “Settings > Active Directory Integration” and activate TLS if possible.
  5. Activate Admin-SSL-Mode by adding the following line
    define('FORCE_SSL_ADMIN', true);

    to the wp-config.php file, so passwords aren’t transmitted as plain-text.

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.

172 Gedanken zu “AD-Integration für WordPressAD-Integration for 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. The plugin doesn’t support SSO right now. But this feature is on our agenda.

  4. 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.

  5. 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

  6. 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.

  7. 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…

  8. 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

  9. 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!

  10. 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

  11. 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.

  12. 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

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

    Bis dann
    Christoph

  14. 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

  15. 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.

  16. Hi Christoph,

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

    Danke und Gruss

    Sascha

Die Kommentarfunktion ist geschlossen.