RADIUS Proxy

Úvod

Určeno pro případ, kdy není na Home serveru k dispozici lokální LDAP server.

Určeno pro případ, když není na Home serveru k dispozici lokální LDAP server.
Tato konfigurace najde užití například u nádraží, které nepotřebuje vlastní doménu, ale je možné se připojit na již existující sítě a služby. Lokální RADIUS server pak přeposílá pouze autentizační požadavky na RADIUS server, který spravující dané služby a domény.

Testování této konfigurace probíhalo na zařízeních GL.iNet Brume (GL-MV1000) ve funkci Home server a GL.iNet Creta (GL-AR750) ve funkci AP.


Docker image ke stažení

Níže je k dispozici ke stažení předpřipravený docker image pro x86 architekturu. V případě ARM architektury postupujte dále v manuální konfiguraci dle připraveného návodu.


Instalace Ubuntu

Tato část platí pouze pro zařízení GL.iNet Brume a není podporována zařízeními s architekturou x386 a amd64 s operačním systémem Ubuntu.

Klikněte pro zobrazení detailů

Návod převzat z https://github.com/gl-inet/mv1000-ubuntu-image

Postup:

  • Připojení k Brume přes SSH – nutné být v LAN Brume, IP: 192.168.8.1, login: root, pass: goodlife
  • Update uBoot, vložit skript do shell a Enter:
cat<<'EOF' | ash
    #!/bin/sh

    # Functions
    print()
    {
        echo -e "\n\033[0;$1m$2\033[0m\n"
    }

    # Varibles
    doUpgrade=false;

    # Check Version
    clear
    print 96 'Checking uBoot version'
    [ -n "$(strings /dev/mtd0 | grep "U-Boot 2" | grep dirty)" ] && doUpgrade=true;
    [ -z "$(strings /dev/mtd0 | grep "U-Boot 2")" ] &&  doUpgrade=true;

    # Upgrade uBoot
    if [ "$doUpgrade" = true ]; then
        print 96 'Update required, downloading'
        echo
        cd /tmp
        curl -SL https://github.com/gl-inet/mv1000-ubuntu-image/raw/master/uboot-gl-mv1000-20190901-md5-183eade39f35da8f6fc76c713754af85.bin -o /tmp/uboot.bin
        if [ "$(md5sum /tmp/uboot.bin 2>/dev/null | cut -f1 -d" ")" = "183eade39f35da8f6fc76c713754af85" ]; then
            print 96 'Updating uBoot'
            print 91 'DO NOT TURN OFF YOUR DEVICE'
            mtd erase /dev/mtd0
            mtd write /tmp/uboot.bin /dev/mtd0
            mtd erase /dev/mtd1
            print 92 'uBoot update finished, rebooting...'
            reboot
        else
            print 91 'Checksum failed, aborting!'
        fi

    # Not Needed
    else
        print 92 "No need to update uBoot"
    fi
EOF
  • Proběhne aktualizace, případně systém nahlásí, že uBoot je aktualizován.
  • Instalace samotného Ubuntu 18.04, vložit skript do shell a Enter:
cat<<'SEOF' | ash
    #!/bin/sh
    cd /tmp
    curl -SL http://download.gl-inet.com/firmware/mv1000/ubuntu/testing/ubuntu-18.04.3-20200109.tar.gz -o /tmp/ubuntu.tar.gz
    ubuntu_upgrade -n /tmp/ubuntu.tar.gz
    cat<<'EOF' > /data/etc/apt/sources.list
deb http://ports.ubuntu.com/ubuntu-ports/ bionic main multiverse restricted universe
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main multiverse restricted universe
deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main multiverse restricted universe
EOF
SEOF
  • Přepínání mezi systémy:
switch_system ubuntu
switch_system openwrt

Instalace FreeRadius – konfigurace eduroam home serveru

  • Příprava:
apt update
apt upgrade -y
apt install unzip
  • FreeRadius – instalace
apt install freeradius freeradius-ldap
  • Vygenerování certifikátů – pro lokální ověřování uživatelů je možné využít self-sign CA (např. Easy-rsa viz. https://easy-rsa.readthedocs.io/en/latest/ ) nebo viz. níže. Pro mezidoménové ověřování je nutné mít cert. a klíče podepsané důvěryhodnou CA, viz. níže.
nano /etc/freeradius/3.0/certs/ca.cnf

...
[ CA_default ]
default_days            = 3650 # lze nastavit dle potřeby
default_md              = sha256
...
[ req ]
input_password          = P@ssword # lze nastavit dle potřeby
output_password         = P@ssword # lze nastavit dle potřeby
...
[certificate_authority]
countryName             = CZ # lze nastavit dle potřeby
stateOrProvinceName     = Czech Republic # lze nastavit dle potřeby
localityName            = Ostrava # lze nastavit dle potřeby
organizationName        = VSB # lze nastavit dle potřeby
emailAddress            = nobody@vsb.cz # lze nastavit dle potřeby
commonName              = "VSB FreeRadius CA" # lze nastavit dle 
   #  potřeby

nano /etc/freeradius/3.0/certs/server.cnf

...
[ CA_default ]
default_days            = 3650 # lze nastavit dle potřeby
default_md              = sha256
...
[ req ]
default_bits            = 2048
input_password          = P@ssword # heslo je stejne jako u ca.cnf 
     # (certifikační autority)
output_password         = P@ssword # heslo je stejne jako u ca.cnf 
     # (certifikační autority)
...
[server]
countryName             = CZ
stateOrProvinceName     = Czech Republic
localityName            = Ostrava
organizationName        = VSB
emailAddress            = nobody@vsb.cz
commonName              = "VSB FreeRadius"  # zde je vhodné nastavit 
                                       # hostname/ip serveru

cd /etc/freeradius/3.0/certs
make
chown -R freerad:freerad /etc/freeradius/3.0/certs/*
  • Úprava hlavního konfiguračního souboru – najděte následující dvě hodnoty a upravte je. Ta první zajistí že že freeRADIUS je schopen zpracovat autentizační požadavky dlouhé i 10s, to pomůže když se vám v logu objevují hlášení No EAP session matching the State variable. Druhá volba zajistí logování úspěšných autentizací do /var/log/freeradius/radius.log.
nano /etc/freeradius/3.0/radiusd.conf

cleanup_delay = 10
auth = yes
  • Konfigurace EAP modulu. V souboru /etc/freeradius/3.0/mods-available/eap nastavte vlastní soubory s certifikáty pro PEAP. Zakomentujte ca_file a ca_path. Změnte defaultní EAP metodu z MD5 na PEAP, tím přestane FR nabízet MD5 jako první metodu a zabavíte se varování „server is offering unsafe method MD5-Challenge“ v monitoringu. V případě že certifikát RADIUS serveru vydala mezilehlá CA, která není běžně předinstalována je třeba ji přidat do souboru server.pem za certifikát RADIUS serveru. Dále nastavujeme maximální verzi TLS na 1.2, implemetace TLS 1.3 není pro EAP standartizovaná a v některé kombinace klient-server způsobí selhávání v ověřování. Zvažte vypnutí TLS < 1.2, předchozí verze protokolu mají známe bezpečnostní chyby.
nano /etc/freeradius/3.0/mods-enabled/eap

eap {
  default_eap_type = peap
  ...
}
...
tls-config tls-common {
  private_key_password = P@ssword # heslo je stejne jako u ca.cnf 
  private_key_file = ${certdir}/server.key # priv. klíč serveru
  certificate_file = ${certdir}/server.pem # cert. serveru
  #ca_file = ${cadir}/ca.pem
  #ca_path = ${cadir}
    
  #tls_min_version = "1.2"
  tls_max_version = "1.2"

}
...
  • Eduroam realms policy – Slouží k zamítání chybných realmů – často se objevují realmy neco.cz, domena.org, také se může objevit mezera za realmem (automatické doplňování). Uživatele, kteří udělají chybu při zadávání je lepší odfiltrovat co nejdříve.
cd /etc/freeradius/3.0/policy.d/
wget https://raw.githubusercontent.com/CESNET/ansible-freeradius/master/files/eduroam-realm-checks
  • Konfigurace “sites” – Default site slouží jako vnější brána pro všechny požadavky, jelikož nás v projektu zajímá pouze metoda autentizace PEAP, zakomentujeme všechny pro nás nevyhovující metody. Při použití EAP dojde k přesměrování požadavku do inner-tunnel. V default site také použijeme filtr username a eduroam_realms pro vyfiltrování nevalidních požadavků a povolíme předzpracování požadavku pro kontrolu LDAP.
nano /etc/freeradius/3.0/sites-enabled/default

...
authorize {
  ...
  filter_username
  # zapnuti Eduroam realms filtru
  filter_eduroam_realms
  preprocess
  #chap
  #mschap
  #digest
  #suffix
  eap {
    ok = return
    # updated = return
  }
  #files
  #-sql
  #-ldap
  #pap
  ...
}
  • V souboru /etc/freeradius/3.0/sites-enabled/inner-tunnel je také nutné mimo jiné odkomentovat řádek s filter_inner_identity a také povolíme předzpracování požadavku pro kontrolu LDAP:
nano /etc/freeradius/3.0/sites-enabled/inner-tunnel

...
authorize {
...
  #chap
  #mschap
  #files
  #-sql
  -ldap
  #pap
  filter_inner_identity
  ...
}
  • Následně v souboru /etc/freeradius/3.0/policy.d/filter ve funkci filter_inner_identity upravte kontrolu anonymní identity. V defaultu FreeRadius má uvedeno if (&outer.request:User-Name !~ /^(anon|@)/) to znamená, že akceptuje uživatelská jména s prefixem anon a uživatelům to skýtá jistou volnost, např. anon1@realm.cz, anon2@realm.cz, … a @realm.cz. To komplikuje blokování v případě bezpečnostních incidentů. Umožněte pouze anonymous@realm.cz:
nano /etc/freeradius/3.0/policy.d/filter

...
filter_inner_identity {
...
    if (&outer.request:User-Name != &User-Name) {
        #
        #  Get the outer realm.
        #
        if (&outer.request:User-Name =~ /@([^@]+)$/) {
            update request {
                Outer-Realm-Name = "%{1}"
            }

            #
            #  When we have an outer realm name, the user portion
            #  MUST either be empty, or begin with "anon".
            #
            #  We don't check for the full "anonymous", because
            #  some vendors don't follow the standards.
            #
            if (&outer.request:User-Name !~ /^anonymous@/) {
                update request {
                    Module-Failure-Message = "User-Name is not anonymized"
                }
                reject
            }
        }
...
  • Konfigurace realms – Nastavte níže uvedený soubor tak, aby požadavky s vaším realmem považoval za lokální požadavky, a aby požadavky bez realmu zamítal. 
nano /etc/freeradius/3.0/proxy.conf

realm vsb.cz { # je možné měnit na základě LDAP domény
}

realm LOCAL {
}

realm NULL {
virtual_server  = auth-reject
}

#realm DEFAULT {
#}
  • Konfigurace klientů (APček) – FreeRADIUS server důvěřuje pouze klientům uvedeným v souboru níže, kteří znají sdílené heslo. Neopoužívejte krátké sdílené heslo, zajištuje integritu RADIUS požadavků mezi AP a RADIUS serverem. RADIUS protokol není šifrovaný.
  • Vždy uveďte znak 1 před vaším realmem, více informací viz RFC5580.
  • Direktiva add_cui = yes zajistí přidání atributu Chargeable-User-Identity = 0x00 . To společně s definovaným Operator-Name způsobí že IdP (ať už vaše, nebo cizí) vypočte a v Access-Accept odpovědi pošle unikátní hodnotu attributu Chargeable-User-Identity pro uživatele na konkrétním SP.
nano /etc/freeradius/3.0/clients.conf

client sit_s_ap { # je možné měnit
  secret = StejneHesloNastavimNaAP # je možné měnit
  shortname = moje_ap # je možné měnit
  ipaddr = 192.168.0.105/24 # je možné měnit (IP AP)
  add_cui = yes
  Operator-Name = 1<vsb.cz> # je možné měnit
}
  • Debug:
systemctl stop freeradius
freeradius -XXX

FreeRadius – konfigurace mezidoménového ověřování požadavků a uživatelů

Je potřeba zajistit směrování požadavků z cizích realmů, vytvořit lokální testovací účet pro monitoring eduroam síťě a nastavit filtrování „škodlivých“ atributů přicházejících od cizích radius serverů.

  • Úprava směrování realmů – přidání realmu pro všechny požadavky mimo domácí doménu
nano /etc/freeradius/3.0/proxy.conf

…
realm "~.+$" {
      status_check = status-server
      auth_pool = tls
      nostrip
}
  • Úprava směrování realmů – zakomentování řádků pro směrování vnějších domén směrem na národní radius server
nano /etc/freeradius/3.0/sites-enabled/inner-tunnel

…
#update control {
    	#   	&Proxy-To-Realm := LOCAL
    	#}
  • Konfigurace RadSec – Samotný RADIUS protokol se nepovažuje za bezpečný, proto je komunikace mezi RADIUSy transportována RadSec protokolem (TLS tunelem). Všechny požadavky pro cizí realmy jsou pak přesměrovány do tohoto tunelu. Pro samotný tunel jsou akceptovány certifikáty od několika málo CA.
  • RadSec tunel používá dvě TCP spojení

<národní_radius> → <lokální_radius>:2083
<lokalní_radius> → <národní_radius>:2083
  • Aktivace RadSec protokolu ve FreeRadius 3
ln -s /etc/freeradius/3.0/sites-available/tls /etc/freeradius/3.0/sites-enabled/tls
  • Upravte soubor níže pro komunikaci mezi vaším a národním RADIUS serverem. Pro obě výše zmíněná TCP spojení použijeme stejný certifikát, a proto bude certifikát v souboru zmíněn dvakrát. Poprvé v sekci listen (příchozí spojení od národního serveru) a podruhé v sekci home_server tls. Na rozdíl od PEAP (kap. 2.4 bod 5.) je zde potřeba pro ca_file uvést soubor chain_CESNET_CA4.pem, který získáte na adrese https://pki.cesnet.cz/, protože obsahuje veřejné klíče, pomocí kterých bude náš server ověřovat certifikát protistrany (tj. národního RADIUS serveru), který je podepsán právě autoritou CESNET_CA4.
  • Pro připojení na testovací “národní RADIUS server” si vyžádejte certifikáty a klíč od správce filip@cesnet.cz.
  • Definice cerifikátů pro naslouchání na lokálním portu 2083
nano /etc/freeradius/3.0/sites-available/tls

listen {
...
# redukce casteho navazovani spojeni z/na narodni RADIUS
         lifetime     = 0
         idle_timeout = 600
...
         tls {
                   private_key_file = <soubor_s_priv_klicem>
                   certificate_file = <soubor_s_certifikatem>
                ca_file          = ${cadir}/chain_CESNET_CA4.pem
                   ...
         }
}
  • Definice klienta testovacího národního RADIUS
clients radsec {  
         client radius1.eduroam.cz {  # v případě testovacího 
# serveru - iptel-0.osanet.cz 
                  ipaddr = 195.113.187.22 # 195.113.113.130
                  proto = tls
                  secret = radsec
                  
       # redukce casteho navazovani spojeni z/na narodni RADIUS
                  limit {
                         max_connections = 16
                         lifetime = 0
                         idle_timeout = 600
                  }
         }
...
}
  • Definice certifikátů pro klienta národního RADIUS serveru, kterého přiřaďte k RadSec tunelu (podruhé použití zmíněných klíčů a ca_file) a upravte parametry tak aby nadřazený RADIUS nemohl být označen jako nefunkční:
home_server tls {
        ipaddr = radius1.eduroam.cz # testovací server na 
    # iptel-0.osanet.cz
        
        response_timeouts = 1000
        response_window = 30
        zombie_period = 120
        revive_interval = 60

        port = 2083
        type = auth
        secret = radsec
        proto = tcp
        status_check = none
        tls {
                   private_key_file = <soubor_s_priv_klicem>
                   certificate_file = <soubor_s_certifikatem>
                ca_file          = ${cadir}/chain_CESNET_CA4.pem
                   ...
         }
...
}
  • Přiřazení VLAN návštěvníkům. V případě, že používáte VLAN pro návštěvníky nahraďte číslo 200 vaším požadovaným číslem VLAN
nano /etc/freeradius/3.0/sites-enabled/default  

post-proxy {
...
        if ("%{proxy-reply:Packet-Type}" == "Access-Accept") {
                update proxy-reply {
                        Tunnel-Type := VLAN
                        Tunnel-Medium-Type := IEEE-802
                        Tunnel-Private-Group-Id := 200
                }
        }
...

Konfigurace Operator-Name – Atribut Operator-Name slouží k identifikaci SP odkud pochází požadavky na autentizaci uživatelů.

nano /etc/freeradius/3.0/sites-available/default

authorize {
..
        operator-name
..
}
  • Konfigurace Chargeable-User-Identity – Chargeable-User-Identity (CUI) je vypočítaný atribut, který se počítá jako SHA1 hash z vnitřní EAP identity, hodnoty atributu Operator-Name který posílá SP a soli. Uživatel nedovede hodnotu CUI změnit a tak má SP k dispozici unikátní identitikátor pro případné blokování uživatele. Současně ale SP různých organizací (podle hodnoty Operator-Name) dostávají různé hodnoty CUI pro jednoho uživatele a není tak narušeno soukromí uživatele.
  • V souboru níže zvolte náhodný řetězec cui_hash_key – pokud provozujete v organizaci víc než jeden RADIUS server, tak musí mít oba shodnout hodnotu tak, aby oba vaše RADIUS servery poskytovali pro jednoho uživatele tu samou hodnotu CUI. Dále v tom samém souboru nastavte cui_require_operator_name = yes, tím zajistíte, že CUI bude váš RADIUS posílat pouze těm SP, kteří vyplňují Operator-Name.
nano /etc/freeradius/3.0/policy.d/cui

cui_hash_key = "vsb" # lze změnit
cui_require_operator_name = "yes"
  • Aktivujte modul CUI
cd /etc/freeradius/3.0/mods-enabled
ln -s ../mods-available/cui .

nano /etc/freeradius/3.0/sites-enabled/inner-tunnel

post-auth {
	cui-inner
...

nano /etc/freeradius/3.0/sites-enabled/default

authorize {
...
	cui
...

accounting {
...
        cui
...
        
post-auth {
...
       	cui
...

pre-proxy {
...
       	cui
...
  • Pokud máte k dispozici více ruzných realmů (realm1.cz a realm2.cz), které sdílí uživatelské účty, je nutné, aby pro libovolné uživatelské jméno byla hodnota cui stejná pro včechny realmy. Docílíte toho následující konfigurací. V souboru /etc/freeradius/3.0/policy.d/cui změňte definici proměnné &Chargeable-User-Identity v bloku cui.post-auth
nano /etc/freeradius/3.0/policy.d/cui

cui.post-auth {
       if (!&control:Proxy-To-Realm && &Chargeable-User-Identity && !&reply:Chargeable-User-Identity && \
(&Operator-Name || ('${policy.cui_require_operator_name}' != 'yes')) ) {
       update reply {
&Chargeable-User-Identity = "%{sha1:${policy.cui_hash_key}%{tolower:%{Stripped-User-Name}%{%{Operator-Name}:-}}}"
                }
        }
  • Normalizace MAC adres – Formáty adres můžou být různé – pro zjednodušení můžeme využít normalizaci MAC adres na jediný formát, se kterým budeme následně adresy porovnávat. Přidáme definici normalizace (volání fce rewrite_calling_station_id) do souboru.
nano /etc/freeradius/3.0/sites-enabled/default

authorize {
        filter_eduroam_realms
        filter_username
        rewrite_calling_station_id
        ...
}

...

preacct {
        preprocess
        rewrite_calling_station_id
        ...
}
  • Konfigurace F-TICKS
nano /etc/freeradius/3.0/mods-available/f_ticks

# vložte obsah viz. Níže

linelog f_ticks {
       filename = syslog
       #syslog_facility = local0
       #syslog_severity = info
       format = ""
       reference = "f_ticks.%{%{reply:Packet-Type}:-format}",
       f_ticks {
               Access-Accept = "F-TICKS/eduroam/1.0#REALM=%{Realm}#VISCOUNTRY=CZ#VISINST=%{Operator-Name}#CSI=%{Calling-Station-Id}#CUI=%{reply:Chargeable-User-Identity}#RESULT=OK#"
               Access-Reject = "F-TICKS/eduroam/1.0#REALM=%{Realm}#VISCOUNTRY=CZ#VISINST=%{Operator-Name}#CSI=%{Calling-Station-Id}#CUI=%{reply:Chargeable-User-Identity}#RESULT=FAIL#"
       }
}
cd /etc/freeradius/3.0/mods-enabled
ln -s ../mods-available/f_ticks

nano /etc/freeradius/3.0/sites-available/default

post-auth {
..
reply_log
f_ticks
..
}

Konfigurace koncového AP a připojení klienta

Pro napojení na FreeRadius stačí mít jakékoliv AP s podporou WPA2-EAP

Příklad konfigurace pro AP GL.iNet Creta:

  • Připojení ke Creta pomocí Wifi – SSID: GL-AR750-XXX , password: goodlife
  • Pokročilé webové rozhraní na IP 192.168.8.1/cgi-bin/luci , password: goodlife
  • Povolení přístupu přes WAN – Network -> Firewall -> Zones -> Smazat všechny zóny
  • Nyní je AP dostupné i přes WAN
  • Kontrola funkce WPA2-EAP – Network -> Wireless -> Edit u jednoho z SSID (2,4 nebo/a 5 G) -> Interface Configuration -> Wireless Security -> Encryption -> WPA2-EAP
  • Pokud WPA2-EAP není dostupné, chybí instalovat balíček wpad – System -> Software -> Download and install package: wpad -> OK
  • Konfigurace WPA2-EAP pro FreeRadius Brume:
    • Network -> Wireless -> Edit u jednoho z SSID (2,4 nebo/a 5 G) -> Interface Configuration -> Wireless Security -> Encryption -> WPA2-EAP
    • Cipher: auto
    • Radius-Authentication-Server: IP adresa FreeRadius serveru
    • Radius-Authentication-Port: 1812
    • Radius-Authentication-Secret: StejneHesloNastavimNaAP
    • Radius-Accounting-Server:  IP adresa FreeRadius serveru
    • Radius-Accounting-Port: 1813
    • Radius-Accounting-Secret: StejneHesloNastavimNaAP
    • Ostatní parametry nechám v defaultním nastavení