3. Packet Format (Formato del Pacchetto)
3. Packet Format (Formato del Pacchetto)
Esattamente un pacchetto RADIUS è incapsulato nel campo UDP Data [4], dove il campo UDP Destination Port indica 1812 (decimale).
Quando viene generata una risposta, le porte di origine e destinazione vengono invertite.
Questo memo documenta il protocollo RADIUS. Il deployment iniziale di RADIUS è stato fatto utilizzando il numero di porta UDP 1645, che è in conflitto con il servizio "datametrics". Il numero di porta ufficialmente assegnato per RADIUS è 1812.
Un riepilogo del formato dati RADIUS è mostrato di seguito. I campi vengono trasmessi da sinistra a destra.
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
Il campo Code è un ottetto e identifica il tipo di pacchetto RADIUS. Quando viene ricevuto un pacchetto con un campo Code non valido, viene scartato silenziosamente.
I codici RADIUS (decimali) sono assegnati come segue:
1 Access-Request
2 Access-Accept
3 Access-Reject
4 Accounting-Request
5 Accounting-Response
11 Access-Challenge
12 Status-Server (sperimentale)
13 Status-Client (sperimentale)
255 Riservato
I codici 4 e 5 sono trattati nel documento RADIUS Accounting [5]. I codici 12 e 13 sono riservati per possibile utilizzo, ma non sono ulteriormente menzionati qui.
Identifier
Il campo Identifier è un ottetto e aiuta ad abbinare richieste e risposte. Il server RADIUS può rilevare una richiesta duplicata se ha lo stesso indirizzo IP di origine del client, porta UDP di origine e Identifier entro un breve lasso di tempo.
Length
Il campo Length è di due ottetti. Indica la lunghezza del pacchetto inclusi i campi Code, Identifier, Length, Authenticator e Attribute. Gli ottetti al di fuori dell'intervallo del campo Length DEVONO essere trattati come padding e ignorati alla ricezione. Se il pacchetto è più corto di quanto indica il campo Length, DEVE essere scartato silenziosamente. La lunghezza minima è 20 e la lunghezza massima è 4096.
Authenticator
Il campo Authenticator è di sedici (16) ottetti. L'ottetto più significativo viene trasmesso per primo. Questo valore viene utilizzato per autenticare la risposta dal server RADIUS ed è utilizzato nell'algoritmo di occultamento della password.
Request Authenticator
Nei pacchetti Access-Request, il valore Authenticator è un numero casuale di 16 ottetti, chiamato Request Authenticator. Il valore DOVREBBE essere imprevedibile e unico durante la vita di un segreto (la password condivisa tra il client e il server RADIUS), poiché la ripetizione di un valore di richiesta in combinazione con lo stesso segreto permetterebbe a un attaccante di rispondere con una risposta precedentemente intercettata. Poiché è previsto che lo stesso segreto POSSA essere utilizzato per autenticarsi con server in regioni geografiche disparate, il campo Request Authenticator DOVREBBE mostrare unicità globale e temporale.
Il valore Request Authenticator in un pacchetto Access-Request DOVREBBE anche essere imprevedibile, affinché un attaccante non possa indurre un server a rispondere a una richiesta futura prevista, e quindi utilizzare la risposta per mascherarsi come quel server per un futuro Access-Request.
Sebbene protocolli come RADIUS siano incapaci di proteggere contro il furto di una sessione autenticata tramite attacchi di intercettazione attiva in tempo reale, la generazione di richieste uniche e imprevedibili può proteggere contro una vasta gamma di attacchi attivi contro l'autenticazione.
Il NAS e il server RADIUS condividono un segreto. Quel segreto condiviso seguito dal Request Authenticator viene passato attraverso un hash MD5 unidirezionale per creare un valore digest di 16 ottetti che viene messo in XOR con la password inserita dall'utente, e il risultato dell'XOR viene inserito nell'attributo User-Password nel pacchetto Access-Request. Vedere la voce per User-Password nella sezione sugli Attributi per una descrizione più dettagliata.
Response Authenticator
Il valore del campo Authenticator nei pacchetti Access-Accept, Access-Reject e Access-Challenge è chiamato Response Authenticator e contiene un hash MD5 unidirezionale calcolato su un flusso di ottetti costituito da: il pacchetto RADIUS, a partire dal campo Code, inclusi l'Identifier, la Length, il campo Request Authenticator dal pacchetto Access-Request e gli Attributi di risposta, seguito dal segreto condiviso. Cioè, ResponseAuth = MD5(Code+ID+Length+RequestAuth+Attributes+Secret) dove + denota concatenazione.
Administrative Note (Nota Amministrativa)
Il segreto (password condivisa tra il client e il server RADIUS) DOVREBBE essere almeno grande e non indovinabile quanto una password ben scelta. È preferibile che il segreto sia di almeno 16 ottetti. Questo per garantire un intervallo sufficientemente ampio affinché il segreto fornisca protezione contro attacchi di ricerca esaustiva. Il segreto NON DEVE essere vuoto (lunghezza 0) poiché ciò permetterebbe ai pacchetti di essere falsificati in modo banale.
Un server RADIUS DEVE utilizzare l'indirizzo IP di origine del pacchetto UDP RADIUS per decidere quale segreto condiviso utilizzare, in modo che le richieste RADIUS possano essere inoltrate tramite proxy.
Quando si utilizza un proxy di inoltro, il proxy deve essere in grado di alterare il pacchetto mentre passa attraverso in ciascuna direzione - quando il proxy inoltra la richiesta, il proxy PUÒ aggiungere un attributo Proxy-State, e quando il proxy inoltra una risposta, DEVE rimuovere il suo attributo Proxy-State se ne ha aggiunto uno. Proxy-State viene sempre aggiunto o rimosso dopo qualsiasi altro Proxy-State, ma non si possono fare altre assunzioni sulla sua posizione nell'elenco degli attributi. Poiché le risposte Access-Accept e Access-Reject sono autenticate sull'intero contenuto del pacchetto, la rimozione dell'attributo Proxy-State invalida la firma nel pacchetto - quindi il proxy deve firmarlo nuovamente.
Ulteriori dettagli sull'implementazione del proxy RADIUS sono al di fuori dello scopo di questo documento.