FreeRADIUS
|  (checkpoint) |  (checkpoint) | ||
| 211. sor: | 211. sor: | ||
| '''Value:''' | '''Value:''' | ||
| − | Mérete lehet nulla is. Vagy több byte is. | + | |
| + | Nulla vagy több byte, az attribútum értékét tartalmazza. | ||
| Típusai: | Típusai: | ||
| 220. sor: | 220. sor: | ||
| * time 32 bit (unix time: 1970. január 1. UTC 00:00:00 óta eltelt másodpercek) | * time 32 bit (unix time: 1970. január 1. UTC 00:00:00 óta eltelt másodpercek) | ||
| + | === RADIUS hitelesítés lépései === | ||
| − | '''RADIUS hitelesítés lépései:''' | + | [[Kép:radius2.gif||center]] | 
| − | <center> | ||
| − | [[Kép:radius2.gif]] | ||
| − | </center> | ||
| − | '''Lépések:''' | + | # NAS - Access-Request | 
| + | #* Code=Access-Request | ||
| + | #* Authenticator=NAS által generált random szám | ||
| + | #* Attribútumok: User-Name, User-Password | ||
| + | #** Password titkosítva=MD5(NASAuth,Secret) XOR Password | ||
| + | # RADIUS - Access-Accept vagy Access-Reject | ||
| + | #* Code= Access-Accept vagy Access-Reject | ||
| + | #* Authenticator=MD5(Code,ID,Length,NASAuth,Attributes,Secret) | ||
| + | #* Attribútomok (pl.: jogok, protokoll, stb) (opcionális) | ||
| − | '''1.''' NAS - Access-Request | + | === RADIUS naplózás lépései === | 
| − | * Code=Access-Request | ||
| − | * Authenticator=NAS által generált random szám | ||
| − | * Attributumok: User-Name, User-Password | ||
| − | Password titkosítva=MD5(NASAuth,Secret) XOR Password | ||
| − | '''2.''' RADIUS - Access-Accept vagy Access-Reject | + | # NAS - Accounting-Request | 
| − | * Code= Access-Accept vagy Access-Reject | + | #* Code=Accounting-Request | 
| − | * Authenticator=MD5(Code,ID,Length,NASAuth,Attributes,Secret) | + | #* Authenticator=MD5(Code,Identifier,Length,16 zero octets,request attributes,shared secret) | 
| − | * Attributomok (pl.: jogok, protokoll, stb) (opcionális) | + | #* Attribútumok | 
| − | + | # RADIUS - Accounting-Response | |
| − | '''RADIUS naplózás lépései:''' | + | #* Code=Accounting-Response | 
| − | + | #* Authenticator=MD5(Code,Identifier,Length,Request Authenticator,Secret) | |
| − | '''1.''' NAS - Accounting-Request | ||
| − | * Code=Accounting-Request | ||
| − | * Authenticator=MD5(Code,Identifier,Length,16 zero octets,request attributes,shared secret) | ||
| − | * Attributumok | ||
| − | |||
| − | '''2.''' RADIUS - Accounting-Response | ||
| − | * Code=Accounting-Response | ||
| − | * Authenticator=MD5(Code,Identifier,Length,Request Authenticator,Secret) | ||
| == Beállítás == | == Beállítás == | ||
| − | Forrásból telepített FreeRADIUS könyvtár szerkezete: | + | Forrásból telepített FreeRADIUS könyvtár alkönyvtárai: | 
| − |  bin | + | <pre> | 
| − |  etc | + |  bin/ | 
| − |  include | + |  etc/ | 
| − |  lib | + |  include/ | 
| − |  man | + |  lib/ | 
| − |  sbin | + |  man/ | 
| − |  share | + |  sbin/ | 
| − |  var | + |  share/ | 
| − | + |  var/ | |
| + | </pre> | ||
| − | A konfig fájlok alapértelmezésben a etc/raddb könyvtárban vannak. A konfig fájlok listája: | + | A konfigurációs fájlok alapértelmezés szerint az <tt>etc/raddb</tt> könyvtárban vannak. A fájlok listája: | 
| + | <pre> | ||
|  acct_users |  acct_users | ||
|  attrs |  attrs | ||
| 281. sor: | 282. sor: | ||
|  sqlippool.conf |  sqlippool.conf | ||
|  users |  users | ||
| + | </pre> | ||
| − | A listából is látszik, hogy mennyire moduláris a konfigurációja. A fő konfigurációs fájl a radiusd.conf, ez töltődik be alapból, és tölti be a szükséges többi konfigurációs fájlt. | + | A listából is látszik, hogy mennyire moduláris a konfiguráció. A fő konfigurációs fájl a <tt>radiusd.conf</tt>; ez töltődik be alapból, és tölti be a szükséges többi konfigurációs fájlt. | 
| − | |||
| − | Radiusd.conf fájlból részletek: | ||
| + | Néhány <tt>radiusd.conf</tt>-részlet: | ||
| + | <pre> | ||
|  prefix = /usr/local/freeradius-1.1.7 |  prefix = /usr/local/freeradius-1.1.7 | ||
|  exec_prefix = ${prefix} |  exec_prefix = ${prefix} | ||
| 296. sor: | 300. sor: | ||
|  log_file = ${logdir}/radius.log |  log_file = ${logdir}/radius.log | ||
|  pidfile = ${run_dir}/radiusd.pid |  pidfile = ${run_dir}/radiusd.pid | ||
| − | + | # ilyen userként és groupként fog futni: | |
| − | Amivel futni fog a RADIUS szerver. | ||
|  user = nobody |  user = nobody | ||
|  group = nobody |  group = nobody | ||
| − | + | # melyik IP-n figyeljen: | |
| − | IP címe a szervernek: | + |  bind_address = 152.66.x.y | 
| − |  bind_address = 152.66.208.218 | + | # állítsuk be a modulokat. | 
| − | + | # proxy: | |
| − | Modulok beállítása következik. | ||
| − | |||
| − | Proxy: | ||
|  proxy_requests  = yes |  proxy_requests  = yes | ||
|  $INCLUDE  ${confdir}/proxy.conf |  $INCLUDE  ${confdir}/proxy.conf | ||
| − | + | # kliensek (NAS-ok): | |
| − | kliensek: | ||
|  $INCLUDE  ${confdir}/clients.conf |  $INCLUDE  ${confdir}/clients.conf | ||
| − | + | # Unix /etc/passwd alapú hitelesítés: | |
| − | Unix /etc/passwd alapú hitelesítés: | ||
|  unix { |  unix { | ||
|    passwd = /etc/passwd |    passwd = /etc/passwd | ||
|  } |  } | ||
| − | + | # AAA metódus előtt elvégzett műveletek pl.: IPcím-ellenőrzés | |
| − | AAA metódus előtt elvégzett műveletek pl.: IP cím ellenőrzés | ||
|     preprocess { |     preprocess { | ||
|           huntgroups = ${confdir}/huntgroups |           huntgroups = ${confdir}/huntgroups | ||
|           hints = ${confdir}/hints |           hints = ${confdir}/hints | ||
|     } |     } | ||
| − | + | # LDAP: | |
| − | LDAP: | ||
|   ldap { |   ldap { | ||
|      server = "ldap.your.domain" |      server = "ldap.your.domain" | ||
| 332. sor: | 336. sor: | ||
|      ldap_connections_number = 5 |      ldap_connections_number = 5 | ||
|    } |    } | ||
| − | + | # felhasználók megadása: | |
| − | felhasználók megadása: | ||
|   files { |   files { | ||
|      usersfile = ${confdir}/users |      usersfile = ${confdir}/users | ||
| 338. sor: | 342. sor: | ||
|      preproxy_usersfile = ${confdir}/preproxy_users |      preproxy_usersfile = ${confdir}/preproxy_users | ||
|   } |   } | ||
| − | + | # Naplózás: | |
| − | Naplózás: | ||
|   detail { |   detail { | ||
|      detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d |      detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d | ||
| 368. sor: | 372. sor: | ||
|                 '%{reply:Packet-Type}', '%S');" |                 '%{reply:Packet-Type}', '%S');" | ||
|        } |        } | ||
| + | </pre> | ||
| A már megismert AAA metódus kerül megint elő. Egyenként tudjuk megadni, hogy melyik modult akarjuk használni. | A már megismert AAA metódus kerül megint elő. Egyenként tudjuk megadni, hogy melyik modult akarjuk használni. | ||
| Az Auth-Type beállításnál csak az ott megadott modult használja, és nem próbálja meg a többi felsorolt modult használni. | Az Auth-Type beállításnál csak az ott megadott modult használja, és nem próbálja meg a többi felsorolt modult használni. | ||
| + | <pre> | ||
|  authorize { |  authorize { | ||
|      file |      file | ||
| 408. sor: | 414. sor: | ||
|         post_proxy_log |         post_proxy_log | ||
|     } |     } | ||
| + | </őre> | ||
| A preacct a naplózás előtt elvégzendő műveletek pl.: egyedi kulcsot generál a felhasználónak key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port" | A preacct a naplózás előtt elvégzendő műveletek pl.: egyedi kulcsot generál a felhasználónak key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port" | ||
| − | A post-auth az eredményesen hitelesített felhasználók utólagos műveleteit tartalmazza pl.: IP cím osztás. Vagy a nem eredményesen hitelesített felhasználók a "Post-Auth-Type REJECT" magadott modullal mégpróbálkozik hitelsíteni a RADIUS. | + | A post-auth az eredményesen hitelesített felhasználók utólagos műveleteit tartalmazza pl.: IPcím-osztás. Vagy a nem eredményesen hitelesített felhasználókat a "Post-Auth-Type REJECT"-nél megadott modullal még megpróbálja hitelsíteni a RADIUS. | 
| − | A pre-proxy és post-proxy a RADIUS-Proxy előtt és után elvégzett modulokat lehet megadni. | + | A pre-proxynál és post-proxynál a RADIUS-Proxy előtt és után elvégzett modulokat lehet megadni. | 
| Azonosításnál mindenképpen használt modulok: clients, realms, huntgroups, users.  | Azonosításnál mindenképpen használt modulok: clients, realms, huntgroups, users.  | ||
| 421. sor: | 428. sor: | ||
| A NAS beállításait lehet megadni: IP, secret, nastype.  | A NAS beállításait lehet megadni: IP, secret, nastype.  | ||
| − | Támogatott nastype: | + | Támogatott NAS-típusok: | 
| − |                cisco | + | * cisco | 
| − |                computone | + | * computone | 
| − |                livingston | + | * livingston | 
| − |                max40xx | + | * max40xx | 
| − |                multitech | + | * multitech | 
| − |                netserver | + | * netserver | 
| − |                pathras | + | * pathras | 
| − |                patton | + | * patton | 
| − |                portslave | + | * portslave | 
| − |                tc | + | * tc | 
| − |                usrhiper | + | * usrhiper | 
| − |                other      | + | * other      | 
| '''realms''' | '''realms''' | ||
| 441. sor: | 448. sor: | ||
| '''huntgroups''' | '''huntgroups''' | ||
| − | A NAS-hoz kapcsolódó felhasználók "paramétereit" adhatjuk meg pl.: IP | + | A NAS-hoz kapcsolódó felhasználók "paramétereit" adhatjuk meg pl.: IP-címek. | 
| '''users''' | '''users''' | ||
| − | Itt lehet összefogni, az előbb tárgyalt hármast (clients, realm, huntgroups). | + | Itt lehet összefogni az előbb tárgyalt hármast (clients, realm, huntgroups). | 
| − | '''Egyébb modulok''' | + | '''Egyéb modulok''' | 
| A modulok beállításait, ha a radiusd.conf-ban nem lehet megtenni, akkor a modullal azonos nevű fájlban tudjuk megtenni. | A modulok beállításait, ha a radiusd.conf-ban nem lehet megtenni, akkor a modullal azonos nevű fájlban tudjuk megtenni. | ||
| 454. sor: | 461. sor: | ||
| '''SQL:''' | '''SQL:''' | ||
| − | A radiusd.confban meg kell adni, hogy milyen sql-t szeretne használni. Támogatott: PostgreSQL, MySQL, MSSQL, Oracle. | + | A radiusd.confban meg kell adni, hogy milyen sql-t szeretnénk használni. Támogatott: PostgreSQL, MySQL, MSSQL, Oracle. | 
| Például, ha postgresql-t szeretnénk használni, akkor a postgresql.conf-ot kell betölteni. | Például, ha postgresql-t szeretnénk használni, akkor a postgresql.conf-ot kell betölteni. | ||
| 464. sor: | 471. sor: | ||
| Részlet a postgresql.conf-ból: | Részlet a postgresql.conf-ból: | ||
| + | <pre> | ||
|   sql { |   sql { | ||
|         driver = "rlm_sql_postgresql" |         driver = "rlm_sql_postgresql" | ||
|         server = "localhost" |         server = "localhost" | ||
|         login = "postgres" |         login = "postgres" | ||
| − |         password = "" | + |         password = "diddgozs!!" | 
|         radius_db = "radius" |         radius_db = "radius" | ||
|      [...] |      [...] | ||
| + | </pre> | ||
| Majd az AAA metódusnál megismert események SQL műveletei vannak: | Majd az AAA metódusnál megismert események SQL műveletei vannak: | ||
| − |  Egy kapcsolat felépítésének a naplózása: | + | Egy kapcsolat felépítésének a naplózása: | 
| + | <pre> | ||
|  accounting_start_query = "INSERT into ${acct_table1} \ |  accounting_start_query = "INSERT into ${acct_table1} \ | ||
|     AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPortId, NASPortType, AcctStartTime, AcctAuthentic, \ |     AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPortId, NASPortType, AcctStartTime, AcctAuthentic, \ | ||
| 482. sor: | 491. sor: | ||
|     '%{Called-Station-Id}', '%{Calling-Station-Id}', '%{Service-Type}', '%{Framed-Protocol}', \ |     '%{Called-Station-Id}', '%{Calling-Station-Id}', '%{Service-Type}', '%{Framed-Protocol}', \ | ||
|      NULLIF('%{Framed-IP-Address}', '')::inet, 0, '%{X-Ascend-Session-Svr-Key}')" |      NULLIF('%{Framed-IP-Address}', '')::inet, 0, '%{X-Ascend-Session-Svr-Key}')" | ||
| + | </pre> | ||
| − | == Példa beállítás == | + | == Beállítási példa == | 
| A példában a következőket valósítjuk meg: | A példában a következőket valósítjuk meg: | ||
| − | Adott néhány Cisco hálózati eszköz (switch, router, VPN Concentrátor), és néhány gép amiről ezeket szeretnék SSH-n keresztül konfigurálni. A felhasználókat fájlban tároljuk. A kapcsolatokat naplózni szeretnénk fájlba és sql-be is. Ezenkívül a VPN Concetrátornál szeretnénk, ha a VPN felhasználók azonosítása LDAP-ból történe, és ők ne tudjanak SSH-n keresztül belépni a hálózati eszközökre. A naplózás itt is követelmény. | + | * Adott | 
| − | + | ** néhány Cisco hálózati eszköz (switch, router, VPN-koncentrátor), és | |
| + | ** néhány gép, amikről ezeket szeretnék SSH-n keresztül konfigurálni. | ||
| + | * A felhasználókat fájlban tároljuk. | ||
| + | * A kapcsolatokat naplózni szeretnénk fájlba és sql-be is. | ||
| + | * A VPN-koncetrátornál szeretnénk, ha | ||
| + | ** a VPN-felhasználók azonosítása LDAP-ból törtémne, és | ||
| + | ** ők ne tudjanak SSH-n keresztül belépni a hálózati eszközökre. | ||
| + | ** A naplózás itt is követelmény. | ||
| Cisco IOS konfig: | Cisco IOS konfig: | ||
| + | <pre> | ||
|  aaa authentication login default group radius local |  aaa authentication login default group radius local | ||
|  aaa authorization exec default group radius local |  aaa authorization exec default group radius local | ||
|  aaa accounting exec default start-stop group radius |  aaa accounting exec default start-stop group radius | ||
| − |  radius-server 152.66.208.218 auth-port 1812 acct-port 1813 key xxxxx | + |  radius-server 152.66.x.y auth-port 1812 acct-port 1813 key neduddmi! | 
|  radius-server timeout 10 |  radius-server timeout 10 | ||
|  radius-server retry 3 |  radius-server retry 3 | ||
| + | </pre> | ||
| + | radiusd.conf: | ||
| − | radiusd.conf | + | <pre> | 
| − | |||
|   ldap { |   ldap { | ||
|       server = "ldaps://ldap.sch.bme.hu" |       server = "ldaps://ldap.sch.bme.hu" | ||
| 552. sor: | 565. sor: | ||
|         sql |         sql | ||
|     } |     } | ||
| + | </pre> | ||
| clients.conf: | clients.conf: | ||
| − | + | ||
| + | <pre> | ||
|  client 152.66.208.141 { |  client 152.66.208.141 { | ||
| − |         secret = xxxx | + |         secret = neduddmi! | 
|         shortname = router-1 |         shortname = router-1 | ||
|         nastype = cisco |         nastype = cisco | ||
|  } |  } | ||
|  client 152.66.208.146 { |  client 152.66.208.146 { | ||
| − |         secret = xxxx | + |         secret = neduddmi! | 
|         shortname = router-1 |         shortname = router-1 | ||
|         nastype = cisco |         nastype = cisco | ||
|  } |  } | ||
| − |  A többi hálózati eszközt, hasonló módon felsoroljuk. | + | </pre> | 
| + | |||
| + | A többi hálózati eszközt hasonló módon felsoroljuk. | ||
| huntgroups: | huntgroups: | ||
| + | <pre> | ||
|  (group név, IP): |  (group név, IP): | ||
|     ssh           Calling-Station-Id == 152.66.208.218 |     ssh           Calling-Station-Id == 152.66.208.218 | ||
| − |   a többi IP cím felsorolása, ahhonan engedni akarjuk az ssh kapcsolatot | + | #  a többi IP cím felsorolása, ahhonan engedni akarjuk az ssh kapcsolatot | 
| + | </pre> | ||
| − | postgresql.conf | + | postgresql.conf: | 
| A beállításoknál említett séma létrehozása, majd a fájl elején meg kell adni az SQL eléréséhez szükséges adatokat. Mást nem kell változtatni. | A beállításoknál említett séma létrehozása, majd a fájl elején meg kell adni az SQL eléréséhez szükséges adatokat. Mást nem kell változtatni. | ||
| − | |||
| users: | users: | ||
| − |   '''SSH normál felhasználó fájlból:''' | + | '''SSH normál felhasználó fájlból:''' | 
| + | |||
| + | <pre> | ||
|     felhasználó1  Auth-Type := Local, User-Password == "xxxxx", Simultaneous-Use := 10, Huntgroup-Name == "aclip" |     felhasználó1  Auth-Type := Local, User-Password == "xxxxx", Simultaneous-Use := 10, Huntgroup-Name == "aclip" | ||
|                   Service-Type = Login, |                   Service-Type = Login, | ||
|                   cisco-avpair="shell:priv-lvl=0" |                   cisco-avpair="shell:priv-lvl=0" | ||
| + | </pre> | ||
| − |   '''SSH admin felhasználó fájlból:''' | + | '''SSH admin felhasználó fájlból:''' | 
| + | |||
| + | <pre> | ||
|     felhasználó2  Auth-Type := Local, User-Password == "xxxxx", Simultaneous-Use := 10, Huntgroup-Name == "aclip" |     felhasználó2  Auth-Type := Local, User-Password == "xxxxx", Simultaneous-Use := 10, Huntgroup-Name == "aclip" | ||
|                   Service-Type = Login, |                   Service-Type = Login, | ||
|                   cisco-avpair="shell:priv-lvl=15" |                   cisco-avpair="shell:priv-lvl=15" | ||
| + | </pre> | ||
| − |   '''VPN felhasználó fájlból:''' | + | '''VPN felhasználó fájlból:''' | 
| + | <pre> | ||
|     felhasználó3  Auth-Type := Local, User-Password == "xxxxx", Simultaneous-Use := 2 |     felhasználó3  Auth-Type := Local, User-Password == "xxxxx", Simultaneous-Use := 2 | ||
|                   Service-Type = Outbound-User |                   Service-Type = Outbound-User | ||
| − | + | </pre> | |
|   '''VPN felhasználó LDAP-ból:''' |   '''VPN felhasználó LDAP-ból:''' | ||
| + | <pre> | ||
|     DEFAULT       Simultaneous-Use := 100, Auth-Type := LDAP |     DEFAULT       Simultaneous-Use := 100, Auth-Type := LDAP | ||
|                   Service-Type = Outbound-User |                   Service-Type = Outbound-User | ||
| − | + | </pre> | |
| '''Logok:''' | '''Logok:''' | ||
A lap 2007. december 2., 22:40-kori változata
| Tartalomjegyzék | 
1 Általános bevezető
A FreeRADIUS egy free open source RADIUS-szerver. A RADIUS (Remote Authentication Dial In User Service) egy olyan kliens-szerver protokoll, amely a következő feladatok ellátásához nyújt segítséget:
- authentication (hitelesítés),
- authorization (engedélyezés),
- and accounting (naplózás, számlázás).
Az authentication, authorization és accounting hármast csak AAA-nak szokás rövidíteni.
A FreeRADIUS hivatalos weboldala: http://www.freeradius.org/.
A cikk írásakor (2007. december 2.) az aktuális stabil verzió az 1.1.7 (2007.07.25-én jelent meg).
A FreeRADIUS egy moduláris, gyors, gazdag protokollkészletű RADIUS-szerver, amely lehetőséget biztosít külső, így saját modulok használatára is.
A FreeRADIUS a felhasználói adatokat a következő forrásokból tudja kiolvasni:
- LDAP
- Kerberos
- SQL (MySQL, PostgreSQL, MSSQL, Oracle)
- /etc/passwd
- PAM
- sima szövegfájl
- ProxyRadius
- DC (Windows domain controller)
- külső program (perl, python)
Támogatott hitelesítési protokollok:
- PAP
- CHAP
- MSCHAP (v1, v2)
- SIP Digest (Cisco VoIP)
- EAP, PEAP
2 Mikor használják?
Felmerülhet a kérdés, hogy ha van pl. egy LDAP-szerverünk, akkor miért teszünk még egy szervert (RADIUSt) a hálózati erőforrás és az LDAP közé?
-  Biztonsági megfontolásból.
- Pl. ha az adott alkalmazást feltörik, akkor nem tudnak közvetlenül hozzáférni az LDAP-hoz, ilyenkor a RADIUS-szerver egyfajta bástyahostként (Bastion host) viselkedik.
 
-  Vagy: ki akarjuk használni a RADIUS adta lehetőségeket:
- központi felhasználó-
- és jogosultságkezelés,
- naplózás.
 
Leggyakoribb alkalmazási területe: azoknál a hálózati erőforrásoknál, ahol nincs lehetőség vagy mód a fent felsorolt azonosítási protokollok implementálására. Pl. hálózati eszközök (routerek, switchek, AP-k, stb.).
3 Hogy lehet beszerezni?
A letölthető a forrása a http://www.freeradius.org/ weboldalról, és utána a szokásos modon telepíthető (./configure, make, make install), de általában a disztribúciókhoz is létezik belőle csomag (pl. Debian, Fedora, SUSE stb).
Létezik belőle Windows-os verzió is, csak azt FreeRADIUS.net néven terjesztik, és a http://www.freeradius.net/ weboldalról tölthető le.
4 A RADIUS-protokoll
Kliens-szerver architekurájú protokoll, ahol:
- a kliens egy NAS (Network Access Server),
- a szerver pedig a RADIUS-szerver.
A RADIUS-protokoll UDP-t használ. A kliens és a szerver között egy-egy tranzakcióval kapcsolatban mindkét irányban csak egy-egy csomag megy át, így fölösleges lenne TCP-t használni. A TCP ugyan megbízhatóbb, de megnövelné a protokoll válaszidejét.
A protokoll két portot használ:
- 1812: auth (authentication, authorization) folyamatok;
- 1813: naplózás, számlázás (accounting).
Két RFC foglalkozik vele:
Protokollfutam:
A RADIUS csomagformátuma:
    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 ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-
RADIUS Codes (decimal) értékei:
        1       Access-Request
        2       Access-Accept
        3       Access-Reject
        4       Accounting-Request
        5       Accounting-Response
       11       Access-Challenge
       12       Status-Server (experimental)
       13       Status-Client (experimental)
      255       Reserved
Mivel az UDP-ben nincs nyugtázás, ezért a protokollba beépítették. Erre csak a naplózásnál (accounting) van szükség, ilyenkor a RADIUS-szerver nyugtázza, hogy megkapta a napló (accounting) csomagot.
Identifier:
Az összetartozó csomagokat azonosítja.
Length: Az egész csomag méretét adja meg. A minimális méret 20, míg a maximális 4096 byte.
Authenticator: A NAS és a RADIUS rendelkezik egy közös kulccsal ("secret" vagy "key").
Auth esetén:
- A kliens generál egy véletlenszámot, amit elküld a kérésben.
-  A szerver a válaszcsomagban a következő algoritmust használja fel, hogy hitelesítse magát:
- ResponseAuth = MD5(Code,ID,Length,NASAuth,Attributes,Secret).
 
Acc esetén:
-  A kliens (NAS) a következő algoritmus szerint generálja:
- Authenticator=MD5(Code,Identifier,Length,16 zero octets,request attributes,shared secret)
 
-  A RADIUS a válasza:
- Authenticator=MD5(Code,Identifier,Length,Request Authenticator,Secret)
 
Attribútum felépítése:
    0                   1                   2
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
   |     Type      |    Length     |  Value ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
Type: Auth esetén:
          1      User-Name
          2      User-Password
          3      CHAP-Password
          4      NAS-IP-Address
          5      NAS-Port
          6      Service-Type
          7      Framed-Protocol
          8      Framed-IP-Address
          9      Framed-IP-Netmask
         10      Framed-Routing
         11      Filter-Id
         12      Framed-MTU
         13      Framed-Compression
         14      Login-IP-Host
         15      Login-Service
         16      Login-TCP-Port
         17      (unassigned)
         18      Reply-Message
         19      Callback-Number
         20      Callback-Id
         21      (unassigned)
         22      Framed-Route
         23      Framed-IPX-Network
         24      State
         25      Class
         26      Vendor-Specific
         27      Session-Timeout
         28      Idle-Timeout
         29      Termination-Action
         30      Called-Station-Id
         31      Calling-Station-Id
         32      NAS-Identifier
         33      Proxy-State
         34      Login-LAT-Service
         35      Login-LAT-Node
         36      Login-LAT-Group
         37      Framed-AppleTalk-Link
         38      Framed-AppleTalk-Network
         39      Framed-AppleTalk-Zone
         40-59   (reserved for accounting)
         60      CHAP-Challenge
         61      NAS-Port-Type
         62      Port-Limit
         63      Login-LAT-Port
Accounting esetén:
         40      Acct-Status-Type
         41      Acct-Delay-Time
         42      Acct-Input-Octets
         43      Acct-Output-Octets
         44      Acct-Session-Id
         45      Acct-Authentic
         46      Acct-Session-Time
         47      Acct-Input-Packets
         48      Acct-Output-Packets
         49      Acct-Terminate-Cause
         50      Acct-Multi-Session-Id
         51      Acct-Link-Count
Length:
Atrribútum teljes hosszát adja meg.
Value:
Nulla vagy több byte, az attribútum értékét tartalmazza.
Típusai:
-  text 1-253 byte
 
-  string 1-253 byte
 
-  address 32 bit
 
-  integer 32 bit
 
- time 32 bit (unix time: 1970. január 1. UTC 00:00:00 óta eltelt másodpercek)
4.1 RADIUS hitelesítés lépései
-  NAS - Access-Request
- Code=Access-Request
- Authenticator=NAS által generált random szám
-  Attribútumok: User-Name, User-Password
- Password titkosítva=MD5(NASAuth,Secret) XOR Password
 
 
-  RADIUS - Access-Accept vagy Access-Reject
- Code= Access-Accept vagy Access-Reject
- Authenticator=MD5(Code,ID,Length,NASAuth,Attributes,Secret)
- Attribútomok (pl.: jogok, protokoll, stb) (opcionális)
 
4.2 RADIUS naplózás lépései
-  NAS - Accounting-Request
- Code=Accounting-Request
- Authenticator=MD5(Code,Identifier,Length,16 zero octets,request attributes,shared secret)
- Attribútumok
 
-  RADIUS - Accounting-Response
- Code=Accounting-Response
- Authenticator=MD5(Code,Identifier,Length,Request Authenticator,Secret)
 
5 Beállítás
Forrásból telepített FreeRADIUS könyvtár alkönyvtárai:
bin/ etc/ include/ lib/ man/ sbin/ share/ var/
A konfigurációs fájlok alapértelmezés szerint az etc/raddb könyvtárban vannak. A fájlok listája:
acct_users attrs certs clients clients.conf db.ipindex db.ippool dictionary eap.conf error2 example.pl experimental.conf hints huntgroups ldap.attrmap mssql.conf naslist naspasswd oraclesql.conf otp.conf otppasswd.sample postgresql.conf preproxy_users proxy.conf radiusd.conf realms services snmp.conf sql.conf sqlippool.conf users
A listából is látszik, hogy mennyire moduláris a konfiguráció. A fő konfigurációs fájl a radiusd.conf; ez töltődik be alapból, és tölti be a szükséges többi konfigurációs fájlt.
Néhány radiusd.conf-részlet:
 prefix = /usr/local/freeradius-1.1.7
 exec_prefix = ${prefix}
 sysconfdir = ${prefix}/etc
 localstatedir = ${prefix}/var
 sbindir = ${exec_prefix}/sbin
 logdir = ${localstatedir}/log/radius
 raddbdir = ${sysconfdir}/raddb
 radacctdir = ${logdir}/radacct
 confdir = ${raddbdir}
 run_dir = ${localstatedir}/run/radiusd
 log_file = ${logdir}/radius.log
 pidfile = ${run_dir}/radiusd.pid
# ilyen userként és groupként fog futni:
 user = nobody
 group = nobody
# melyik IP-n figyeljen:
 bind_address = 152.66.x.y
# állítsuk be a modulokat.
# proxy:
 proxy_requests  = yes
 $INCLUDE  ${confdir}/proxy.conf
# kliensek (NAS-ok):
 $INCLUDE  ${confdir}/clients.conf
# Unix /etc/passwd alapú hitelesítés:
 unix {
   passwd = /etc/passwd
 }
# AAA metódus előtt elvégzett műveletek pl.: IPcím-ellenőrzés
    preprocess {
          huntgroups = ${confdir}/huntgroups
          hints = ${confdir}/hints
    }
# LDAP:
  ldap {
     server = "ldap.your.domain"
     identity = "cn=admin,o=My Org,c=UA"
     basedn = "o=My Org,c=UA"
     filter = "(uid=%{Stripped-User-Name:-%{User-Name}})"
     base_filter = "(objectclass=radiusprofile)"
     start_tls = no
     tls_cacertfile        = /path/to/cacert.pem
     tls_cacertdir         = /path/to/ca/dir/
     tls_certfile          = /path/to/radius.crt
     tls_keyfile           = /path/to/radius.key
     tls_randfile          = /path/to/rnd
     tls_require_cert      = "demand"
     ldap_connections_number = 5
   }
# felhasználók megadása:
  files {
     usersfile = ${confdir}/users
     acctusersfile = ${confdir}/acct_users
     preproxy_usersfile = ${confdir}/preproxy_users
  }
# Naplózás:
  detail {
     detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d
     detailperm = 0600
  }
  sql_log {
               path = ${radacctdir}/sql-relay
               acct_table = "radacct"
               postauth_table = "radpostauth"
               Start = "INSERT INTO ${acct_table} (AcctSessionId, UserName, \
                NASIPAddress, FramedIPAddress, AcctStartTime, AcctStopTime, \
                AcctSessionTime, AcctTerminateCause) VALUES                 \
                ('%{Acct-Session-Id}', '%{User-Name}', '%{NAS-IP-Address}', \
                '%{Framed-IP-Address}', '%S', '0', '0', '');"
               Stop = "INSERT INTO ${acct_table} (AcctSessionId, UserName,  \
                NASIPAddress, FramedIPAddress, AcctStartTime, AcctStopTime, \
                AcctSessionTime, AcctTerminateCause) VALUES                 \
                ('%{Acct-Session-Id}', '%{User-Name}', '%{NAS-IP-Address}', \
                '%{Framed-IP-Address}', '0', '%S', '%{Acct-Session-Time}',  \
                '%{Acct-Terminate-Cause}');"
               Alive = "INSERT INTO ${acct_table} (AcctSessionId, UserName, \
                NASIPAddress, FramedIPAddress, AcctStartTime, AcctStopTime, \
                AcctSessionTime, AcctTerminateCause) VALUES                 \
                ('%{Acct-Session-Id}', '%{User-Name}', '%{NAS-IP-Address}', \
                '%{Framed-IP-Address}', '0', '0', '%{Acct-Session-Time}','');"
               Post-Auth = "INSERT INTO ${postauth_table}                   \
                (user, pass, reply, date) VALUES                            \
                ('%{User-Name}', '%{User-Password:-Chap-Password}',         \
                '%{reply:Packet-Type}', '%S');"
       }
A már megismert AAA metódus kerül megint elő. Egyenként tudjuk megadni, hogy melyik modult akarjuk használni. Az Auth-Type beállításnál csak az ott megadott modult használja, és nem próbálja meg a többi felsorolt modult használni.
 authorize {
     file
     ldap
     eap
     sql
   }
 authenticate {
        Auth-Type CHAP {
                chap
        }
        pam
        unix
    }
 preacct {
        preprocess
        acct_unique
    }
 accounting {
        detail
        sql
        sql_log
    }
 post-auth {
        main_pool
        sqlippool
        Post-Auth-Type REJECT {
               insert-module-name-here
        }
    }
 pre-proxy {
        files
        pre_proxy_log
    }
 post-proxy {
        post_proxy_log
    }
</őre>
A preacct a naplózás előtt elvégzendő műveletek pl.: egyedi kulcsot generál a felhasználónak key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port"
A post-auth az eredményesen hitelesített felhasználók utólagos műveleteit tartalmazza pl.: IPcím-osztás. Vagy a nem eredményesen hitelesített felhasználókat a "Post-Auth-Type REJECT"-nél megadott modullal még megpróbálja hitelsíteni a RADIUS.
A pre-proxynál és post-proxynál a RADIUS-Proxy előtt és után elvégzett modulokat lehet megadni.
Azonosításnál mindenképpen használt modulok: clients, realms, huntgroups, users. 
'''clients'''
 
A NAS beállításait lehet megadni: IP, secret, nastype. 
Támogatott NAS-típusok:
* cisco
* computone
* livingston
* max40xx
* multitech
* netserver
* pathras
* patton
* portslave
* tc
* usrhiper
* other     
'''realms'''
A felhasználónév@realm formátumban megadott felhasználóneveknél használatos.
'''huntgroups'''
A NAS-hoz kapcsolódó felhasználók "paramétereit" adhatjuk meg pl.: IP-címek.
'''users'''
Itt lehet összefogni az előbb tárgyalt hármast (clients, realm, huntgroups).
'''Egyéb modulok'''
A modulok beállításait, ha a radiusd.conf-ban nem lehet megtenni, akkor a modullal azonos nevű fájlban tudjuk megtenni.
Példa:
'''SQL:'''
A radiusd.confban meg kell adni, hogy milyen sql-t szeretnénk használni. Támogatott: PostgreSQL, MySQL, MSSQL, Oracle.
Például, ha postgresql-t szeretnénk használni, akkor a postgresql.conf-ot kell betölteni.
A fájlban kell megadni a postgreSQL szerver beállításait pl.: hostnév, felhasználó, jelszó, adatbázis, stb..
Az adatbázis séma elérési útja a fájl elején található pl.: doc/examples/postgresql.sql
Részlet a postgresql.conf-ból:
<pre>
  sql {
        driver = "rlm_sql_postgresql"
        server = "localhost"
        login = "postgres"
        password = "diddgozs!!"
        radius_db = "radius"
     [...]
Majd az AAA metódusnál megismert események SQL műveletei vannak:
Egy kapcsolat felépítésének a naplózása:
 accounting_start_query = "INSERT into ${acct_table1} \
    AcctSessionId, AcctUniqueId, UserName, Realm, NASIPAddress, NASPortId, NASPortType, AcctStartTime, AcctAuthentic, \
    ConnectInfo_start, CalledStationId, CallingStationId, ServiceType, FramedProtocol, FramedIPAddress, AcctStartDelay, AscendSessionSvrKey) \
    values('%{Acct-Session-Id}', '%{Acct-Unique-Session-Id}', '%{SQL-User-Name}', '%{Realm}', '%{NAS-IP-Address}', \
    '%{NAS-Port}', '%{NAS-Port-Type}', ('%S'::timestamp - '%{Acct-Delay-Time:-0}'::interval), '%{Acct-Authentic}', '%{Connect-Info}', \
    '%{Called-Station-Id}', '%{Calling-Station-Id}', '%{Service-Type}', '%{Framed-Protocol}', \
     NULLIF('%{Framed-IP-Address}', '')::inet, 0, '%{X-Ascend-Session-Svr-Key}')"
6 Beállítási példa
A példában a következőket valósítjuk meg:
-  Adott
- néhány Cisco hálózati eszköz (switch, router, VPN-koncentrátor), és
- néhány gép, amikről ezeket szeretnék SSH-n keresztül konfigurálni.
 
- A felhasználókat fájlban tároljuk.
- A kapcsolatokat naplózni szeretnénk fájlba és sql-be is.
-  A VPN-koncetrátornál szeretnénk, ha
- a VPN-felhasználók azonosítása LDAP-ból törtémne, és
- ők ne tudjanak SSH-n keresztül belépni a hálózati eszközökre.
- A naplózás itt is követelmény.
 
Cisco IOS konfig:
aaa authentication login default group radius local aaa authorization exec default group radius local aaa accounting exec default start-stop group radius radius-server 152.66.x.y auth-port 1812 acct-port 1813 key neduddmi! radius-server timeout 10 radius-server retry 3
radiusd.conf:
  ldap {
      server = "ldaps://ldap.sch.bme.hu"
      basedn = "dc=sch,dc=bme,dc=hu"
      port =636
      tls_mode = yes
      tls_cacertfile        = ca-cert path
      tls_certfile          = host-cert path
      tls_keyfile           = host-key path
      authtype = ldap
      ldap_connections_number = 20
      set_auth_type = yes
      timeout = 20
     }
  files {
       usersfile = ${confdir}/users
     }
  detail {
       detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d
       detailperm = 0600
     }
  detail auth_log {
       detailfile = ${radacctdir}/%{Client-IP-Address}/auth-detail-%Y%m%d
       detailperm = 0600
     }
  acct_unique {
       key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port"
     }
  $INCLUDE  ${confdir}/clients.conf
  $INCLUDE  ${confdir}/postgresql.conf
  preprocess {
      huntgroups = ${confdir}/huntgroups
      hints = ${confdir}/hints
  }
  authorize {
       auth_log
       files
       ldap
    }
  authenticate {
       Auth-Type LDAP  {
               ldap
       }
    }
  preacct {
        preprocess
        acct_unique
    }
  accounting {
        detail
        sql
    }
clients.conf:
 client 152.66.208.141 {
        secret = neduddmi!
        shortname = router-1
        nastype = cisco
 }
 client 152.66.208.146 {
        secret = neduddmi!
        shortname = router-1
        nastype = cisco
 }
A többi hálózati eszközt hasonló módon felsoroljuk.
huntgroups:
 (group név, IP):
    ssh           Calling-Station-Id == 152.66.208.218
#  a többi IP cím felsorolása, ahhonan engedni akarjuk az ssh kapcsolatot
postgresql.conf:
A beállításoknál említett séma létrehozása, majd a fájl elején meg kell adni az SQL eléréséhez szükséges adatokat. Mást nem kell változtatni.
users:
SSH normál felhasználó fájlból:
    felhasználó1  Auth-Type := Local, User-Password == "xxxxx", Simultaneous-Use := 10, Huntgroup-Name == "aclip"
                  Service-Type = Login,
                  cisco-avpair="shell:priv-lvl=0"
SSH admin felhasználó fájlból:
    felhasználó2  Auth-Type := Local, User-Password == "xxxxx", Simultaneous-Use := 10, Huntgroup-Name == "aclip"
                  Service-Type = Login,
                  cisco-avpair="shell:priv-lvl=15"
VPN felhasználó fájlból:
    felhasználó3  Auth-Type := Local, User-Password == "xxxxx", Simultaneous-Use := 2
                  Service-Type = Outbound-User
VPN felhasználó LDAP-ból:
    DEFAULT       Simultaneous-Use := 100, Auth-Type := LDAP
                  Service-Type = Outbound-User
Logok:
fájl:
- auth-detail-20071130
Packet-Type = Access-Request 
Fri Nov 30 02:09:00 2007
       User-Name = "guest"
       Reply-Message = "Password: "
       NAS-Port = 194
       NAS-Port-Id = "tty194"
       NAS-Port-Type = Virtual
       Calling-Station-Id = "152.66.208.218"
       NAS-IP-Address = 152.66.208.141
       Client-IP-Address = 152.66.208.141
       Huntgroup-Name = "ssh"
- detail-20071130
Fri Nov 30 02:09:00 2007
       Acct-Session-Id = "0002F391"
       User-Name = "guest"
       Acct-Authentic = RADIUS
       Acct-Status-Type = Start
       NAS-Port = 194
       NAS-Port-Id = "tty194"
       NAS-Port-Type = Virtual
       Calling-Station-Id = "152.66.208.218"
       Service-Type = NAS-Prompt-User
       NAS-IP-Address = 152.66.208.141
       Acct-Delay-Time = 0
       Client-IP-Address = 152.66.208.141
       Timestamp = 1196384940
Fri Nov 30 02:17:05 2007
       Acct-Session-Id = "0002F391"
       User-Name = "guest"
       Acct-Authentic = RADIUS
       Acct-Terminate-Cause = User-Request
       Acct-Session-Time = 485
       Acct-Status-Type = Stop
       NAS-Port = 194
       NAS-Port-Id = "tty194"
       NAS-Port-Type = Virtual
       Calling-Station-Id = "152.66.208.218"
       Service-Type = NAS-Prompt-User
       NAS-IP-Address = 152.66.208.141
       Acct-Delay-Time = 0
       Client-IP-Address = 152.66.208.141
       Timestamp = 1196385425
--Farkas 2007. december 2., 22:00 (CET) (farkas_pont_jozsef_kukac_sch_pont_bme_pont_hu)


