Home server s FreeRadius a RadSec na GL-inet Brume

Instalace Ubuntu na Brume

  • 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 LDAP a FreeRadius – konfigurace eduroam home serveru

  • Příprava:
apt update
apt upgrade -y
apt install unzip
  • Instalace LDAP:
  • Základní konfigurace LDAP
dpkg-reconfigure slapd
Omit OpenLDAP server configuration? No
DNS domain name: vsb.cz - dc=vsb, dc=cz # lze nastavit dle potřeby
Organization name: VSB # lze nastavit dle potřeby
Administrator password: eduroamtest # lze nastavit dle potřeby
Database backend to use: MDB
Remove database when slapd is purged? No
Move old database? Yes
  • Radius profil/heslo – Z důvodu použití PEAP (později konfigurace FreeRadius) je nutné mít v LDAPU „speciální“ heslo pro radius v plain podobě.
nano /etc/ldap/schema/radiusProfile.ldif

# níže uvedené vložte do souboru

dn: cn=freeradius,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: radiusProfile
olcAttributeTypes: ( 1.3.6.1.4.1.11344.1.100.2.2 NAME 'radiusPassword' SINGLE-VALUE DESC 'Client secret' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )
olcObjectClasses: ( 1.3.6.1.4.1.11344.1.100.1.1 NAME 'radiusProfile' DESC '' SUP top AUXILIARY MUST ( cn ) MAY ( radiusPassword ) )
  • Start LDAP s vytvořeným profilem:
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/radiusProfile.ldif
  • Instalace phpLDAPadmin:
apt install phpldapadmin

cd /usr/share/phpldapadmin
rm -R *
wget https://github.com/leenooks/phpLDAPadmin/archive/master.zip
unzip master.zip
mv phpLDAPadmin-master/* .
rm -R phpLDAPadmin-master
rm master.zip
  • Základní konfigurace phpLDAPadmin:
cd /usr/share/phpldapadmin/config
cp config.php.example config.php
chmod 775 config.php
nano config.php -l

Line 287: $servers->setValue('server','name','VSB LDAP Server');
Line 294: $servers->setValue('server','host','127.0.0.1');
Line 328: $servers->setValue('login','bind_id','cn=admin,dc=vsb,dc=cz');
Přidat na konec: $servers->setValue('login','anon_bind', false);
Přidat na konec: $config->custom->appearance['hide_template_warning'] = true;
  • Úprava šablony Posix Account – Z důvodu použití PEAP je nutné přidat do šablony Posix Account „speciální“ heslo pro radius v plain podobě.
nano /usr/share/phpldapadmin/templates/creation/posixAccount.xml

# do objectClasses přidat

<objectClasses>
  ...
  <objectClass id="radiusProfile"></objectClass>
</objectClasses>

# do atributů přidat

<attributes>
  ...
  <attribute id="radiusPassword">
    <display>Radius password</display>
    <order>10</order>
    <page>1</page>
    <spacer>1</spacer>
  </attribute>
</attributes>

Login: cn=admin,dc=dobesov,dc=cz
Password: eduroamtest

Přidání organizační jednotky Group

  • Kliknout na dc=vsb, dc=cz – create a child entry
  • Typ: Organisational Unit
  • Název: Group
  • Create Object
  • Commit

Přidání organizační jednotky Users

  • Kliknout na dc=vsb, dc=cz – create a child entry
  • Typ: Organisational Unit
  • Název: Users
  • Create Object
  • Commit

Přidání skupiny

  • Kliknout na ou=Group – create child entry
  • Typ: Posix Group
  • Název: student
  • Create Object
  • Commit

Přidání uživatele

  • Kliknout na ou=Users – create child entry
  • Typ: Generic: User Account
  • Vyplnit údaje
    • First name: Filip # lze nastavit dle potřeby
    • Last name: Řezáč # lze nastavit dle potřeby
    • Common Name: vyplní se automaticky
    • User ID: filip # lze nastavit dle potřeby (tímto loginem se bude uživatel přihlašovat k eduroam AP např. – filip@vsb.cz)
    • Password: P@ssword # lze nastavit dle potřeby (nejedná se o eduroam heslo, toto heslo lze využít např. pro SSO)
    • GID Number: student
    • Home directory: vyplní se automaticky
    • Login shell: Bash
    • Radius password: P@ssword12345 # lze nastavit dle potřeby (zde je zadáno eduroam heslo pro ověřování přes AP)
  • Create Object
  • Commit
  • 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 kapitola 2.5.
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
  • Aktivace a konfigurace LDAP modulu – LDAP běží na stejné VM jako Radius, z toho důvodu nebudeme řešit proxy uživatele pro LDAP modul a použijeme uživatele admin. Z důvodu použití PEAP je nutné vzít z LDAPU „speciální“ heslo pro radius v plain podobě.
cd /etc/freeradius/3.0/mods-enabled
ln -s ../mods-available/ldap
nano /etc/freeradius/3.0/mods-enabled/ldap

ldap {
  ...
  server = 'localhost'
  identity = 'cn=admin,dc=vsb,dc=cz'
  password = eduroamtest # administrátorské heslo pro LDAP
  base_dn = 'dc=vsb,dc=cz'
  ...
  update {
control:Cleartext-Password := 'radiusPassword' # Atribut obsahující 
     # FreeRadius heslo
    #control:Password-With-Header    += 'userPassword'
  }
  ...
}
  • 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.
  • 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ů.
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:
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
            }
        }
...
  • Přiřazení VLAN vlastním uživatelům – v případě, že přihlášení uživatelé “spadnou” do VLAN, nakonfigurujte níže uvedené. Hodnotu 300 nahraďte požadovaným číslem VLAN: 
nano /etc/freeradius/3.0/sites-enabled/inner_tunnel

post-auth {
...
        update outer.session-state {
                Tunnel-Type := VLAN
                Tunnel-Medium-Type := IEEE-802
                Tunnel-Private-Group-Id := 300
        }
...
}
  • 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