Иди на текст

Uputstvo za instalaciju i konfiguraciju FreeRADIUS softvera za potrebe Davaoca Resursa

  • Verzija FreeRadius softvera: 3.2.0
  • Operativni sistem: CentOS 7

FreeRADIUS (www.freeradius.org) predstavlja softversku platformu za RADIUS server. Aktuelne verzije možete da pogledate na starnici http://freeradius.org/download.html.

U ovom Uputstvu prikazana je instalacija FreeRADIUS servera za potrebe institucije (Davaoca Resursa) u okviru AMRES eduroam servisa.

Pre same instalacije FreeRADIUS softvera potrebno je instalirati određene softverske pakete i biblioteke, koje su neophodne za pravilno funkcionisanje servera. U nastavku su, po sekcijama, predstavljeni ovi paketi i komande za instalaciju.

Radi čuvanja podataka o sesijama koristiće se PostgreSQL baza podataka, a vi imate mogućnost da je instalirate zajedno sa RADIUS serverom na istoj VM/serveru, ili da PostgreSQL bazu instalirate na zasebnoj VM/serveru. U zavisnosti od Vašeg izbora razlikovaće se konfiguracija dva konfiguraciona fajla RADIUS servera (sql i cui modul) o čemu će biti više u nastavku ovog uputstva.

Priprema pred instalaciju

Onemogućiti SElinux

Radi adekvatnog funkcionisanja softvera neophodno je onemogućiti SElinux!

Provera statusa:

sestatus
To se može uraditi na sledeći način:

Otoriti fajl /etc/selinux/config i promeniti vrednost iz SELINUX=enforcing u SELINUX=disabled.

vim /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
Sačuvati izmene:

reboot

Podesiti hosta

U okviru čitavog uputstva smatraće se da je domen VM radius.institucija.ac.rs, tako da na svim mestima umesto ovog naziva domena potrebno je da unesete naziv po vašem izboru.

Veoma je važno da FQDN (Fully Qualified Domain Name) i pun hostname (# hostname -f) ove VM, npr. radius.institucija.ac.rs, koji se podešava u okviru ove sekcije bude isti kao i domen koji je adekvatno podešen na DNS serveru, a taj domen će se takođe kasnije koristiti za kreiranje sertifikata.

Podešavanje host podataka

Dat je primer postavljanja radius.institucija.ac.rs kao FQDN podatka, koji je potrebno zameniti FQDN podatkom Vašeg Davaoca Resursa, kao i postavljanja HOSTNAME podatka: radius , koji je potrebno zameniti HOSTNAME podatkom Vašeg Davaoca Resursa.

vim /etc/hosts

Na kraju fajla se unosi linija u formi: IP ADRESA FQDN HOSTNAME:

xxx.xxx.xxx.xxx radius.institucija.ac.rs radius
Postaviti hostname

Koristi se komanda sledeće forme: hostnamectl set-hostname HOSTNAME

hostnamectl set-hostname radius

Sačuvati izmene:

reboot

Podesiti IPTABLES

Najpre je potrebno onemogućiti firewalld servis, ukoliko već nije.

systemctl stop firewalld
systemctl mask firewalld

Potrebno je instalirati iptables-services softverski paket i omogućiti iptables proces, ukoliko već nije.

yum install iptables-services
systemctl enable iptables

Otvoriti portove 1812, 1813 i 1814 prema FTLR serverima, monitorima i NAS uređajima

To se može uraditi na sledeći način:
vim /etc/sysconfig/iptables  

Otvoriti navedene portove dodavanjem sledećih linija u fajl:

#147.91.4.204 (ftlr1.ac.rs)
-A INPUT -m state -s 147.91.4.204/32 --state NEW -m udp -p udp --dport 1812 -j ACCEPT
-A INPUT -m state -s 147.91.4.204/32 --state NEW -m udp -p udp --dport 1813 -j ACCEPT
-A INPUT -m state -s 147.91.4.204/32 --state NEW -m udp -p udp --dport 1814 -j ACCEPT

#147.91.1.101(ftlr2.ac.rs)
-A INPUT -m state -s 147.91.1.101/32 --state NEW -m udp -p udp --dport 1812 -j ACCEPT
-A INPUT -m state -s 147.91.1.101/32 --state NEW -m udp -p udp --dport 1813 -j ACCEPT
-A INPUT -m state -s 147.91.1.101/32 --state NEW -m udp -p udp --dport 1814 -j ACCEPT

#147.91.3.12 (monitor.eduroam.ac.rs)
-A INPUT -m state -s 147.91.3.12/32 --state NEW -m udp -p udp --dport 1812 -j ACCEPT
-A INPUT -m state -s 147.91.3.12/32 --state NEW -m udp -p udp --dport 1813 -j ACCEPT
-A INPUT -m state -s 147.91.3.12/32 --state NEW -m udp -p udp --dport 1814 -j ACCEPT

#147.91.56.177 (monitor2.eduroam.ac.rs)
-A INPUT -m state -s 147.91.56.177/32 --state NEW -m udp -p udp --dport 1812 -j ACCEPT
-A INPUT -m state -s 147.91.56.177/32 --state NEW -m udp -p udp --dport 1813 -j ACCEPT
-A INPUT -m state -s 147.91.56.177/32 --state NEW -m udp -p udp --dport 1814 -j ACCEPT

#Otvaranje portova zarrad NAS uređaja (za svaki NAS uređaj je potrebno otvoriti navedene portove)
-A INPUT -m state -s IP_adresa_NAS_uređaja/32 --state NEW -m udp -p udp --dport 1812 -j ACCEPT
-A INPUT -m state -s IP_adresa_NAS_uređaja/32 --state NEW -m udp -p udp --dport 1813 -j ACCEPT
-A INPUT -m state -s IP_adresa_NAS_uređaja/32 --state NEW -m udp -p udp --dport 1814 -j ACCEPT

Napomena: Navedene linije je potrebno uneti bavezno iznad linije: -A INPUT -j REJECT --reject-with icmp-host-prohibited

iptables-restore < /etc/sysconfig/iptables
iptables-save
systemctl restart iptables
iptables -L

Instalacija neophodnih softverskih paketa i biblioteka

Biblioteke gcc su neophodne za kompajliranje softverskog paketa pri instalaciji

yum install -y gcc*

Biblioteke libtalloc definišu skup funkcija koje pojednostavljuju alokaciju/dealokaciju podataka, pre svega komplesnih struktura koje sadrže mnogo dinamički alociranih elemenata kao što su stringovi ili nizovi:

yum install -y libtalloc*

Softverski paket openssl je uglavnom preinstaliran na Linux distribucijama. FreeRADIUS koristi openssl i openssl-devel softver za kreiranje digitalnih ključeva za EAP-TTLS i PEAP mehanizme autentifikacije:

yum install openssl
yum install -y openssl-devel

Softverski paket postgresql i postgresql-devel biblioteka se mogu koristiti za čuvanje RADIUS accounting podataka. Ovo je bitno za institucije koje žele da dobiju status Davaoca Resursa.

yum -y install yum-utils wget
yum -y install postgresql postgresql-devel

Softverski paket psmisc omogućava korišćenje killall komande:

yum install -y psmisc

Source instalacija FreeRADIUS softvera

Otići na putanju /opt:

cd /opt

Preuzeti najnoviju verziju FreeRADIUS softvera (3.2.0)

wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-server-3.2.0.tar.gz

Otpakovati preuzeti paket:

tar xf freeradius-server-3.2.0.tar.gz

Zatim se pređe u freeradius-server-3.2.0 direktorijum:

cd freeradius-server-3.2.0

Napomena: Preporuka je da izveštaj naredne tri komande iskopirate i sačuvate.

./configure --with-openssl --with-postgresql
make
make install

Konfiguracioni fajlovi se nalaze na putanji: /usr/local/etc/raddb

U verziji 3 FreeRADIUS servera, direktorijum /usr/local/etc/raddb/modules/ , koji je korišćen u ranijim verzijama, nije više u upotrebi!

  • U FreeRADIUS 3.2.x verzijama, svi moduli su premešteni u poddirektorijum /usr/local/etc/raddb/mods-available.
  • Moduli koji mogu biti od interesa su ldap, ntlm_auth, cui, eap, sql itd...
  • Aktiviranje željenih modula se postiže tako što se pravi soft link za taj modul u okviru poddirektorijuma /usr/local/etc/raddb/mods-enabled/

Konfiguracija FreeRADIUS servera

Kada kopirate delove konfiguracije u konfiguracione fajlove u nastavku uputstva možete da koristite nano editor, jer vim editor prepoznaje oznaku za komentar u nekom delu konfiguracije i ponavlja tu oznaku u svim narednim redovima kopirane konfiguracije.

eduroam virtuelni tunel

Virtuelni tuneli omogućavaju konfiguraciju većeg broja nezavnisnih servisa na FreeRADIUS platformi. Za potrebe eduroam sevisa, kreira se novi virtuelni tunel koji će obrađivati autentifikacione zahteve:

  • Preći u poddirektorijum /usr/local/etc/raddb/sites-available/
cd /usr/local/etc/raddb/sites-available/
  • Napraviti kopiju fajla default virtuelnog tunela, čije će ime biti eduroam
cp default eduroam
  • Izmeniti kreirani fajl.
vim eduroam

Sledi detaljan prikaz svih izmena fajla eduroam po koracima.

U sledećoj liniji potrebno je izmeniti naziv servera tako da umesto default bude eduroam

server default {
server eduroam {

U okviru prve listen podsekcije:

  • Zakomentarisati liniju type = auth

  • Ispod nje dodati liniju: type = auth+acct

listen {
        type = auth
        ipaddr = *
        port = 0

        limit {
              max_connections = 16
              lifetime = 0
              idle_timeout = 30
        }
}
listen {
#       type = auth
        type = auth+acct
        ipaddr = *
        port = 0

        limit {
              max_connections = 16
              lifetime = 0
              idle_timeout = 30
        }
}

Sledeći koraci se odnose na authorize sekciju.

  • Nakon linije filter_username , a pre linije preprocess dodati sledeće linije koda:

Napomena: Deo konfiguracije u kome se odbija zahtev na osnovu Calling-Station-Id vrednosti nije neophodan, ali ukoliko je potrebno da se koristi otkomentarisati taj deo i dodati odgovarajuću MAC adresu.

Kod opcije update request podesiti vrednost atributa Operator-Name tako da odgovara domenu vaše institucije, npr. "1institucija.ac.rs". Veoma je važno da ova vrednost počinje brojem 1, tako da je ne treba menjati.

        if (&User-Name !~ /@{1}/ ) {
                reject
        }


#       if (Calling-Station-Id == 'MAC-adresa') {
#               reject
#       }


        update request {
                 Operator-Name := "1institucija.ac.rs"
        }
  • Zatim treba otkomentarisati liniju # cui
  • Zatim treba zakomentarisati linije files ,-sql i -ldap
  • Na kraju zakomentarisati linije:
        Autz-Type New-TLS-Connection {
              ok
        }

Pre izmena sekcija authorize izgleda ovako:

authorize {
        filter_username
        preprocess
#       cui
        chap
        mschap
        digest
        suffix

        eap {
                ok = return
        }

        files
        -sql
        -ldap
        expiration
        logintime
        pap


        Autz-Type New-TLS-Connection {
                  ok
        }
}
authorize {
        filter_username

        if (&User-Name !~ /@{1}/ ) {
                reject
        }


#       if (Calling-Station-Id == 'MAC-adresa') {
#               reject
#       }

        update request {
                 Operator-Name := "1institucija.ac.rs2"
        }

        preprocess
        cui
        chap
        mschap
        digest
        suffix

        eap {
                ok = return
        }

#       files
#       -sql
#       -ldap
        expiration
        logintime
        pap


#       Autz-Type New-TLS-Connection {
#                 ok
#       }
}

Sledeći korak se odnosi na authenticate sekciju.

  • Zakomentarisati liniju mschap

Pre izmene sekcija authenticate izgleda ovako:

authenticate {
        Auth-Type PAP {
                pap
        }

        Auth-Type CHAP {
                chap
        }

        Auth-Type MS-CHAP {
                mschap
        }

        mschap
        digest
        eap

}
authenticate {
        Auth-Type PAP {
                pap
        }

        Auth-Type CHAP {
                chap
        }

        Auth-Type MS-CHAP {
                mschap
        }

#       mschap
        digest
        eap
}

Sledeći korak se odnosi na accounting sekciju.

  • Skinuti oznaku za onemogućenje (-) u liniji -sql
1
2
3
4
5
6
7
8
accounting {
        detail
        unix
        -sql
        exec
        attr_filter.accounting_response

}
1
2
3
4
5
6
7
8
accounting {
        detail
        unix
        sql
        exec
        attr_filter.accounting_response

}

Sledeći koraci se odnose na post-auth sekciju.

Potrebno je:

  • Otkomentarisati liniju #cui

  • Otkomentarisati liniju #reply_log i ispod nje dodati liniju:

        logovi_test
  • Zakomentarisati liniju -sql

  • Otkomentarisati liniju insert_acct_class

  • Zakomentarisati liniju -sql u okviru Post-Auth-Type REJECT podsekcije

Pre izmena sekcija post-auth izgleda ovako:

post-auth {
        if (session-state:User-Name && reply:User-Name && request:User-Name && (reply:User-Name == request:User-Name)) {
                update reply {
                        &User-Name !* ANY
                }
        }
        update {
                &reply: += &session-state:
        }

#       cui
#       reply_log
        -sql
        exec
#       insert_acct_class
        remove_reply_message_if_eap

        Post-Auth-Type REJECT {
                -sql
                attr_filter.access_reject

                eap

                remove_reply_message_if_eap
        }

        Post-Auth-Type Challenge {
        }

        Post-Auth-Type Client-Lost {
        }

        if (EAP-Key-Name && &reply:EAP-Session-Id) {
                update reply {
                        &EAP-Key-Name := &reply:EAP-Session-Id
                }
        }
}
post-auth {
       if (session-state:User-Name && reply:User-Name && request:User-Name && (reply:User-Name == request:User-Name)) {
               update reply {
                       &User-Name !* ANY
               }
       }
        update {
                &reply: += &session-state:
        }

        cui
        reply_log
        logovi_test
#       -sql
        exec
        insert_acct_class
        remove_reply_message_if_eap

        Post-Auth-Type REJECT {
#               -sql
                attr_filter.access_reject

                eap

                remove_reply_message_if_eap
        }

        Post-Auth-Type Challenge {
        }

        Post-Auth-Type Client-Lost {
        }

        if (EAP-Key-Name && &reply:EAP-Session-Id) {
                update reply {
                        &EAP-Key-Name := &reply:EAP-Session-Id
                }
        }
}

Sledeći koraci se odnose na pre-proxy sekciju.

Potrebno je:

  • Otkomentarisati liniju cui

  • Otkomentarisati liniju pre_proxy_log

  • Ispod linije attr_filter.pre-proxy dodati sledeće :

        if("%{Packet-Type}" != "Accounting-Request") {
                attr_filter.pre-proxy
        }

Pre izmena sekcija pre-proxy izgleda ovako:

pre-proxy {
        # Before proxing the request add an Operator-Name attribute identifying
        # if the operator-name is found for this client.
        # No need to uncomment this if you have already enabled this in
        # the authorize section.
#       operator-name

        #  The client requests the CUI by sending a CUI attribute
        #  containing one zero byte.
        #  Uncomment the line below if *requesting* the CUI.
#       cui

        #  Uncomment the following line if you want to change attributes
        #  as defined in the preproxy_users file.
#       files

        #  Uncomment the following line if you want to filter requests
        #  sent to remote servers based on the rules defined in the
        #  'attrs.pre-proxy' file.
#       attr_filter.pre-proxy

        #  If you want to have a log of packets proxied to a home
        #  server, un-comment the following line, and the
        #  'detail pre_proxy_log' section, above.
#       pre_proxy_log
}
pre-proxy {
        # Before proxing the request add an Operator-Name attribute identifying
        # if the operator-name is found for this client.
        # No need to uncomment this if you have already enabled this in
        # the authorize section.
#       operator-name

        #  The client requests the CUI by sending a CUI attribute
        #  containing one zero byte.
        #  Uncomment the line below if *requesting* the CUI.
        cui

        #  Uncomment the following line if you want to change attributes
        #  as defined in the preproxy_users file.
#       files

        #  Uncomment the following line if you want to filter requests
        #  sent to remote servers based on the rules defined in the
        #  'attrs.pre-proxy' file.
#       attr_filter.pre-proxy
        if("%{Packet-Type}" != "Accounting-Request") {
                attr_filter.pre-proxy
        }

        #  If you want to have a log of packets proxied to a home
        #  server, un-comment the following line, and the
        #  'detail pre_proxy_log' section, above.
        pre_proxy_log
}

Sledeći koraci se odnose na post-proxy sekciju.

Potrebno je:

  • Otkomentarisati liniju post_proxy_log

Pre izmena sekcija post-proxy izgleda ovako:

        #  If you want to have a log of replies from a home server,
        #  un-comment the following line, and the 'detail post_proxy_log'
        #  section, above.
#       post_proxy_log

        #  Uncomment the following line if you want to filter replies from
        #  remote proxies based on the rules defined in the 'attrs' file.
#       attr_filter.post-proxy

        eap


#       Post-Proxy-Type Fail-Accounting {
#                       detail.example.com
#       }
}
        #  If you want to have a log of replies from a home server,
        #  un-comment the following line, and the 'detail post_proxy_log'
        #  section, above.
        post_proxy_log

        #  Uncomment the following line if you want to filter replies from
        #  remote proxies based on the rules defined in the 'attrs' file.
#       attr_filter.post-proxy

        eap


#       Post-Proxy-Type Fail-Accounting {
#                       detail.example.com
#       }
}

Prikaz fajla eduroam sa svim potrebnim izmenama:

server eduroam {
listen {
#       type = auth
        type = auth+acct
        ipaddr = *
        port = 0

        limit {
              max_connections = 16
              lifetime = 0
              idle_timeout = 30
        }
}

listen {
        ipaddr = *
        port = 0
        type = acct

        limit {

        }
}

listen {
        type = auth
        port = 0
        limit {
              max_connections = 16
              lifetime = 0
              idle_timeout = 30
        }
}

listen {
        ipv6addr = ::
        port = 0
        type = acct

        limit {
        }
}

authorize {
        filter_username


        if (&User-Name !~ /@{1}/ ) {
                reject
        }

#        if (Calling-Station-Id == 'MAC-adresa') {
#                reject
#        }

        update request {
                 Operator-Name := "1institucija.ac.rs2"
        }


        preprocess
        cui
        chap
        mschap
        digest
        suffix

        eap {
                ok = return
        }

#       files
#       -sql
#       -ldap
        expiration
        logintime
        pap

#       Autz-Type New-TLS-Connection {
#                 ok
#       }
}

authenticate {
        Auth-Type PAP {
                pap
        }

        Auth-Type CHAP {
                chap
        }

        Auth-Type MS-CHAP {
                mschap
        }

#       mschap
        digest
        eap

}

preacct {
        preprocess
        acct_unique
        suffix
        files
}

accounting {
        detail
        unix
        sql
        exec
        attr_filter.accounting_response

}

session {

}

post-auth {
        if (session-state:User-Name && reply:User-Name && request:User-Name && (reply:User-Name == request:User-Name)) {
                update reply {
                        &User-Name !* ANY
                }
        }

        update {
                &reply: += &session-state:
        }

        cui
        reply_log
        logovi_test
#       -sql
        exec
        insert_acct_class
        remove_reply_message_if_eap
        Post-Auth-Type REJECT {
#               -sql
                attr_filter.access_reject
                eap
                remove_reply_message_if_eap
        }

        Post-Auth-Type Challenge {
        }

        Post-Auth-Type Client-Lost {
        }

        if (EAP-Key-Name && &reply:EAP-Session-Id) {
                update reply {
                        &EAP-Key-Name := &reply:EAP-Session-Id
                }
        }


}

pre-proxy {

        cui

        if("%{Packet-Type}" != "Accounting-Request") {
                attr_filter.pre-proxy
        }

        pre_proxy_log
}

post-proxy {

        post_proxy_log
        eap
}
}

Zatim, potrebno je preći u poddirektorijum /usr/local/etc/raddb/sites-enabled i napraviti soft link ka eduroam virtuelnom tunelu iz poddirektorijuma /usr/local/etc/raddb/sites-available:

cd ../sites-enabled/
ln -s ../sites-available/eduroam
unlink default
unlink inner-tunnel

Fajl radiusd.conf

Davalac Resursa ima obavezu da čuva log fajlove, tako da treba da se omogući beleženje log poruka u radius.log fajlu. Ovaj fajl se nalazi u /usr/local/var/log/radius direktorijumu.

Kako bi se omogućilo upisivanje log poruka, prelazi se u direktorijum /usr/local/etc/raddb i treba izmeniti fajl radiusd.conf .

cd /usr/local/etc/raddb
vim radiusd.conf

Potrebno je zakomentarisati liniju auth = no i ispod nje dodati liniju:

        auth = yes

Izgled fajla radiusd.conf nakon izmena:

prefix = /usr/local
exec_prefix = ${prefix}
sysconfdir = ${prefix}/etc
localstatedir = ${prefix}/var
sbindir = ${exec_prefix}/sbin
logdir = ${localstatedir}/log/radius
raddbdir = ${sysconfdir}/raddb
radacctdir = ${logdir}/radacct
name = radiusd
confdir = ${raddbdir}
modconfdir = ${confdir}/mods-config
certdir = ${confdir}/certs
cadir   = ${confdir}/certs
run_dir = ${localstatedir}/run/${name}
db_dir = ${raddbdir}
libdir = ${exec_prefix}/lib
pidfile = ${run_dir}/${name}.pid
max_request_time = 30
cleanup_delay = 5
max_requests = 16384
hostname_lookups = no

log {
        destination = files
        colourise = yes
        file = ${logdir}/radius.log
        syslog_facility = daemon
        stripped_names = no

#       auth = no
        auth = yes

        auth_badpass = no
        auth_goodpass = no
        msg_denied = "You are already logged in - access denied"

}

checkrad = ${sbindir}/checkrad

ENV {
}

security {
        allow_core_dumps = no
        max_attributes = 200
        reject_delay = 1
        status_server = yes
        allow_vulnerable_openssl = no
}

proxy_requests  = yes
$INCLUDE proxy.conf
$INCLUDE clients.conf

thread pool {
        start_servers = 5
        max_servers = 32
        min_spare_servers = 3
        max_spare_servers = 10
        max_requests_per_server = 0
        auto_limit_acct = no
}


modules {
        $INCLUDE mods-enabled/
}

instantiate {
}

policy {
        $INCLUDE policy.d/
}

$INCLUDE sites-enabled/

sql modul

Izmena modula sql ukoliko se PostgreSQL baza instalira na istoj VM

vim /usr/local/etc/raddb/mods-available/sql
  • Zakomentarisati liniju dialect = "sqlite" i ispod nje dodati sledeću liniju:
        dialect = "postgresql"
  • Zakomentarisati liniju driver = "rlm_sql_null" i ispod nje dodati sledeću liniju:
        driver = "rlm_sql_postgresql"

Sledeći koraci se odnose na sekciju Connection info:

  • Ispod linije #server = "localhost" dodati sledeću liniju ukoliko se PostgreSQL baza instalira na ovoj VM:
        server = "localhost"
  • Ispod linije #port = 3306 dodati sledeću liniju:
        port = 5432
  • Ispod linije #login = "radius" dodati sledeću liniju:
        login = "radius"
  • Ispod linije #password = "radpass" dodati sledeću liniju:
        password = "L0z1nk@123"

Postupak instalacije PostgreSQL baze sledi u nastavku uputstva, bitno je da radius korisnik koji se bude kreirao u PostgreSQL bazi ima lozinku koja se ovde navodi.

Prikaz fajla sql sa svim potrebnim izmenama:

sql {
#       dialect = "sqlite"
        dialect = "postgresql"
#       driver = "rlm_sql_null"
        driver = "rlm_sql_postgresql"

        sqlite {
                filename = "/tmp/freeradius.db"
                busy_timeout = 200
                bootstrap = "${modconfdir}/${..:name}/main/sqlite/schema.sql"
        }

        mysql {
                tls {
                        ca_file = "/etc/ssl/certs/my_ca.crt"
                        ca_path = "/etc/ssl/certs/"
                        certificate_file = "/etc/ssl/certs/private/client.crt"
                        private_key_file = "/etc/ssl/certs/private/client.key"
                        cipher = "DHE-RSA-AES256-SHA:AES128-SHA"
                        tls_required = yes
                        tls_check_cert = no
                        tls_check_cert_cn = no
                }

                warnings = auto
        }

        postgresql {
                send_application_name = yes
        }

        mongo {
                appname = "freeradius"

                tls {
                        certificate_file = /path/to/file
                        certificate_password = "password"
                        ca_file = /path/to/file
                        ca_dir = /path/to/directory
                        crl_file = /path/to/file
                        weak_cert_validation = false
                        allow_invalid_hostname = false
                }
        }

        # Connection info:
        #
#       server = "localhost"
        server = "localhost"
#       port = 3306
        port = 5432
#       login = "radius"
        login = "radius"
#       password = "radpass"
        password = "L0z1nk@123"

        radius_db = "radius"
        acct_table1 = "radacct"
        acct_table2 = "radacct"
        postauth_table = "radpostauth"
        authcheck_table = "radcheck"
        groupcheck_table = "radgroupcheck"
        authreply_table = "radreply"
        groupreply_table = "radgroupreply"
        usergroup_table = "radusergroup"
        delete_stale_sessions = yes


        pool {
                start = ${thread[pool].start_servers}
                min = ${thread[pool].min_spare_servers}
                max = ${thread[pool].max_servers}
                spare = ${thread[pool].max_spare_servers}
                uses = 0
                retry_delay = 30
                lifetime = 0
                idle_timeout = 60

        }
        client_table = "nas"
        group_attribute = "SQL-Group"
        $INCLUDE ${modconfdir}/${.:name}/main/${dialect}/queries.conf
}

Kada je završena konfiguracija sql modula, potrebno je preći u poddirektorijum /usr/local/etc/raddb/mods-enabled i napraviti soft link ka sql modulu iz poddirektorijuma /usr/local/etc/raddb/mods-available:

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

Izmena modula sql ukoliko se PostgreSQL baza instalira na zasebnoj VM

vim /usr/local/etc/raddb/mods-available/sql
  • Zakomentarisati liniju dialect = "sqlite" i ispod nje dodati sledeću liniju:
        dialect = "postgresql"
  • Zakomentarisati liniju driver = "rlm_sql_null" i ispod nje dodati sledeću liniju:
        driver = "rlm_sql_postgresql"

Sledeći koraci se odnose na sekciju Connection info:

  • Ispod linije #server = "localhost" dodati sledeću liniju gde se navodi IP adresa VM na kojoj je PostgreSQL baza:
        server = "147.xxx.xxx"
  • Ispod linije #port = 3306 dodati sledeću liniju:
        port = 5432
  • Ispod linije #login = "radius" dodati sledeću liniju:
        login = "radius"
  • Ispod linije #password = "radpass" dodati sledeću liniju:
        password = "L0z1nk@123"

Postupak instalacije PostgreSQL baze sledi u nastavku uputstva, bitno je da radius korisnik koji se bude kreirao u PostgreSQL bazi ima lozinku koja se ovde navodi.

Prikaz fajla sql sa svim potrebnim izmenama:

sql {
#       dialect = "sqlite"
        dialect = "postgresql"
#       driver = "rlm_sql_null"
        driver = "rlm_sql_postgresql"

        sqlite {
                filename = "/tmp/freeradius.db"
                busy_timeout = 200
                bootstrap = "${modconfdir}/${..:name}/main/sqlite/schema.sql"
        }

        mysql {
                tls {
                        ca_file = "/etc/ssl/certs/my_ca.crt"
                        ca_path = "/etc/ssl/certs/"
                        certificate_file = "/etc/ssl/certs/private/client.crt"
                        private_key_file = "/etc/ssl/certs/private/client.key"
                        cipher = "DHE-RSA-AES256-SHA:AES128-SHA"
                        tls_required = yes
                        tls_check_cert = no
                        tls_check_cert_cn = no
                }

                warnings = auto
        }

        postgresql {
                send_application_name = yes
        }

        mongo {
                appname = "freeradius"

                tls {
                        certificate_file = /path/to/file
                        certificate_password = "password"
                        ca_file = /path/to/file
                        ca_dir = /path/to/directory
                        crl_file = /path/to/file
                        weak_cert_validation = false
                        allow_invalid_hostname = false
                }
        }

        # Connection info:
        #
#       server = "localhost"
        server = "1xx.xxx.xxx"
#       port = 3306
        port = 5432
#       login = "radius"
        login = "radius"
#       password = "radpass"
        password = "L0z1nk@123"

        radius_db = "radius"
        acct_table1 = "radacct"
        acct_table2 = "radacct"
        postauth_table = "radpostauth"
        authcheck_table = "radcheck"
        groupcheck_table = "radgroupcheck"
        authreply_table = "radreply"
        groupreply_table = "radgroupreply"
        usergroup_table = "radusergroup"
        delete_stale_sessions = yes


        pool {
                start = ${thread[pool].start_servers}
                min = ${thread[pool].min_spare_servers}
                max = ${thread[pool].max_servers}
                spare = ${thread[pool].max_spare_servers}
                uses = 0
                retry_delay = 30
                lifetime = 0
                idle_timeout = 60

        }
        client_table = "nas"
        group_attribute = "SQL-Group"
        $INCLUDE ${modconfdir}/${.:name}/main/${dialect}/queries.conf
}

Kada je završena konfiguracija sql modula, potrebno je preći u poddirektorijum /usr/local/etc/raddb/mods-enabled i napraviti soft link ka sql modulu iz poddirektorijuma /usr/local/etc/raddb/mods-available:

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

cui modul

Izmena modula cui ukoliko se PostgreSQL baza instalira na istoj VM

cd /usr/local/etc/raddb/mods-available
vim cui

Sledi detaljan prikaz svih izmena fajla cui po koracima:

  • Zakomentarisati liniju dialect = "sqlite" i ispod nje dodati liniju:
        dialect = "postgresql"

Specificirati podatke o PostgreSQL bazi

  • Iskopirati sledeći deo uz zamenu lozinke radius korisnika prema vašem izboru odmah iznad linije pool { :
1
2
3
4
5
        server = 127.0.0.1
        port = 5432
        login = "radius"
        password = "L0z1nk@123"
        radius_db = "radius"

Postupak instalacije PostgreSQL baze sledi u nastavku uputstva, bitno je da radius korisnik koji se bude kreirao u PostgreSQL bazi ima lozinku koja se ovde navodi.

Prikaz fajla cui sa svim potrebnim izmenama:

sql cuisql {
#        dialect = "sqlite"
        dialect = "postgresql"
        driver = "rlm_sql_${dialect}"

        sqlite {
                filename = ${radacctdir}/cui.sqlite
                bootstrap = ${modconfdir}/${..:name}/cui/sqlite/schema.sql
        }

        server = 127.0.0.1
        port = 5432
        login = "radius"
        password = "L0z1nk@123"
        radius_db = "radius"

        pool {
                start = 5
                min = 4
                max = 10
                spare = 3
                uses = 0
                lifetime = 0
                idle_timeout = 60
        }

        cui_table = "cui"
        sql_user_name = "%{User-Name}"

        $INCLUDE ${modconfdir}/${.:name}/cui/${dialect}/queries.conf
}

Kada je završena konfiguracija cui modula, potrebno je preći u poddirektorijum /usr/local/etc/raddb/mods-enabled i napraviti soft link ka cui modulu iz poddirektorijuma /usr/local/etc/raddb/mods-available:

cd /usr/local/etc/raddb/mods-enabled
ln -s ../mods-available/cui

Izmena modula cui ukoliko se PostgreSQL baza instalira na zasebnoj VM

cd /usr/local/etc/raddb/mods-available
vim cui

Sledi detaljan prikaz svih izmena fajla cui po koracima:

  • Zakomentarisati liniju dialect = "sqlite" i ispod nje dodati liniju:
        dialect = "postgresql"

Specificirati podatke o PostgreSQL bazi

  • Iskopirati sledeći deo uz zamenu lozinke radius korisnika prema vašem izboru odmah iznad linije pool { :
1
2
3
4
5
        server = "1xx.xxx.xxx.xxx"
        port = 5432
        login = "radius"
        password = "L0z1nk@123"
        radius_db = "radius"

Postupak instalacije PostgreSQL baze sledi u nastavku uputstva, bitno je da radius korisnik koji se bude kreirao u PostgreSQL bazi ima lozinku koja se ovde navodi.

Prikaz fajla cui sa svim potrebnim izmenama:

sql cuisql {

        dialect = "sqlite"

        driver = "rlm_sql_${dialect}"

        sqlite {
                filename = ${radacctdir}/cui.sqlite
                bootstrap = ${modconfdir}/${..:name}/cui/sqlite/schema.sql
        }

        server = "1xx.xxx.xxx.xxx"
        port = 5432
        login = "radius"
        password = "L0z1nk@123"
        radius_db = "radius"

        pool {
                start = 5
                min = 4
                max = 10
                spare = 3
                uses = 0
                lifetime = 0
                idle_timeout = 60
        }

        cui_table = "cui"
        sql_user_name = "%{User-Name}"

        $INCLUDE ${modconfdir}/${.:name}/cui/${dialect}/queries.conf
}

Kada je završena konfiguracija cui modula, potrebno je preći u poddirektorijum /usr/local/etc/raddb/mods-enabled i napraviti soft link ka cui modulu iz poddirektorijuma /usr/local/etc/raddb/mods-available:

cd /usr/local/etc/raddb/mods-enabled
ln -s ../mods-available/cui

Fajl post-proxy

Potrebno je izmeniti fajl post-proxy u okviru direktorijuma /usr/local/etc/raddb/mods-config/attr_filter/

vim /usr/local/etc/raddb/mods-config/attr_filter/post-proxy

Nakon linije Operator-Name =* ANY, a pre linije Port-Limit <= 2 definisati dva dodatna atributa tako sto se dodaju linije:

        User-Name =* ANY,
        Chargeable-User-Identity =* ANY,

Sledi prikaz fajla post-proxy sa izvršenom izmenom:

DEFAULT
        Framed-IP-Address == 255.255.255.254,
        Framed-IP-Netmask == 255.255.255.255,
        Framed-MTU >= 576,
        Framed-Filter-ID =* ANY,
        Reply-Message =* ANY,
        Proxy-State =* ANY,
        EAP-Message =* ANY,
        Message-Authenticator =* ANY,
        MS-MPPE-Recv-Key =* ANY,
        MS-MPPE-Send-Key =* ANY,
        MS-CHAP-MPPE-Keys =* ANY,
        State =* ANY,
        Session-Timeout <= 28800,
        Idle-Timeout <= 600,
        Calling-Station-Id =* ANY,
        Operator-Name =* ANY,
        User-Name =* ANY,
        Chargeable-User-Identity =* ANY,
        Port-Limit <= 2

Konfiguracija CUI atributa

Ako dođe do sigurnosnog incidenta u eduroam servisu, u najvećem broju slučajeva Davalac Resursa u svojim logovima može da pronađe samo anonimni identitet korisnika (anonymous@idp.ac.rs). U tom slučaju, dok se dotični korisnik ne identifikuje u bazi Davaoca Identiteta, Davalac Resursa jedino može da blokira ceo domen problematičnog korisnika. Rešenje ovog problema se postiže korišćenjem CUI atributa.

CUI (Chargeable User Identity) predstavlja jednistveni identifikator svakog eduroam korisnika, formira ga Davalac Identiteta i šalje Davaocu Resursa.

Ako je autentifikacija uspešna, Davalac Identiteta formira CUI atribut formiranjem MD5 hash-a koristeći UID korisnika, Operator-Name atribut iz zahteva i opciono ključa (u ovom primeru cui_hash_key). Ova vrednost se u Access-Accept poruci vraća Davaocu Resursa. Bitno je napomenuti da će vrednosti CUI atributa biti različita za istog korisnika, koji koristi eduroam resurse kod različitih Davaoca Resursa.

Izmena fajla cui

  • Preći u poddirektorijum /usr/local/etc/raddb/policy.d
cd /usr/local/etc/raddb/policy.d
  • Izmeniti fajl cui.
vim cui
  • U liniji cui_hash_key = "changeme" umesto dela changeme dodati proizvoljnu lozinku.

  • Zakomentarisati liniju cui_require_operator_name = "no" i ispod nje dodati liniju:

cui_require_operator_name = "yes"

Sledi prikaz fajla cui sa izvršenom izmenom:

cui_hash_key = "Lozink@123"

#cui_require_operator_name = "no"
cui_require_operator_name = "yes"

cui.authorize {
        if ("%{client:add_cui}" == 'yes') {
                update request {
                        &Chargeable-User-Identity := 0x00
                }
        }
}

cui.pre-proxy {
        if (("%{request:Packet-Type}" == 'Access-Request') && ("%{client:add_cui}" == 'yes')) {
                update proxy-request {
                        &Chargeable-User-Identity = 0x00
                }
        }
}

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:%{User-Name}%{%{Operator-Name}:-}}}"
                }
        }

        if (&reply:Chargeable-User-Identity) {
                update {
                        &reply:User-Name := &request:User-Name
                }
                cuisql
        }
}

cui-inner.post-auth {
        if (&outer.request:Chargeable-User-Identity && \
            (&outer.request:Operator-Name || ('${policy.cui_require_operator_name}' != 'yes'))) {
                update reply {
                        &Chargeable-User-Identity := "%{sha1:${policy.cui_hash_key}%{tolower:%{User-Name}%{%{outer.request:Operator-Name}:-}}}"
                }
        }
}

cui.accounting {
        if (!&Chargeable-User-Identity) {
                update request {
                        &Chargeable-User-Identity := "%{cuisql:\
                                SELECT cui FROM cui \
                                WHERE clientipaddress = '%{%{Packet-Src-IPv6-Address}:-%{Packet-Src-IP-Address}}' \
                                AND callingstationid = '%{Calling-Station-Id}' \
                                AND username = '%{User-Name}'}"
                }
        }

        if (&Chargeable-User-Identity && (&Chargeable-User-Identity != '')) {
                cuisql
        }
}

Modul linelog_test

Potrebno je kreirati modul linelog_test koji služi za testiranje zapisa i parametara sesije. Ovaj korak nije obavezan, ali može biti od koristi pri testiranju rada servera i postupka slanja atribura.

Otići na putanju /usr/local/etc/raddb/mods-available

cd /usr/local/etc/raddb/mods-available

Kreirati fajl linelog_test

vim linelog_test

Iskopirati sledeći sadržaj u kreiran fajl:

linelog logovi_test {
        filename = ${logdir}/logovi_test
        format = ""
        reference = "%{%{reply:Packet-Type}:-format}"
        Access-Accept ="eduroam-auth#IdP=%{request:Realm}#User=%{User-Name}#MAC=%{tolower:%{Calling-Station-Id}}#NAS=%{Called-Station-Id}#IP=%{Framed-IP-Address}#NASSRC=%{Packet-Src-IP-Address}#NASIP=%{NAS-IP-Address}#CUI=%{%{%{reply:Chargeable-User-Identity}:-%{outer.reply:Chargeable-User-Identity}}:-Unknown}#RESULT=OK#"
        Access-Reject ="eduroam-auth#IdP=%{request:Realm}#User=%{User-Name}#MAC=%{tolower:%{Calling-Station-Id}}#NAS=%{Called-Station-Id}#IP=%{Framed-IP-Address}#NASSRC=%{Packet-Src-IP-Address}#NASIP=%{NAS-IP-Address}#CUI=%{%{%{reply:Chargeable-User-Identity}:-%{outer.reply:Chargeable-User-Identity}}:-Local User}#RESULT=FAIL#"
}

Zatim je potrebno je preći u poddirektorijum /usr/local/etc/raddb/mods-enabled i napraviti soft link ka linelog_test modulu iz poddirektorijuma /usr/local/etc/raddb/mods-available:

cd /usr/local/etc/raddb/mods-enabled
ln -s ../mods-available/linelog_test

Fajl clients.conf

  • clients.conf fajl se nalazi u direktorijumu /usr/local/etc/raddb i predstavlja modul u kome se definišu RADIUS klijenti - uređaji i mreži od kojih se prihvataju zahtevi.

  • Davaoci Resursa imaju svoje mrežne uređaje (NAS - Network Access Server), koje koriste kao pristupnu infrastrukturu za eduroam servis. NAS uređaji mogu biti Access Point uređaki, WLC kontroleri ili svičevi koji podržavaju 802.1x standard. Oni se moraju podesiti tako da vrše kontrolu pristupa korisnika, što obuhvata aktiviranje 802.1x protokola, konfigurisanje autentifikacije korišćenjem RADIUS servera i sl. (nije predmet ovog uputstva).

  • Na FreeRADIUS serveru je potrebno definisati NAS uređaje kao klijente RADIUS servera, što se konfiguriše u okviru fajla /usr/local/etc/raddbclients.conf. Pored osnovne konfiguracije (za Davaoca Identiteta) u kojoj se definišu AMRES FTLR serveri i NetIIS server za nadgledanje, potrebno je dodati kijenta za svaki NAS uređaj.

  • Šifra potrebna za komunikaciju sa klijentima se definiše u secret. Ovaj parametar se dobija lično ili telefonskim putem od AMRES-a i njega je potrebno zameniti u konfiguraciji.

vim /usr/local/etc/raddb/clients.conf
  • Na kraj fajla dodati sledeće linije:
client ftlr1.ac.rs {
 ipaddr           = 147.91.4.204
 secret           = pass # - lozinka se dobija od AMRES-a
 shortname        = ftlr1
 nas_type         = other
 virtual_server   = eduroam
}

client monitor.eduroam.ac.rs {
 ipaddr           = 147.91.3.12
 secret           = pass # - lozinka se dobija od AMRES-a
 shortname        = netiis
 nas_type         = other
 virtual_server   = eduroam
}

client ftlr2.ac.rs {
 ipaddr           = 147.91.1.101
 secret           = pass # - lozinka se dobija od AMRES-a
 shortname        = ftlr2
 nas_type         = other
 virtual_server   = eduroam
}

client monitor2.eduroam.ac.rs {
 ipaddr           = 147.91.56.177
 secret           = pass # - lozinka se dobija od AMRES-a
 shortname        = netiis2
 nas_type         = other
 virtual_server   = eduroam
 }

client NAS-naziv {
 ipaddr = 1.1.1.1 # IP adresa NAS-a
 secret = pass # lozinka podešena na NAS-u ka radius-u
 shortname = AP-br # skraćeno ime NAS-a
 nastype = other
 virtual_server = eduroam
 add_cui = yes
}

Fajl proxy.conf

proxy.conf se nalazi u /usr/local/etc/raddb direktorijumu. Ovaj konfiguracioni fajl omogućava serveru da zna na koji način će obrađivati pristigle RADIUS zahteve.

Zahtevi se mogu obrađivati lokalno ili se mogu prosleđivati (proksirati) nekom drugom serveru. Kako je ovo uputstvo namenjeno za Davaoca Resursa, smatra se da se zahtevi obrađuju lokalno. Ovo znači da je potrebno definisati samo lokalni domen (realm) i u njemu označiti da se korisnici autentifikuju lokalno.

Linije koje su označene se dodaju u fajl.

cd /usr/local/etc/raddb
vim proxy.conf

Prvi korak se odnosi na home_server localhost sekciju.

  • Zakomentarisati liniju type = auth i ispod nje dobiti liniju:
        type = auth+acct

Sledeći korak je da se nakon sekcije realm LOCAL doda sledeće:

Napomena: Šifra potrebna za komunikaciju sa FTLR serverima se definiše u secret. Ovaj parametar se dobija lično ili telefonskim putem od AMRES-a i njega je potrebno zameniti u konfiguraciji.

home_server amres.eduroam.ftlr1 {
        type    = auth+acct
        ipaddr  = 147.91.4.204
        port    = 1812
        secret  = pass # - lozinka se dobija od AMRES-a
        response_window = 20
        zombie_period = 40
        revive_interval = 120
        status_check = status-server
        check_interval = 30
        check_timeout = 4
        num_answers_to_alive = 3
        max_outstanding = 65536
}

home_server amres.eduroam.ftlr2 {
        type    = auth+acct
        ipaddr  = 147.91.1.101
        port    = 1812
        secret  = pass # - lozinka se dobija od AMRES-a
        response_window = 20
        zombie_period = 40
        revive_interval = 120
        status_check = status-server
        check_interval = 30
        check_timeout = 4
        num_answers_to_alive = 3
        max_outstanding = 65536
}

home_server_pool amres.eduroam {
        type        = fail-over
        home_server = amres.eduroam.ftlr1
        home_server = amres.eduroam.ftlr2
}

realm "~.*\.rs$" {
        pool = amres.eduroam
        nostrip
}
realm "~.*\$" {
        pool = amres.eduroam
        nostrip
}
realm "~.+$" {
        pool = amres.eduroam
        nostrip
}

realm NULL {
}

Prikaz fajla proxy.conf sa svim potrebnim izmenama:

proxy server {
        default_fallback = no
}

home_server localhost {
#       type = auth
        type = auth+acct
        ipaddr = 127.0.0.1
        port = 1812
        secret = testing123
        response_window = 20
        zombie_period = 40
        revive_interval = 120
        status_check = status-server
        check_interval = 30
        check_timeout = 4
        num_answers_to_alive = 3
        max_outstanding = 65536

        coa {
                irt = 2
                mrt = 16
                mrc = 5
                mrd = 30
        }

        limit {
              max_connections = 16
              max_requests = 0
              lifetime = 0
              idle_timeout = 0
        }

}


home_server_pool my_auth_failover {
        type = fail-over
        home_server = localhost
}


realm example.com {
        auth_pool = my_auth_failover
}

realm LOCAL {
}

home_server amres.eduroam.ftlr1 {
        type    = auth+acct
        ipaddr  = 147.91.4.204
        port    = 1812
        secret  = pass # - lozinka se dobija od AMRES-a
        response_window = 20
        zombie_period = 40
        revive_interval = 120
        status_check = status-server
        check_interval = 30
        check_timeout = 4
        num_answers_to_alive = 3
        max_outstanding = 65536
}

home_server amres.eduroam.ftlr2 {
        type    = auth+acct
        ipaddr  = 147.91.1.101
        port    = 1812
        secret  = pass # - lozinka se dobija od AMRES-a
        response_window = 20
        zombie_period = 40
        revive_interval = 120
        status_check = status-server
        check_interval = 30
        check_timeout = 4
        num_answers_to_alive = 3
        max_outstanding = 65536
}

home_server_pool amres.eduroam {
        type        = fail-over
        home_server = amres.eduroam.ftlr1
        home_server = amres.eduroam.ftlr2
}

realm "~.*\.rs$" {
        pool = amres.eduroam
        nostrip
}
realm "~.*\$" {
        pool = amres.eduroam
        nostrip
}
realm "~.+$" {
        pool = amres.eduroam
        nostrip
}

realm NULL {
}

Spisak linkovanih modula

cd /usr/local/etc/raddb/mods-enabled/; ll
lrwxrwxrwx 1 root root 24 Sep 30 12:33 always -> ../mods-available/always
lrwxrwxrwx 1 root root 29 Sep 30 12:33 attr_filter -> ../mods-available/attr_filter
lrwxrwxrwx 1 root root 22 Sep 30 12:33 chap -> ../mods-available/chap
lrwxrwxrwx 1 root root 21 Nov  7 11:37 cui -> ../mods-available/cui
lrwxrwxrwx 1 root root 22 Sep 30 12:33 date -> ../mods-available/date
lrwxrwxrwx 1 root root 24 Sep 30 12:33 detail -> ../mods-available/detail
lrwxrwxrwx 1 root root 28 Sep 30 12:33 detail.log -> ../mods-available/detail.log
lrwxrwxrwx 1 root root 24 Sep 30 12:33 digest -> ../mods-available/digest
lrwxrwxrwx 1 root root 33 Sep 30 12:33 dynamic_clients -> ../mods-available/dynamic_clients
lrwxrwxrwx 1 root root 21 Sep 30 12:33 eap -> ../mods-available/eap
lrwxrwxrwx 1 root root 22 Sep 30 12:33 echo -> ../mods-available/echo
lrwxrwxrwx 1 root root 22 Sep 30 12:33 exec -> ../mods-available/exec
lrwxrwxrwx 1 root root 28 Sep 30 12:33 expiration -> ../mods-available/expiration
lrwxrwxrwx 1 root root 22 Sep 30 12:33 expr -> ../mods-available/expr
lrwxrwxrwx 1 root root 23 Sep 30 12:33 files -> ../mods-available/files
lrwxrwxrwx 1 root root 25 Sep 30 12:33 linelog -> ../mods-available/linelog
lrwxrwxrwx 1 root root 30 Nov  7 12:22 linelog_test -> ../mods-available/linelog_test
lrwxrwxrwx 1 root root 27 Sep 30 12:33 logintime -> ../mods-available/logintime
lrwxrwxrwx 1 root root 24 Sep 30 12:33 mschap -> ../mods-available/mschap
lrwxrwxrwx 1 root root 27 Sep 30 12:33 ntlm_auth -> ../mods-available/ntlm_auth
lrwxrwxrwx 1 root root 21 Sep 30 12:33 pap -> ../mods-available/pap
lrwxrwxrwx 1 root root 24 Sep 30 12:33 passwd -> ../mods-available/passwd
lrwxrwxrwx 1 root root 28 Sep 30 12:33 preprocess -> ../mods-available/preprocess
lrwxrwxrwx 1 root root 25 Sep 30 12:33 radutmp -> ../mods-available/radutmp
lrwxrwxrwx 1 root root 23 Sep 30 12:33 realm -> ../mods-available/realm
lrwxrwxrwx 1 root root 27 Sep 30 12:33 replicate -> ../mods-available/replicate
lrwxrwxrwx 1 root root 21 Sep 30 12:33 soh -> ../mods-available/soh
lrwxrwxrwx 1 root root 21 Oct 17 15:34 sql -> ../mods-available/sql
lrwxrwxrwx 1 root root 26 Sep 30 12:33 sradutmp -> ../mods-available/sradutmp
lrwxrwxrwx 1 root root 22 Sep 30 12:33 totp -> ../mods-available/totp
lrwxrwxrwx 1 root root 22 Sep 30 12:33 unix -> ../mods-available/unix
lrwxrwxrwx 1 root root 24 Sep 30 12:33 unpack -> ../mods-available/unpack
lrwxrwxrwx 1 root root 22 Sep 30 12:33 utf8 -> ../mods-available/utf8

Instalacija i podešavanje PostgreSQL baze podataka

Sledeći korak predstavlja instalaciju i podešavanje PostgreSQL baze podataka.

Data Vam je mogućnost da bazu instalirate na istoj ovoj VM na kojoj ste u prethodnim koracima instalirali RADIUS server ili možete da je instalirate na zasebnoj VM.

Uputstvo za instalaciju PostgreSQL baze podataka na CentOS operativnom sistemu

Uputstvo za instalaciju PostgreSQL baze podataka na Debian operativnom sistemu

Napomena: Nakon instalacije PostgreSQL baze podataka vratite se na ovo uputstvo i ispratite nastavak.

Provera konfiguracije RADIUS servera

Ovim su završena osnovna podešavanja neophodna za funkcionisanje RADIUS servera.

Za proveru konfiguracije preporuka je da se RADIUS proces pokrene prvo u debug modu, komandom radiusd -X

Preporuka je da se debug mod koristi samo u slučaju kada se prave izmene u konfiguraciji ili u slučaju kada neko od korisnika ima problem sa povezivanjem na eduroam, jer se u debug modu lozike prikazuju u clear-text formatu.

radiusd -X

Ukoliko je konfiguracija bez grešaka, na ekranu se ispisuje sledeće:

.
.
.
Listening on auth+acct address * port 1812 bound to server eduroam
Listening on acct address * port 1813 bound to server eduroam
Listening on auth address :: port 1812 bound to server eduroam
Listening on acct address :: port 1813 bound to server eduroam
Listening on proxy address * port xxxxx
Listening on proxy address :: port xxxxx
Ready to process requests

Prekid rada RADIUS procesa u debug modu, se izvršava sa CTRL+C

RADIUS proces u standardnom modu se pokreće komandom radiusd

radiusd

RADIUS proces se po potrebi zaustavlja se komandom killall radiusd, ukoliko je potrebno izmeniti konfiguraciju ili ukoliko postoji problem u povezivanju na eduroam servis i gde je potrebno istražiti problem

killall radiusd

Pridruživanje AMRES eduroam servisu

Na stranici http://www.eduroam.amres.ac.rs/rs/institucije-prikljucivanje.html možete da pročitate o tome šta je šta je potrebno da se Vaša institucija pridruži AMRES eduroam servisu.

Pregled logova

Pregled log direktorijuma na VM

[root@test radius]# cd /usr/local/var/log/radius
[root@test radius]# ll
total 44
-rw------- 1 root root   539 Nov  8 17:42 logovi_test
drwx------ 3 root root    23 Nov  7 12:25 radacct
-rw-r----- 1 root root 12525 Nov  7 16:54 radius.log
-rw-r--r-- 1 root root 21120 Nov 23 09:47 radwtmp
Napomena: Možete da koristite radius.log fajl da proverite pristup korisnika. U okviru ovog fajla bi se takođe ispisala i adekvatna poruka ukoliko npr. sertifikat nije validan
Fri Jan  6 09:26:15 2023 : ERROR: (77794) eap_ttls: ERROR: (TLS) Alert read:fatal:certificate expired
Fri Jan  6 09:26:15 2023 : ERROR: (77794) eap_ttls: ERROR: (TLS) Server : Failed in error
Fri Jan  6 09:26:15 2023 : ERROR: (77794) eap_ttls: ERROR: (TLS) Failed reading from OpenSSL
Fri Jan  6 09:26:15 2023 : Auth: (77794) Login incorrect (eap_ttls: (TLS) Alert read:fatal:certificate expired): [anonymous@xxxx.institucija.ac.rs] (from client ftlr1 port 0 cli XX-XX-XX-XX-XX-XX)
Napomena: Za detaljnije podatke o validnosti konfiguracije radius servera najbolje je pustiti radius servis u debug modu korišćenjem sledeće komande:
radiusd -X
  • Prekid rada radius procesa u debug modu izvršava se klikom na: CTRL+C.

  • Nakon što ustanovite da je konfiguracija ispravna možete pokrenuti radius proces regularno komandom:

radiusd

Provera verzije instaliranog FreeRADIUS paketa

radiusd -v

Primena logrotate funkcije

Kada je aktiviran upis logova, može da se desi posle određenog vremena da server bude preopterećen. Rezultati preopterećenja mogu biti različiti.

Najgori slučaj podrazumeva prekid rada servera. Za servere koji opslužuju veliki broj korisnika, ovo može predstavljati problem. Korišćenjem logrotate funkcije se može znatno smanjiti opterećenje servera.

Podešavanje logrotate funkcije

Sva podešavanja logrotate funkcije se obavljaju u logrotate.conf fajlu. Ovaj fajl se nalazi u /etc direktorijumu.

vim /etc/logrotate.conf

Izgled fajla pre izmena je dat u nastavku:

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.

Za pregled i opis svih logrotate funkcionalnosti može se primeniti komanda:

man logrotate

Direktorijume i log fajlove koje želite da rotirate potrebno je dodati na kraj ovog konfiguracionog fajla. U zavisnosti od potreba, može se koristiti širok spektar različitih kombinacija komandi. Neke od najzačajnih su date u nastavku, uz odgovarajuće objašnjenje:

  • compress – omogućava da se fajlovi kompresuju, default vrednost je gunzip.

  • extension – ne označava tip ekstenzije, već ekstenziju koja se dodaje posle imena fajla. Ovo može biti korisno prilikom reimenovanja rotiranih log fajlova. Ukoliko se koristi i compress opcija, tada će pre .gz ekstenzije biti navedena ekstenzija koju je definisao korisnik. Npr. kada je potrebno preimenovati fajl radius.log u radius.log.pera, dodaje se celo ime posle extension naredbe. Kada je navedena i opcija compress, tada će ime rotiranog fajla biti radius.log.pera.gz.

  • mail – pre nego što se log fajl izbriše, može se poslati mejl na adresu koja je navedena, npr. mail pera.peric@idp.ac.rs.

  • postrotate/endscript i pretrotate/endscript – kôd između ove dve komande se izvršava nakon, odnosno pre nego što se log fajl rotira, respektivno.

  • rotate – sintaksa je rotate . Fajlovi se rotiraju tačno puta, pre nego što se obrišu. Ako je count jednak nuli, stare verzije se brišu umesto da se rotiraju. Kada se dođe do poslednje vrednosti, počinje se od početka. Na ovaj način briše se fajl koji je bio rotiran prvi i novi ga zamenjuje.

  • size – log fajlovi se rotiraju kada pređu veličinu koja je navedena. Ako se posle broja koji označava veličinu ne navede ništa, smatra se da se radi o veličini fajla u KB. Može se definisati i veličina u MB, tako što se posle broja navede slovo M.

  • start – broj od koga počinje numeracija log fajlova koji se rotiraju (ako se navede 1, sledeći log fajl će imati broj 2 i tako redom). Ova opcija nije zavisna od rotate opcije, što znači da će fajlovi i dalje biti rotirani onoliko puta koliko je navedeno rotate opcijom.

Pored ovih opcija, moguće je definisati u kom vremenskom intervalu će se logovi rotirati, komandama: daily, monthly i weekly. Ukoliko je potrebno čuvati logove za celu godinu, to je moguće korišćenjem komande monthly u kombinaciji sa rotate funkcijom. Ukoliko se rotira jedan fajl, potrebno je navesti punu putanju do njega, (npr. /usr/local/var/log/radius/radius.log)

Na kraju fajla potrebno je dodati sledeće:

/usr/local/var/log/radius/radius.log {
     daily
     rotate 12
     start 1
     compress
     dateext
}

/usr/local/var/log/radius/logovi_test {
     daily
     rotate 12
     start 1
     compress
     dateext
}

/usr/local/var/log/radius/radwtmp {
     daily
     start 1
     compress
     dateext
}

Primenom ovog koda postiže se :

  • Rotiranje radius.log i logovi_test fajla na mesečnom nivou
  • Kompresija je tipa .gzip
  • Rotiran fajl će imati ekstenziju sa datumom rotacije (npr. radius.log-GGGGMMDD.gz)

Prikaz sadržaja fajla /etc/logrotate.conf:

# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# use date as a suffix of the rotated file
dateext

# uncomment this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.

/usr/local/var/log/radius/radius.log {
     daily
     rotate 12
     start 1
     compress
     dateext
}

/usr/local/var/log/radius/logovi_test {
     daily
     rotate 12
     start 1
     compress
     dateext
}

/usr/local/var/log/radius/radwtmp {
     daily
     start 1
     compress
     dateext
}

Kreiranje skripti za upravljanje logovima (opciono)

Kreirati bin direktorijum u /root direktorijumu ukoliko već ne postoji:

mkdir /root/bin
cd bin

Kreirati navedene tri skripte.

Kreirati skriptu monthly_cleanup.sh, koja služi za brisanje logova starijih od 12 meseci:

vim +x monthly_cleanup.sh
Kopirati sledeći sadržaj:
#!/bin/bash
# Skripta je namenjena brisanju logova kada razlika u mesecima predje 12.
# Pokrece se automatski uz pomoc cron daemon-a svakog prvog u mesecu.
# Na ovaj nacin se pravi "vremenski prozor" koji sadrzi logove za prethodnih 12 meseci,
# obzirom na zakonsku obavezu cuvanja logova. U kombinaciji sa skriptom koja obavlja zipovanje
# na dnevnom nivou se omogucava da se smanji koriscenje memorije.

cd /usr/local/var/log/radius/radacct/
last_year=`date --date='13 months ago' +'%Y%m'`
dir_array=(`ls -l | awk '{print $9}'`)
length=${#dir_array[@]}

for ((i=0; i<$length; i++))
do
cd ${dir_array[i]}/
`rm -rf *-$last_year*`
retval=$?
if [ $retval -eq 0 ]; then
echo "Izbrisani su svi fajlovi za `date --date='13 months ago' +'%-m'`. mesec `date --date='1 year ago' +'%Y'`. godine iz direktorijuma ${dir_array[i]}" >> /tmp/monthly_cleanup_log.txt
#cd ..
#wait
else
echo "Doslo je do greske!" >> /tmp/monthly_cleanup_error_log.txt
fi
#dodato
cd ..
wait
done

chmod +x monthly_cleanup.sh

Kreirati skriptu rad_restart, koja služi za restart radiusd procesa:

vim +x rad_restart
Kopirati sledeći sadržaj:
#!/bin/sh

sleep 5
killall radiusd
#radiusd
/usr/local/sbin/radiusd
exit

chmod +x rad_restart

Kreirati skriptu zip_daily.sh, koja služi za zipovanje log fajlova na dnevnom nivou:

vim +x zip_daily.sh
Kopirati sledeći sadržaj:
#!/bin/bash
# Skripta koja omogucava zipovanje log fajlova na dnevnom nivou.
# Potrebno je obuhvatiti sve fajlove koji se zavrsavaju ekstenzijom
# koja odgovara danasnjem datumu (auth-detail-datum, reply-detail-datum,
# detail-datum, pre-proxy-detail-datum, post-proxy-detail-datum).

cd /usr/local/var/log/radius/radacct/
dir_array=(`ls -l | awk '{print $9}'`)
timestamp=`date --date='1 day ago' +'%Y%m%d'`
dateext=`date +'%Y%m%d'`
length=${#dir_array[@]}

for ((i=0; i<$length; i++))
do
cd ${dir_array[i]}/
`tar czf zip_log-$dateext.tgz *-$timestamp`
retval=$?
if [ $retval -eq 0 ]; then
echo "`date +'%Y %b %d %r'` Zipovanje za direktorijum ${dir_array[i]} je uspesno izvrseno"  >> /tmp/zip_daily_log.txt
`rm -rf *-$timestamp`
#echo "`date +'%Y %b %d %r'` Brisanje fajlova za `date --date='1 day ago' +'%Y%m%d'` je uspesno izvrseno" >> /tmp/daily_cleanup.txt
#cd ..
wait
else
echo "`date +'%Y %b %d %r'` Doslo je do greske za direktorijum ${dir_array[i]}!" >> /tmp/daily_cleanup_error_log.txt
fi
cd ..
done

chmod +x zip_daily.sh

Podesiti crontab:

Potrebno je da se podesi da se navedene skripte monthly_cleanup.sh, rad_restart, zip_daily.sh pokreću u određenim terminima:

crontab -e

Iskopirati sledeće:

0 3 * * * /root/bin/zip_daily.sh
0 5 2 * * /root/bin/monthly_cleanup.sh
0 6 * * * /root/bin/rad_restart
0 12 * * * /root/bin/rad_restart

Sačuvati.

Kreiranje alijasa (opciono)

U cilju lakšeg održavanja RADIUS servera od pomoći bi bilo kreirati "prečice" ka bitnim direktorijumima:

  • prečica r za prelazak u direktorijum /usr/local/etc/raddb/

  • prečica rl za prelazak u direktorijum /usr/local/var/log/radius/

Otvoriti i editovati sledeći fajl:

vim ~/.bashrc

Nakon navođenja poslednjeg alijasa dodati sledeće linije:

alias r='cd /usr/local/etc/raddb/'
alias rl='cd /usr/local/var/log/radius/'

Fajl na kraju izgleda ovako:

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

alias r='cd /usr/local/etc/raddb/'
alias rl='cd /usr/local/var/log/radius/'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
source ~/.bashrc

Procedura kod izmene konfiguracije RADIUS servera

Pregled aktivnosti RADIUS procesa

ps aux | grep radiusd

Pre bilo kakve izmene u konfiguraciji RADIUS servera ili ukoliko se detektuje problem u njegovom funkcionisanju potrebno je najpre zaustaviti RADIUS proces ukoliko je aktivan

killall radiusd

Zatim možete da izvršite promene u konfiguraciji i istražite eventualni problem u funkcionisanju RADIUS servera

Za proveru konfiguracije preporuka je da se RADIUS proces pokrene prvo u debug modu, komandom radiusd -X

Preporuka je da se debug mod koristi samo u slučaju kada se prave izmene u konfiguraciji ili u slučaju kada neko od korisnika ima problem sa povezivanjem na eduroam, jer se u debug modu lozike prikazuju u clear-text formatu.

radiusd -X

Ukoliko je konfiguracija bez grešaka, na ekranu se ispisuje sledeće:

.
.
.
Listening on auth+acct address * port 1812 bound to server eduroam
Listening on acct address * port 1813 bound to server eduroam
Listening on auth address :: port 1812 bound to server eduroam
Listening on acct address :: port 1813 bound to server eduroam
Listening on proxy address * port xxxxx
Listening on proxy address :: port xxxxx
Ready to process requests

Prekid rada RADIUS procesa u debug modu, se izvršava sa CTRL+C

RADIUS proces u standardnom modu se pokreće komandom radiusd

radiusd