3. Packet Format
3. Packet Format (Format de paquet)
Exactement un paquet RADIUS est encapsulé dans le champ de données UDP [4], où le champ Port de destination UDP indique 1812 (décimal).
Lorsqu'une réponse est générée, les ports source et destination sont inversés.
Ce mémo documente le protocole RADIUS. Le déploiement initial de RADIUS a été effectué en utilisant le numéro de port UDP 1645, qui entre en conflit avec le service "datametrics". Le numéro de port officiellement attribué pour RADIUS est 1812.
Un résumé du format de données RADIUS est présenté ci-dessous. Les champs sont transmis de gauche à droite.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Code | Identifier | Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Authenticator |
| |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Attributes ...
+-+-+-+-+-+-+-+-+-+-+-+-+-
Code
Le champ Code est d'un octet et identifie le type de paquet RADIUS. Lorsqu'un paquet est reçu avec un champ Code invalide, il est rejeté silencieusement.
Les codes RADIUS (décimaux) sont attribués comme suit:
1 Access-Request
2 Access-Accept
3 Access-Reject
4 Accounting-Request
5 Accounting-Response
11 Access-Challenge
12 Status-Server (expérimental)
13 Status-Client (expérimental)
255 Réservé
Les codes 4 et 5 sont couverts dans le document RADIUS Accounting [5]. Les codes 12 et 13 sont réservés pour une utilisation possible, mais ne sont pas mentionnés davantage ici.
Identifier
Le champ Identifier est d'un octet et aide à faire correspondre les demandes et les réponses. Le serveur RADIUS peut détecter une demande en double si elle a la même adresse IP source du client et le même port UDP source et Identifier dans un court laps de temps.
Length
Le champ Length est de deux octets. Il indique la longueur du paquet incluant les champs Code, Identifier, Length, Authenticator et Attribute. Les octets en dehors de la plage du champ Length DOIVENT être traités comme du remplissage et ignorés à la réception. Si le paquet est plus court que ce qu'indique le champ Length, il DOIT être rejeté silencieusement. La longueur minimale est 20 et la longueur maximale est 4096.
Authenticator
Le champ Authenticator est de seize (16) octets. L'octet le plus significatif est transmis en premier. Cette valeur est utilisée pour authentifier la réponse du serveur RADIUS et est utilisée dans l'algorithme de masquage de mot de passe.
Request Authenticator
Dans les paquets Access-Request, la valeur Authenticator est un nombre aléatoire de 16 octets, appelé Request Authenticator. La valeur DEVRAIT être imprévisible et unique pendant la durée de vie d'un secret (le mot de passe partagé entre le client et le serveur RADIUS), car la répétition d'une valeur de demande en conjonction avec le même secret permettrait à un attaquant de répondre avec une réponse précédemment interceptée. Puisqu'il est prévu que le même secret PUISSE être utilisé pour s'authentifier auprès de serveurs dans des régions géographiques disparates, le champ Request Authenticator DEVRAIT présenter une unicité globale et temporelle.
La valeur Request Authenticator dans un paquet Access-Request DEVRAIT également être imprévisible, de peur qu'un attaquant ne trompe un serveur pour qu'il réponde à une demande future prédite, puis utilise la réponse pour se faire passer pour ce serveur auprès d'un futur Access-Request.
Bien que des protocoles tels que RADIUS soient incapables de protéger contre le vol d'une session authentifiée via des attaques d'écoute active en temps réel, la génération de demandes uniques et imprévisibles peut protéger contre un large éventail d'attaques actives contre l'authentification.
Le NAS et le serveur RADIUS partagent un secret. Ce secret partagé suivi du Request Authenticator est passé à travers un hachage MD5 unidirectionnel pour créer une valeur de condensé de 16 octets qui est XORée avec le mot de passe entré par l'utilisateur, et le résultat XORé est placé dans l'attribut User-Password du paquet Access-Request. Voir l'entrée pour User-Password dans la section sur les Attributs pour une description plus détaillée.
Response Authenticator
La valeur du champ Authenticator dans les paquets Access-Accept, Access-Reject et Access-Challenge est appelée Response Authenticator, et contient un hachage MD5 unidirectionnel calculé sur un flux d'octets constitué de: le paquet RADIUS, commençant par le champ Code, incluant l'Identifier, la Length, le champ Request Authenticator du paquet Access-Request, et les Attributs de réponse, suivis du secret partagé. C'est-à-dire, ResponseAuth = MD5(Code+ID+Length+RequestAuth+Attributes+Secret) où + dénote la concaténation.
Note administrative
Le secret (mot de passe partagé entre le client et le serveur RADIUS) DEVRAIT être au moins aussi grand et difficile à deviner qu'un mot de passe bien choisi. Il est préféré que le secret soit d'au moins 16 octets. Ceci est pour assurer une plage suffisamment large pour le secret afin de fournir une protection contre les attaques par recherche exhaustive. Le secret NE DOIT PAS être vide (longueur 0) car cela permettrait de falsifier trivialement les paquets.
Un serveur RADIUS DOIT utiliser l'adresse IP source du paquet UDP RADIUS pour décider quel secret partagé utiliser, afin que les demandes RADIUS puissent être proxifiées.
Lors de l'utilisation d'un proxy de transfert, le proxy doit être capable de modifier le paquet lorsqu'il passe dans chaque direction - lorsque le proxy transmet la demande, le proxy PEUT ajouter un attribut Proxy-State, et lorsque le proxy transmet une réponse, il DOIT retirer son attribut Proxy-State s'il en a ajouté un. Proxy-State est toujours ajouté ou retiré après tous les autres Proxy-States, mais aucune autre hypothèse concernant son emplacement dans la liste des attributs ne peut être faite. Puisque les réponses Access-Accept et Access-Reject sont authentifiées sur l'ensemble du contenu du paquet, le retrait de l'attribut Proxy-State invalide la signature dans le paquet - donc le proxy doit le re-signer.
Des détails supplémentaires sur l'implémentation du proxy RADIUS sont en dehors de la portée de ce document.