Radius

Allikas: Kuutõrvaja
Redaktsioon seisuga 9. september 2018, kell 22:06 kasutajalt Jj (arutelu | kaastöö) (FreeRadiuse seadistus koos info hoidmisega mysql andmebaasis)
(erin) ←Vanem redaktsioon | Viimane redaktsiooni (erin) | Uuem redaktsioon→ (erin)
                                        Roheline.jpg Toores. Ehk seda pala võib täiendada.

Radius on klient-server protokoll, mis defineerib võrguseadmete kommunikatsiooni. Tavaliselt koosneb üks radius süsteem kolmest komponendist

  • NAS - võrguseade, mis vahendab kasutaja internetiliiklust, korraldab autentimist ning saadab radiusele tagasi informatsiooni. Tavaliselt on NAS seadmeks wifi ruuter.
  • Radius server, millele NAS server saadab päringuid, mida siis Radius server vastavalt oma andmetele kas siis keelab või lubab
  • data store - mysql, postgresql, database või lihtsalt hulk faile kaustas. Ehk koht kus Radiuse jaoks on kasutajanimed, logid ning õigused.

Accountingu informatsioon on see mida NAS saadab perioodiliselt serverile. Tasub tähele panna, et see on väga lihtne infokogum. Detailsema info jaoks on vajalik nt netflow vms tarkvara.

Tulemüürist tuleb radiuse toimimiseks lubada udp pordid 1812 mis autentimiseks ja 1813 mis accountinguks

Sissejuhatus

Use-case on järgnev: Plaan saada tööle radius server mis võtab kasutajad erinevates andmebaasidest nagu PAM, MySQL, Postgresql ja LDAP ning Wifi AP mis on seadistatud kasutama Radius serverit. Autentimiseks kasutuses TTLS-PAP.

Ehk siis visuaalselt on pilt selline

  ___ Radius server ja kasutajad
 |   |
 |___|
   |
   |              ___wifi AP
   |_____________|   |
     kaabel      |___| 
                       .         .....
                       . ... ... ....
                      ......Raadiovõrk
                       ......    ..... ...
                             .......
                       ___ ......
                      |   |
                      |___| wifi klient (nt laptop)

Vaikimisi käib autentimine nii, et kui wifi kasutaja ühendub wifi purgi külge siis see purk kõigepealt autendib end vastu radiuse serverit. Selleks kasutab ta enda konfi sisestatud radius serveri IP aadressi ja parooli. Radius server vaatab enda (nt konfifailis või andmebaasis) olevat infot, teeb kindlaks nt, et selle IP pealt tuleks oodata teatavat parooli ja viib autentimise lõpuni. Alles seejärel järgneb kasutaja autentimine, kus kasutaja info jõuab samuti radius serverini ja autenditakse eraldi faili või andmebaasi tabeli vastu.

FreeRadius

Paigaldame FreeRadius serveri operatsioonisüsteemi vahenditega (abiks apt-get, emerge jms elementaarsed vahendid). See punkt ei tohiks pisutki Linux/Unix operatsioonisüsteeme tundvale inimesele olla raske.

FreeRadius install

  • Redhat, Fedora, CentOS - yum install freeradius
  • Debian, Ubuntu - apt-get install freeradius
  • FreeBSD - cd /usr/ports/net/freeradius && make install clean. Seal tasub ühtlasi tähele panna, et konfikataloog asub /usr/local/etc/raddb

Kasutame näites versiooni freeradius 3

Lihtne seadistus, kus kasutajate ja wifi purkide (NAS seadmete) info asub failides

Olulised failid radiuse seadistamisel

* radiusd.conf - Radiuse peamine seadistusfail
* clients.conf - Kontrollib mis AP'd võivad võtta Radius serveriga ühendust
* users - klient kasutajate nimekiri
* dictionary - 
* acct_users, db.daily, preproxy_users, hints, huntgroups -

raddb/radiusd.conf

TODO

raddb/clients.conf

Esiteks seadistame radiusesse enda wifi AP. Selleks tekitame selle IPga kliendi sektsiooni ning tekitame parooli.

client "192.168.1.20" {
    secret = testing123
    shortname = (a name for logging, etc.)
    nastype = (your AP's NAS type; if unknown, try "other")
}

WifiAP tuleb seadistada WPA-Enterprise (WPA-802.1x, RADIUS) peale. WPA-Personal (WPA-PSK) tähendab ühte wifi-ap peale seadistatud parooli, mida kõik kliendid kasutavad.

Tekitame testkasutaja, selleks lisame raddb/usersfaili rea

testkasutaja Cleartext-Password := "password"

Ja nüüd peaks juba saama testida. Paneme radius serveri tööle

# sudo freeradius -CX

Kuna radiuse vaikekonf lubab juba localhostist päringuid saata tekitame samas serveris, kuhu radiuse paigaltasime testpäringu kujul

radtest testkasutaja "parool" <ap ip> <suhtlusport> <ap parool>

See koos vastusega võiks välja näha järgnev

$ radtest testkasutaja "password" 127.0.0.1 1812 testing123
Sent Access-Request Id 220 from 0.0.0.0:44690 to 192.168.1.229:1812 length 74
        User-Name = "test"
        User-Password = "password"
        NAS-IP-Address = 127.0.1.1
        NAS-Port = 1812
        Message-Authenticator = 0x00
        Cleartext-Password = "password"
Received Access-Accept Id 220 from 192.168.1.229:1812 to 0.0.0.0:0 length 50

FreeRadiuse seadistus koos info hoidmisega mysql andmebaasis

Siin on üldiselt kõik sama, ainult nüüd hoiame me kõike infot mysqli andmebaasis. Lisaks freeradiusele tuleb paigaldada ka mysql komponent, ubuntus ja debianis nt

# apt-get install freeradius freeradius-mysql

Seejärel avame /etc/freeradius/sites-enabled/default ja täiendame seda järgnevalt

server default {
listen {
        type = auth
        ipaddr = *
        #       0 means "use /etc/services for the proper port"
        port = 0
        limit {
              max_connections = 16
              lifetime = 0
              idle_timeout = 30
        }
}

listen {
        ipaddr = *
        port = 0
        type = acct
        limit {
                idle_timeout = 0
                lifetime = 0
                max_connections = 0
        }
}

server default {
authorize {
       preprocess
       chap
       mschap
       digest
       suffix
       eap {
         ok = return
       }
       files
       sql   # Uncomment This
       expiration
       logintime
       pap
     }

     authenticate {
       Auth-Type PAP {
         pap
       }
       Auth-Type CHAP {
         chap
       }
       Auth-Type MS-CHAP {
         mschap
       }
       digest
       eap
     }

     preacct {
       preprocess
       acct_unique
       suffix
       files
     }

     accounting {
       detail
       #unix   # Uncomment This
       #radutmp   # Uncomment This
       sql   # Uncomment This
       exec
     }

     session {
       radutmp
      sql   # Uncomment This
     }

     post-auth {
       sql   # Uncomment This
       exec
       Post-Auth-Type REJECT {
         # log failed authentications in SQL, too.
         sql   # May want to Uncomment this
         attr_filter.access_reject
       }
     }

     pre-proxy {
     }

     post-proxy {
       eap
     }
}

Seejärel tuleb meil lisada mysql moodul. Selleks /etc/freeradius kaustas

ln -s mods-available/sql mods-enabled/sql

Avame mods-enabled/sql faili ja muudame sead järgnevalt

        dialect = "mysql"
        server = localhost;
        port = 3306
         login = "radius"
        password = "parool"
        radius_db = "radius"
        driver = "rlm_sql_mysql"

Et saaks kliente ehk nase või täpsemalt wifi ap-sid kasutada mysqlist

       read_clients = yes

Paigaldame mysql serveri

sudo apt-get install mysql-server

Tekitame kasutaja ning paroolid

CREATE DATABASE radius;
CREATE USER 'radius'@'localhost' IDENTIFIED BY 'parool'; 
GRANT ALL ON radius.* TO 'radius'@'localhost' IDENTIFIED BY 'parool';

Tekitame baasi sobivad tabelid

mysql -u root -p radius < mods-config/sql/main/mysql/schema.sql

Olulisemad tabelid mis tekivad

  • nas - wifi APde info
  • radacct - Radius accounting, iga wifiruuteriga ei toimi
  • radcheck - wifi kasutajad
  • radgroupreply - erinevad parameetrid mida kliendile saadetakse, kas ta siis aksepteerib või ei on tema teha
  • radpostauth - autentimise logi, mis ap peale ja kes
  • radusergroup - mis kasutaja mis grupis

Ning nüüd võime tekitada esimese kasutaja, nt plaintext parooliga testimiseks

insert into radcheck (username,attribute,op,value) values("test", "Cleartext-Password", ":=", "test");

Lisame oma wifi ap

INSERT INTO  nas VALUES (NULL ,  '192.168.0.15',  'myNAS',  'other', NULL ,  'mysecret', NULL , NULL ,  'RADIUS Client');

Olulistest väljadest on teine väli wifi seadme IP, kolmas väli on mingi nimi, kuues parool, kõige viimane väljadest on kirjeldus

Ja paneme radiuse käima ning testime

sudo freeradius -CX

Accounting

Terve hulga erinevate wifi purkide omanikku huvitab kahtlemata ka kasutusstatistika. Kes logis mis wifi ap külge ja kauaks ning palju infot ta sellejooksul liigutas. Radius pakub asjale lahendust nagu accounting, lisaks sellele, et ta kuulab autoriseerimise küsimusi kuulab ta eraldi pordil ka tagasitulevaid accountingu päringuid.

Lubame accounting päringute kuulamise /etc/freeradius/3.0/sites-enabled/inner-tunnel failis ja seadisamine sinna õige ip ja pordi

listen {
       ipaddr = <radius serveri ip>
       port = 1813
       type = acct
}

Kui kasutuses on mysql siis salvestatakse päringud tabelisse radacct Selle tabeli info vaatamine on mysqli käsurealt kerge

USE radius;
SELECT * FROM radacct;

Õnnetuseks tundub, et wifi purk peab toetama lisaks radiusele ka accountingut ja see tundub praegu trikiga koht. Tundub, et osadel wifi APdel see puudub ja ilmselt accountingut ei pakuta. Paistab, et see accounting on nii triviaalne, et tavalistes specides seda ka välja ei tooda.

On olemas alterantiivina küll tabel radpostauth, kuid sinna pannakse vaikimisi kirja vaid kasutajanimi, tema parool ning kas autentimine õnnestus või ei. Selleks, et salvestada antud tabelisse rohkem infot sessioonidest, nt ka wifi AP IP aadress tuleb natuke päringuid ja tabelistruktuuri muuta.

Failis mods-config/sql/main/mysql/queries.conf tuleb muuta lõpus olev post auth sektsioon järgnevaks

        query = "\
                INSERT INTO ${..postauth_table} \
                        (username, pass, reply, authdate, nasip) \
                VALUES ( \
                        '%{SQL-User-Name}', \
                        '%{%{User-Password}:-%{Chap-Password}}', \
                        '%{reply:Packet-Type}', \
                        '%S', \
                        '%{Client-IP-Address}')"
}

Ja mysqlis

ALTER TABLE radpostauth ADD nasip varchar(64);

Võimalus on lisada sinna veel erinevaid parameetreid.

Kasutajate seadistus ning grupid

Kasutajad saab panna teatud kuupäeval aeguma

insert into radcheck (username,attribute,op,value) values("test", "Expiration", ":=", "21 Dets 2017");

Misjärel teatatakse logis

(20) expiration: ERROR: Account expired at 'Dets 21 2017 12:00:00 EEST'

Ja kliendile öeldakse

(22) Sent Access-Reject Id 217 from 77.72.149.123:1812 to 88.196.30.219:39891 length 20

Infot võib lisada veel igasugust, nt

INSERT INTO radreply (UserName, Attribute, op, Value) VALUES ('guest', 'Max-Daily-Session', '==', '600');
INSERT INTO radreply (UserName, Attribute, op, Value) VALUES ('guest', 'Session-Timeout', '==', '120');
INSERT INTO radreply (UserName, Attribute, op, Value) VALUES ('guest', 'Idle-Timeout', '==', '60');

Kõikide atribuutide nimekirja leiab http://freeradius.org/rfc/attributes.html

Krüpto ja paroolid

  • WEP - peetakse tänapäev vananekuks ja väga vigaseks. Kasutab krüptimiseks RC4 algoritmi.
  • WPA - vanema põlvkonna lahendus. kasutab krüptimiseks AES algoritmi, autentimiseks EAP protokolli ja tkip ajutiste võtmete terviklikkuse protokolli
  • WPA2 - Kasutab krüpteerimiseks AES põhist CCMP algoritmi.

Kuidas paroole hoida ja mis formaadis on omaette teema. Iga parooliformaat ei toeta iga autentimise meetodit

Parooliformaat tuleb defineerida ka konfis nt järgnevalt

        pap { 
                encryption_scheme = sha1 
        }

NT parooli geneerimine

smbencrypt passme

Loodud parooli võib kasutada nt sellisel kujul kasutajate failis

"alice" NT-Password := "CED46D3B902D60F779ED78BFD90ED00A"

Ühekorsete paroolide ehk OPT (one-time password) loomiseks on moodul rlm_otp

http://deployingradius.com/documents/protocols/compatibility.html

Omaloodud lisamuutujad ja tingimused

Feeradius on sedavõrd paindlik, et lubab vabalt defineerida enda konfiguratsiooni uusi muutujaid ning ehitada siis sinna vahele erinevaid tingimusi enda uute muutujate ning isekirjutatud sql päringute abil. Näiteks tekitame uue muutuja Wifi-AP ja defineerime sinna ühe aadressi

insert into radcheck (username,attribute,op,value) values("test", "Wifi-IP", ":=", "192.168.1.1");

Defineime dictionary faili uue muutuja

ATTRIBUTE Wifi-IP 3011 string

Logist näeme, et muutuja loeti kenasti sqlist välja ning defineeriti ära

(9) sql:   Wifi-IP := "192.168.1.1"

Seda muutujat saame juba edaspidi kasutada mitmesuguste if/else võrdluste korral. Näiteks saame siduda teatud kasutajad teatud wifi AP-dega nii, et nad ei saaks logida mujalt. kui Wifi-IP muutujaga andmebaasis defineeritud ruuteri tagant.

    if ("%{control:Wifi-IP}" != "%{Client-IP-Address}"){
     reject
    }

Sellejärel peaks saama kasutaja mart logida ainult 192.168.1.1 aadressiga wifi AP küljes olles. Logis näeb see protsess välja järgnev

(30)     if ("%{control:Wifi-IP}" != "%{Client-IP-Address}"){
(30)     EXPAND %{control:Wifi-IP}
(30)        --> 192.168.1.1
(30)     EXPAND %{Client-IP-Address}
(30)        --> 192.168.1.1
(30)     if ("%{control:Wifi-IP}" != "%{Client-IP-Address}") -> FALSE

Näide, kuidas omaloodud sql käskude abil kasutaja teatud hulga ebaõnnestunud logimiskordade järel lukustada https://wiki.freeradius.org/guide/lockout

Cluster ja kõrgkäideldavus

Feeradius on väga paindlik süsteem, ta kasutab udpd mida on kerge haproxydega jagada serverite vahele, lisaks toetab ta vaikimisi juba enda sees päringute jagamist mitmetele mysql serveritele laiali, võimalik on teha eraldi poliitikaid vastavalt erinevatele konfiblokkidele. Näiteks kasutada natuke erinevaid sql seadeid autentimisel ja accountingu

Radius pakub võimaluse defineerida mitu mysql serverit

modules {
    sql sql1 {
        # configuration to connect to SQL database one
    }
    sql sql2 {
        # configuration to connect to SQL database two
    }
    always handled {
        rcode = handled
    }
}

redundant moodul proovib järjest enda sektsiooni defineeritud ridu, kuni esimene neist õnnestub

#  Handle accounting packets
accounting {
    # always log to detail, stopping if it fails
    detail
    redundant {
    # try module sql1
          sql1
          # if that's down, try module sql2
          sql2
          # otherwise drop the request as
          # it's been "handled" by the "always"
          # module (see doc/rlm_always)
          handled
    }
}

https://wiki.freeradius.org/config/Fail-over

Lingid

http://wiki.freeradius.org/WPA_HOWTO

https://wiki.itcollege.ee/index.php/RADIUS_serveri_kasutamine_wifi_võrkudes

http://karman.homelinux.net/blog/archives/300

https://www.howtoforge.com/wifi-authentication-accounting-with-freeradius-on-centos5-p2

https://wiki.freeradius.org/guide/WPA-HOWTO

https://me.m01.eu/blog/2012/05/wpa-2-enterprise-from-scratch-on-a-raspberry-pi/

https://github.com/hotbaby/hostapd-authenticator/wiki/Hostapd-RADIUS-EAP-authentication-server tarkvaralise wifiruuteri seadistamine radiuse vastu

http://manpages.ubuntu.com/manpages/zesty/man5/unlang.5.html