In diesem Dokument werden zwei RADIUS-Sicherheitsmechanismen beschrieben:
In diesem Dokument werden diese Sicherheitsmechanismen, ihre Verwendung und der Zeitpunkt beschrieben, an dem ein Validierungsfehler zu erwarten ist.
Gemäß RFC 2865 ist der Authentifizierer-Header 16 Byte lang. Wenn sie in einer Access-Request verwendet wird, wird sie als Anforderungsauthentifizierer bezeichnet. Wenn sie in einer beliebigen Antwort verwendet wird, wird sie als Antwortauthentifizierer bezeichnet. Es wird verwendet für:
Wenn der Server mit dem richtigen Antwortauthentifizierer antwortet, kann der Client berechnen, ob diese Antwort auf eine gültige Anfrage zurückzuführen ist.
Der Client sendet die Anforderung mit dem zufälligen Authentifizierer-Header. Anschließend berechnet der Server, der die Antwort sendet, den Response-Authentifizierer mithilfe des Anforderungspakets zusammen mit dem freigegebenen geheimen Schlüssel:
ResponseAuth = MD5(Code + ID + Length + RequestAuth + Attributes + Secret)
Der Client, der die Antwort empfängt, führt den gleichen Vorgang aus. Wenn das Ergebnis identisch ist, ist das Paket richtig.
Der Validierungsfehler tritt auf, wenn der Switch die Anforderung nicht mehr zwischenspeichert (z. B. aufgrund eines Timeouts). Sie können es auch erleben, wenn der gemeinsame geheime Schlüssel ungültig ist (ja - Access-Reject beinhaltet auch diesen Header). Auf diese Weise kann das Netzwerkzugriffsgerät (Network Access Device, NAD) die gemeinsame geheime Diskrepanz erkennen. In der Regel werden sie von den Clients/Servern für Authentifizierung, Autorisierung und Abrechnung (Authentication, Authorization, Accounting - AAA) als Übereinstimmung mit einem gemeinsamen Schlüssel gemeldet, aber die Details werden nicht offen gelegt.
Der Authentifizierer-Header wird auch verwendet, um das Senden des User-Password-Attributs im Klartext zu vermeiden. Zuerst wird die Message Digest 5 (MD5 - secret, Authentifizierer) berechnet. Anschließend werden mehrere XOR-Operationen mit den Chunks des Kennworts ausgeführt. Diese Methode ist anfällig für Offline-Angriffe (Regenbogentabellen), da MD5 nicht mehr als sicherer Einwegalgorithmus wahrgenommen wird.
Hier ist das Python-Skript, das das Benutzerkennwort berechnet:
def Encrypt_Pass(password, authenticator, secret):
m = md5()
m.update(secret+authenticator)
return "".join(chr(ord(x) ^ ord(y)) for x, y in zip(password.ljust
(16,'\0')[:16], m.digest()[:16]))
Wenn eines der Attribute in der RADIUS Access-Request geändert wurde (z. B. RADIUS-ID, Benutzername usw.), sollte das neue Authentifiziererfeld generiert und alle anderen davon abhängigen Felder neu berechnet werden. Wenn es sich um eine erneute Übertragung handelt, sollte sich nichts ändern.
Die Bedeutung des Authentifizierer-Headers unterscheidet sich für eine Access-Request und eine Accounting-Request.
Bei einer Access-Request wird der Authenticator nach dem Zufallsprinzip generiert, und es wird erwartet, dass er eine Antwort mit dem ResponseAuthenticator erhält, der korrekt berechnet wurde. Dies belegt, dass die Antwort auf diese spezifische Anforderung zutrifft.
Bei einer Accounting-Request ist der Authentifizierer nicht zufällig, sondern wird berechnet (gemäß RFC 2866):
RequestAuth = MD5(Code + ID + Length + 16 zero octets + Attributes + Secret)
Auf diese Weise kann der Server die Accounting-Nachricht sofort überprüfen und das Paket verwerfen, wenn der neu berechnete Wert nicht mit dem Authenticator-Wert übereinstimmt. Die Identity Services Engine (ISE) gibt Folgendes zurück:
11038 RADIUS Accounting-Request header contains invalid Authenticator field
Der Grund hierfür ist in der Regel der falsche gemeinsame geheime Schlüssel.
Das Message-Authenticator-Attribut ist das in RFC 3579 definierte RADIUS-Attribut. Es wird für einen ähnlichen Zweck verwendet: zur Unterzeichnung und Validierung. Dieses Mal wird es jedoch nicht zur Validierung einer Antwort, sondern einer Anforderung verwendet.
Der Client, der eine Access-Request sendet (es kann auch ein Server sein, der mit einer Access-Challenge antwortet) berechnet den Hash-Based Message Authentication Code (HMAC)-MD5 aus seinem eigenen Paket und fügt dann das Message-Authenticator-Attribut als Signatur hinzu. Anschließend kann der Server überprüfen, ob er die gleiche Operation ausführt.
Die Formel ähnelt dem Authentifizierer-Header:
Message-Authenticator = HMAC-MD5 (Type, Identifier, Length, Request Authenticator,
Attributes)
Die HMAC-MD5-Funktion verwendet zwei Argumente:
Der Message-Authenticator MUSS für jedes Paket verwendet werden, das die Extensible Authentication Protocol (EAP)-Nachricht (RFC 3579) enthält. Dies schließt sowohl den Client ein, der die Zugriffsanfrage sendet, als auch den Server, der mit der Access-Challenge antwortet. Wenn die Validierung fehlschlägt, sollte das Paket auf der anderen Seite stumm gelöscht werden.
Validierungsfehler treten auf, wenn der gemeinsam verwendete geheime Schlüssel ungültig ist. Dann kann der AAA-Server die Anforderung nicht validieren.
Die ISE berichtet:
11036 The Message-Authenticator Radius Attribute is invalid.
Dies geschieht in der Regel zu einem späteren Zeitpunkt, wenn die EAP-Nachricht angehängt wird. Das erste RADIUS-Paket der 802.1x-Sitzung enthält die EAP-Nachricht nicht. Es gibt kein Meldungsauthentifiziererfeld, und es ist nicht möglich, die Anfrage zu überprüfen. In diesem Stadium kann der Client jedoch die Antwort mithilfe des Felds "Authentifizierer" validieren.
Im folgenden Beispiel wird veranschaulicht, wie Sie den Wert manuell zählen, um sicherzustellen, dass er korrekt berechnet wird.
Die Paketnummer 30 (Access-Request) wurde ausgewählt. Es befindet sich in der Mitte der EAP-Sitzung, und das Paket enthält das Feld "Message-Authenticator" (Meldungsauthentifizierung). Ziel ist es, die Richtigkeit der Nachrichtenauthentifizierung zu überprüfen:
pluton # cat packet30-clear-msgauth.bin | openssl dgst -md5 -hmac 'cisco'
(stdin)= 01418d3b1865556918269d3cf73608b0
Dasselbe kann mit dem Python-Skript berechnet werden:
pluton # cat hmac.py
#!/usr/bin/env python
import base64
import hmac
import hashlib
f = open('packet30-clear-msgauth.bin', 'rb')
try:
body = f.read()
finally:
f.close()
digest = hmac.new('cisco', body, hashlib.md5)
d=digest.hexdigest()
print d
pluton # python hmac.py
01418d3b1865556918269d3cf73608b0
Im vorherigen Beispiel wird veranschaulicht, wie das Feld Message-Authenticator aus der Access-Request berechnet wird. Bei Access-Challenge, Access-Accept und Access-Reject ist die Logik identisch, aber es ist wichtig, daran zu denken, dass der Request Authenticator verwendet werden soll, der im vorherigen Access-Request-Paket bereitgestellt wird.
Überarbeitung | Veröffentlichungsdatum | Kommentare |
---|---|---|
1.0 |
20-Jan-2016 |
Erstveröffentlichung |