FreeRADIUS
(→Beállítás) |
(→A RADIUS-protokoll) |
||
70. sor: | 70. sor: | ||
Két RFC foglalkozik vele: |
Két RFC foglalkozik vele: |
||
* [http://www.ietf.org/rfc/rfc2865.txt?number=2865 RFC2865], |
* [http://www.ietf.org/rfc/rfc2865.txt?number=2865 RFC2865], |
||
− | * [http://www.ietf.org/rfc/rfc2866.txt?number=2866 EFC2866] |
+ | * [http://www.ietf.org/rfc/rfc2866.txt?number=2866 RFC2866] |
'''Protokollfutam:''' |
'''Protokollfutam:''' |
A lap 2008. január 29., 22:11-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 (NAS Authenticator).
- A szerver a válaszcsomagban a következő algoritmust használja fel, hogy hitelesítse magát:
- Response Authenticator = MD5(Code,ID,Length,NASAuthenticator,Attributes,Secret).
Acc esetén:
- A kliens (NAS) a következő algoritmus szerint generálja:
- Request 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:
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 (UTF8 kodolt string)
- 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
- NAS Authenticator=NAS által generált random szám
- Attribútumok: User-Name, User-Password
- Password titkosítva=MD5(NAS Authenticator,Secret) XOR Password
- RADIUS - Access-Accept vagy Access-Reject
- Code= Access-Accept vagy Access-Reject
- Authenticator=MD5(Code,ID,Length,NAS Authenticator,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.
radiusd.conf felépítése:
először általános beállítások pl.: IP cím, maximum kiszolgálható konkurens kliensek száma, stb. modulok megadása modulnév { modul beéllításai, paraméterei (opcionális) $INCLUDE "fájl" (opcionális) } AAA methodus (itt megadott modulokat sorban dolgozza fel, kivéve, ha Auth-Type van megadva a modulnál, mert akkor csak azt használja, és nem megy a következőhöz) authorize { modulnév . . } authenticate { modulnév . . } preacct { modulnév . . } accounting { modulnév . . } post-auth { modulnév . . } pre-proxy { modulnév . . } post-proxy { modulnév . . }
Néhány radiusd.conf-részlet:
#általános rész: 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 #proxy: ("igen",ha használni akarjuk a RADIUS proxy szolgáltatását, különben "nem") #Ha proxy szolgáltatást választjuk, akkor a AAA methodusnál a RADIUS szerverünk, csak "átjátszóként" fog viselkedni, #és egy másik RADIUS-hoz továbbítja a NAS-tól kapott csomagokat, és fordítva is.) proxy_requests = yes $INCLUDE ${confdir}/proxy.conf #kliensek (NAS-ok): $INCLUDE ${confdir}/clients.conf #Modulok megadása, beállítása: #Unix /etc/passwd alapú hitelesítés: unix { passwd = /etc/passwd } #AAA metódus előtt elvégzett műveletek pl.: IP cí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');" } #AAA methodus 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 }
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.
A preacct a naplózás előtt elvégzendő műveletek -egyedi kulcsot generál a felhasználónak, amit a sql naplózásnál használnak acct_unique = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port" -preprocess: hitelesítés előtt elvégezendő műveleteket adhatunk meg pl.: IP cím ellenörzés
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.
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
általános forma: client IP { secret = key shortname = megnevezés nastype = NAS type }
realms
A felhasználónév@realm formátumban megadott felhasználóneveknél használatos. Felhasználói csoportokat hozz hatunk létre, és különböző jogosultságokat, beállításokat adhatunk a csoportoknak.
huntgroups
A NAS-kat csoportokba szervezhetjük, és a kapcsolatot kezdeményezhető IP címeket, vagy felhazsnálóneveket adhatjuk meg. Itt tudjuk szabályozni, hogy milyen felhasználónévvel és IP címmel, milyen NAS-okhoz lehet kapcsolodni. Általános forma:
csoportnév NAS-IP-Address == IP1, Calling-Station-Id == IP2 User-Name = felhasznaélónév1, User-Name = felhasználónév1, ...
users
Itt lehet összefogni az előbb tárgyalt hármast (clients, realm, huntgroups). A kezdhetjük a felhasználónévvel, vagy DEFAULT kulcsszó megadással. A DEFAULT joker bejegyzésként viselkedik, és minden felhasználónévre illesszkedik.
Általános forma:
felhasználónév (DEFAULT mindenre illeszkedik) utána az Attributtumokat kell megadni veszővel elválasztva
attributtum név | leírás | érték | példa |
---|---|---|---|
Auth-Type | authentikáció típusa | Accept, Reject, Local, EAP | Auth-Type == Local |
User-Password | jelszó megadása | sztring | User-Password == "jelszo" |
Service-Type | szolgáltatás típusa | Login, Outbound-User, Framed-User | Service-Type == Login |
Huntgroup-Name | csoport megadás | sztrinh | Huntgroup-Name == "csoport név" |
Simultaneous-Use | max kunkurens kapcsolatok szama | integer | Simultaneous-Use :=5 |
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:
$INCLUDE ${confdir}/postgresql.conf
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
A postgresql.conf az alaábbi módon épül fel:
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}')"
Eyg sor a PostgreSQL-bol, amibe query beszurja az adatokat:
radacctid | acctsessionid | acctuniqueid | username | realm | nasipaddress | nasportid | nasporttype | acctstarttime | acctstoptime | acctsessiontime | acctauthentic | connectinfo_start | connectinfo_stop | acctinputoctets | acctoutputoctets | calledstationid | callingstationid | acctterminatecause | servicetype | framedprotocol | framedipaddress | acctstartdelay | acctstopdelay -----------+------------------+--------------+----------+-------+----------------+-----------+-------------+------------------------+------------------------+-----------------+---------------+-------------------+------------------+-----------------+------------------+-----------------+------------------+--------------------+-----------------+----------------+-----------------+----------------+--------------- 1 | 0400000000000055 | | farki | | 152.66.209.185 | 0 | Virtual | 2006-07-29 14:55:59+02 | 2006-07-29 14:56:01+02 | 1 | RADIUS | | | 0 | 0 | | 152.66.213.10 | User-Request | NAS-Prompt-User | | | 0 | 0 (1 sor)
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)