FreeRADIUS mit EAP-PEAP und LDAP zur sicheren WLAN Authentifizierung

1. Beschreibung
Warum WPA2 Enterprise?
WPA2 Enterprise ermöglicht es jedem Benutzer eigene Zugangsdaten verwenden zu lassen, falls ein Benutzer keinen Zugriff mehr auf das WLAN Netzwerk haben soll, muss nur dessen Account deaktiviert werden. Bei einem Passphrase geschütztem WPA Netzwerk wäre hier der Austausch der Passphrase notwendig, welche man dann an alle bestehenden Nutzer erneut verteilen muss.

Warum EAP-PEAP?
EAP-PEAP ist dass EAP Verfahren,welches von den meisten Betriebsystemen direkt unterstützt wird. Allerdings ist die Auswahl der Passwort-Backends auf jene beschränkt, die die Passwörter im Klartext oder als NT-Hash speichern.
Eine Übersicht, welches EAP-Verfahren mit welcher Art der Passwortspeicherung funktioniert findet ihr hier:
Protocol and Password Compatibility

EAP-PEAP ist wie auch zum Beispiel EAP-TTLS ein sogenanntes 2 Phasen Verfahren, hierbei wird in der ersten Phase ein TLS-Tunnel zwischen dem WLAN Client und dem FreeRADIUS-Server aufgebaut.
In der zweiten Phase wird das Passwort MS-CHAPV2 verschlüsselt übertragen.

2. Konfiguration des FreeRADIUS Servers
Installation der Software
Auf dem Server werden die folgenden Pakete installiert:

apt-get install freeradius freeradius-ldap freeradius-utils

SSL Zertifikate erzeugen
Während der Installation werden zumindest unter Ubuntu und Debian sogenannte selbst signierte SnakeOil Zertifikate angelegt.
Diese SnakeOil Zertifikate eignen sich zum testen des Aufbaus, sollten aber vor der Inbetriebnahme durch Kaufzertifikate oder zumindest durch die Zertifikate einer eigenen CA ausgetauscht werden.

AccessPoints als Clients des FreeRADIUS-Server einrichten
Die AccessPoints werden in der Datei /etc/freeradius/clients.conf eingerichtet:

client {
secret = Passwort
shortname = Symbolischer Name
}

Den FreeRADIUS-Server auf EAP-PEAP konfigurieren
Die zu verwendende Verschlüsselungsmethode wird in der Datei /etc/freeradius/eap.conf eingerichtet:
Zuerst muss der Standard EAP-Typ eingestellt werden:

default_eap_type = peap

Für die TLS Konfiguration müssen das Server Zertifikat, der Private Key, die Diffie-Hellman Parameter und /dev/urandom als Zufallszahlengenerator angegeben werden:

tls {
private_key_file = /etc/freeradius/certs/radius-key.pem
certificate_file = /etc/freeradius/certs/radius-cert.pem
dh_file = /etc/freeradius/certs/dh.pem
random_file = /dev/urandom
cipher_list = "DEFAULT"
}

Die Diffie-Hellmann Parameter können mit diesem Befehl erzeugt werden:

openssl dhparam 2048 > /etc/freeradius/certs/dh.pem

Die EAP-PEAP Konfiguration sollte folgendes aussehen haben:

peap {
default_eap_type = mschapv2
virtual_server = "inner-tunnel"
}

Der Parameter virtual_server lädt die entsprechende Konfiguration für die Phase 2.

Verbindung zum OpenLDAP Server einrichten
Um den FreeRADIUS-Server an den LDAP Server anzubinden müssen die Verbindungsparameter und die entsprechenden LDAP-Filter in die Datei modules/ldap eingetragen werden:

ldap {
server = ldap.example.org
port = 636 # Oder 389 falls der LDAP-Server keine SSL gesicherten Verbindungen anbietet.
binddn = "cn=manager,dc=example,dc=org"
password = manager-password
basedn = "dc=example,dc=org"
filter = "(&(objectClass=posixAccount)(uid=%{%{Stripped-User-Name}:-%{User-Name}}))"
groupmembership_filter = "(&(objectClass=posixGroup)(memberUid=%{User-Name}))"
groupmembership_attribute = "cn=Gruppe,ou=Groups,dc=example,dc=org"
ldap_connections_number=5
dictionary_mapping = ${confdir}/ldap.attrmap
}

Typischerweise ist es nur einem administrativen Benutzer gestattet auf die NT-Hashes zuzugreifen, daher sollten die beiden Werte binddn und password angegeben werden.
Die LDAP Filter in diesem Beispiel müssen nicht unbedingt auf jedem LDAP Setup funktionieren, diese muss man dann an dass jeweiliges Schema anpassen.

Abschließend muß die Umsetzung zwischen den RADIUS und den LDAP Attributen in der Datei /etc/freeradius/ldap.attrmap konfiguriert werden.
Es sollten alle eventuell vorhandenen Attribute gelöscht werden, sodass die Datei die folgenden fünf Zeilen enthält:

checkItem $GENERIC$ radiusCheckItem
replyItem $GENERIC$ radiusReplyItem
checkItem LM-Password sambaLmPassword
checkItem NT-Password sambaNtPassword
checkItem SMB-Account-CTRL-Text acctFlags

3. Konfiguration der AccessPoints
Mittlerweile unterstützen die gängisten AccessPoints und WLAN-Router das RADIUS-Protokoll, hierbei sind immer folgende Angaben zu machen:

  1. IP-Adresse des RADIUS-Servers
  2. Der RADIUS-Server Port: 1812
  3. Das Shared Secret aus der clients.conf

Nun sollte man ein funktionsfähiges WPA2 Enterprise Setup besitzen, falls es zu Problemen kommt kann man den FreeRADIUS in einem ziemlich gesprächigem Modus starten:
freeradius -vv

RADIUS und EAP als Protokolle und FreeRADIUS als Software sind recht komplexe Themengebiete, also nicht gleich aufgeben falls etwas nicht klappt.

7 thoughts on “FreeRADIUS mit EAP-PEAP und LDAP zur sicheren WLAN Authentifizierung

  1. Hey,

    erstmal vielen Dank für deine Anleitung. Leider funktioniert diese bei meiner Anbindung ans ldap nicht…
    lediglich durch das anlegen von usern in der users-datei mit klartext passwörtern komme ich zu eiuner erfolgreichen verbindung.

    bei dem Versuch über einen ldap account die verbindung aufzubauen kommen immer die selben fehler.

    zum einen:
    [mschapv2] # Executing group from file /etc/freeradius/sites-enabled/inner-tunnel
    [mschapv2] +- entering group MS-CHAP {…}
    [mschap] No Cleartext-Password configured. Cannot create LM-Password.
    [mschap] No Cleartext-Password configured. Cannot create NT-Password.
    [mschap] Creating challenge hash with username: cslodczyk
    [mschap] Told to do MS-CHAPv2 for cslodczyk with NT-Password
    [mschap] FAILED: No NT/LM-Password. Cannot perform authentication.
    [mschap] FAILED: MS-CHAP2-Response is incorrect

    zum abnderen spircht er im moment das ldap auf keine weise an, dh der radius server gibt keine meldung im debugging aus, dass der ldap prüft….

    hast du vllt einen rat für mich?
    sämtliches googlen naxch lösungsansätzen läuft auf das selb ergebnis hinaus

    mfg Sloddi

    1. Hi Sloddi,

      was für ein LDAP-Server wird eingesetzt? Ein OpenLDAP?

      Kannst du aus dem LDAP einen LDIF erzeugen, der die Felder deines Schemata anzeigt?
      Eventuell sind die benötigten NT/LM-Password Felder einfach nicht vorhanden.

      MfG
      bommi

  2. Hey bommi,

    vielen Dank für deine fixe Antwort.
    Ich habe EAP-PEAP/MS-CHAPv2 nun verworfen und bin zu EAP-TTLS/PAP gewechselt. Hier funktioniert es reibungslos. Wie ich nun weiter gelesen habe scheint es daran zu liegen, dass PEAP nicht mit verschlüsselten Passwörtern klar kommt die im LDAP liegen. Wir haben leider kein ldaps in dem die Passwörter im Klartext vorhanden sind.

    EAP-TTLS/PAP sollte aber genauso gut funktionieren und sicher sein.
    Jetzt muss ichs nur noch schaffen dass auch Windows Notebooks den Spaß schlucken :D

    Mit Android, iOS und OS X funktioniert alles super…

    Nochmals vielen Dank für deine Hilfe!!!
    Vllt hast du ja zu dem Windows Problem noch eine Anmerkung ;-)
    Intel WLAN-Treiber sind aktuell und bieten EAP-TTLS, anderweitig habe ich es mit SecureW2 versuchtr was leider auch nicht von erfolg gekrönt war.

    mfg Sloddi

    1. Hi Sloddi,

      Probleme unter Windows sind meistens auf Zertifikate / die CA zurückzuführen.
      Entweder installierst du auf den Clients das CA Zertifikat und wählst es in der WLAN Software / den Windows-Settings aus, oder du deaktivierst die Zertifikatsprüfung komplett.

      Die CA Überprüfung bei EAP-TTLS/PAP zu deaktivieren ist typischerweise eine ganz schlechte Idee, da dass SSL/TLS der einzige Schutz für die in Phase2 übertragenen Klartextpasswörter ist.

      Was sagt dein freeradius.log wenn du dich mit dem Windows versuchst einzuloggen?

      Bei SSL/TLS Problemen sieht man solche Einträge im Log:

      Error: TLS Alert read:fatal:certificate unknown
      Error: TLS_accept: failed in SSLv3 read client certificate A
      Error: rlm_eap: SSL error error:14094416:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate unknown
      Error: SSL: SSL_read failed inside of TLS (-1), TLS session fails.
      Auth: Login incorrect (TLS Alert read:fatal:certificate unknown): [] (from client port 0 cli XX-XX-XX-XX-XX-XX)

      MfG
      bommi

      1. Hey,

        also hab zwei Probleme mit der Windows Authetifizierung….
        zum einen hängt das windows seltsamer weise zum einen die Domäne dran und zum anderen ein “5c”
        auswelchen Gründen auch immer?!

        (uid=DOMTWT\5cadmin-cslodczyk) sollte eiglt nur (uid=admin-cslodczyk) sein.

        [ldap] performing user authorization for DOMTWT\admin-cslodczyk
        [ldap] expand: %{Stripped-User-Name} ->
        [ldap] … expanding second conditional
        [ldap] expand: %{User-Name} -> DOMTWT\5cadmin-cslodczyk
        [ldap] expand: (uid=%{%{Stripped-User-Name}:-%{User-Name}}) -> (uid=DOMTWT\5cadmin-cslodczyk)
        [ldap] expand: ou=people,dc=nhs,dc=twt-gmbh,dc=de -> ou=people,dc=nhs,dc=twt-gmbh,dc=de
        [ldap] ldap_get_conn: Checking Id: 0
        [ldap] ldap_get_conn: Got Id: 0
        [ldap] performing search in ou=people,dc=nhs,dc=twt-gmbh,dc=de, with filter (uid=DOMTWT\5cadmin-cslodczyk)
        [ldap] object not found
        [ldap] search failed
        [ldap] ldap_release_conn: Release Id: 0
        ++[ldap] returns notfound
        ++[expiration] returns noop
        ++[logintime] returns noop
        [pap] WARNING! No “known good” password found for the user. Authentication may fail because of this.
        ++[pap] returns noop

        und zum anderen versucht der radius es nun mit peap obwohl ttls eingestellt ist und mit den smartphones und macs alles reibungsloss mit ttls funktioniert -.-

        # Executing group from file /etc/freeradius/sites-enabled/default
        +- entering group authenticate {…}
        [eap] Request found, released from the list
        [eap] EAP/peap
        [eap] processing type peap
        [peap] processing EAP-TLS
        TLS Length 37
        [peap] Length Included
        [peap] eaptls_verify returned 11
        [peap] <<< TLS 1.0 Alert [length 0002], fatal access_denied
        TLS Alert read:fatal:access denied
        [peap] WARNING: No data inside of the tunnel.
        [peap] eaptls_process returned 7
        [peap] EAPTLS_OK
        [peap] Session established. Decoding tunneled attributes.
        [peap] Peap state ?
        [peap] FAILED processing PEAP: Tunneled data is invalid.
        [eap] Handler failed in EAP/peap
        [eap] Failed in EAP select
        ++[eap] returns invalid
        Failed to authenticate the user.

        von Zertfikaten steht erstmal nichts im log.

        mfg Sloddi

  3. Hey bommi,

    ich nochmal, ich habe es mittlerweile gelöst.
    Meine eingerichtete verbindung mit dem neuen intel Treiber war falsch, daher hat er nicht die eintellungen beim Verbindungsaufbau übernommen.
    Habe nun alles richtig gestellt.
    Das einzigste was nun nervig, aber unerlässlich ist, ist die nachinstallation des aktuellen Intel WLAN Treibers für die Windows Notebooks. Bekomm ich aber auch wiei über ein skript gebacken, bestimmt… :D

    Was mich jetzt noch stutzig macht bei der ganzen Sache ist, ich habe jetzt 3 verschiedene notebooks getestet. Ein Dell, ein ThinkPad und ein HP. Und nur beim HP hat er gestreikt bis ich ihm endlich das Serverzertifikat installiert habe. Das Log hat demensprechend auch gejault dass er das Zertifikat nicht kennt. Die anderen zwei Modelle ohne installiertes Serverzertifikat hatten keine Probleme. Und so sollte es eigtl auch sein, da unser Firmen Cert auch von GeoTrust zertifiziert ist und eigtl daher bekannt sen sollte.

    naja sollte dies vermehrt auftretten roll ich das Zertifikat einfach ebenfalls auf!!!!

    Soweit von mir noch zur Info famit du nicht leer ausgehst ;-)

    Nochmals Vielen Dank für deine HIlfe!!!

    mfg Sloddi

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>