Questo post è sostanzialmente un aggiornamento di quest’altro (che era una rielaborazione di un altro ancora
), ma ormai il tempo e l’esperienza consigliano di riscriverlo da zero, invece di aggiornarlo…
Lo scopo di questo howto è ottenere un server che faccia da “ponte” tra una rete interna ed internet, concedendo la connessione però solamente agli utenti autorizzati (da una coppia nome utente / password).
La base per l’installazione, stavolta, è una ubuntu server 10.04 (la distribuzione LTS disponibile in questo moemnto).
Nota importante: è necessario utilizzare la distribuzione a 32 bit, anche su macchine che potrebbero utilizzare quella a 64 bit.
Il perché è legato ad un bug nella gestione della cifratura delle password che non diventa evidente se non avanti nel processo di configurazione.
installazione e configurazione del sistema
Come prima cosa procediamo quindi ad installare il sistema, ed alla richiesta di quali servizi aggiuntivi installare scegliamo openssh-server, così da poter proseguire da remoto con l’installazione/configurazione.
modifichiamo poi /etc/ssh/sshd_config in modo che si legga:
PermitRootLogin no
e riavviamo il server ssh:
$ service ssh restart
in /etc/network/interfaces la struttura dovrà assomigliare a questa:
auto lo
iface lo inet loopback
# eth0: interfaccia verso la rete esterna
# dhcp o statica a seconda delle impostazioni del provider
auto eth0
iface eth0 inet dhcp
# eth1: interfaccia verso la rete interna
auto eth1
iface eth1 inet static
address 0.0.0.0
perché il sistema possa poi far transitare i pacchetti provenienti dagli altri computer è necessario abilitare l’ip forwarding, inserendo in /etc/rc.local la linea:
$ echo "1" > /proc/sys/net/ipv4/ip_forward
ed eseguendola anche nel terminale, per abilitare l’ip forwarding durante il ciclo di vita del sistema corrente.
dopodiché è consigliabile riavviare i servizi di rete (attenzione se siete connessi via ssh) con:
$ service networking restart
Ora dobbiamo installare il modulo tun, che servirà per la pseudointerfaccia interna:
$ apt-get install uml-utilities
$ modprobe tun
$ echo "tun" >> /etc/modules
installazione di chillispot
chillispot è disponibile nei repository di ubuntu, quindi per installarlo:
$ apt-get install chillispot
rispondendo poi alle domande del configuratore:
- server radius 1: 127.0.0.1
- radius password: [radiuspassword]
- interfaccia di rete: quella per la rete interna, nel nostro caso eth1
- url per autenticazione: https://[ip-esterno-del-server]/cgi-bin/hotspotlogin.cgi
- url homepage: https://127.0.0.1 (ma questa andrà poi commentata nel file di configurazione)
- UAM password: [password-condivisa-tra-chilli-e-webserver]
a questo punto chillispot è installato, ma disattivato (lo attiveremo più avanti).
installazione di freeradius e del server mysql
installiamo ciò che ci serve dai repository, insieme alle loro dipendenze:
$ apt-get install mysql-server freeradius freeradius-mysql freeradius-dialupadmin
creiamo la password per l’utente mysql quando ci viene richiesta, e poi creiamo un nuovo database chiamandolo “radius”:
$ mysql -u root -p
[inseriamo la password di mysql root]
mysql> CREATE DATABASE radius;
mysql> quit
creiamo poi l’utente del db “radius” e costruiamo il database usando le tabelle foniteci da freeradius:
$ cat /etc/freeradius/sql/mysql/schema.sql | mysql -u root -p radius
$ mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost' IDENTIFIED BY 'radiusdbpassword';
mysql> FLUSH PRIVILEGES;
mysql> quit
quindi in /etc/freeradius/sql.conf modifichiamo la sezione “Connect info” inserendo i dati di accesso alla base di dati appena impostati
testiamo ora il funzionamento di freeradius: prima usando un file locale per leggere gli utenti, e poi finalmente dal database mysql.
in /etc/freeradius/radiusd.conf impostiamo:
listen {
...
ipaddr = 127.0.0.1
...
}
...
proxy_requests = no
...
poi in /etc/freeradius/users, verso l’inizio del file, inseriamo la riga
test Auth-Type := Local, Cleartext := "testsecret"
e nel file /etc/freeradius/clients.conf impostare correttamente i valori seguenti:
client localhost {
...
ipaddr = [ip-esterno-del-server]
...
secret = [radiuspassword]
...
}
aggiungendo anche un:
client localalias {
ipaddr = 127.0.0.1
secret = [radiuspassword]
shortname = localalias
nastype = other
}
e poi proviamo ad avviare i server freeradius con:
$ service freeradius start
ed a testarlo con:
$ radtest test testsecret 127.0.0.1 0 [radiuspassword]
perché tutto stia funzionando l’output dovrebbe terminare con una riga simile a:
rad_recv: Access-Accept packet from host ...
se dovessero esserci problemi si può avviare il server in modalità debug (meglio in un’altra console, per poi seguirlo in tempo reale) con
$ freeradius -X
se tutto funziona è il momento di spostare l’autenticazione sul db mysql.
nel file /etc/freeradius/radiusd.conf, nella sezione Modules togliere il commento a:
$INCLUDE sql.conf
nel file /etc/freeradius/sites-enabled/default ci assicuriamo di togliere i commenti dalle righe con “sql” e di metterle a quelle con “files”:
authorize {
...
#files
sql
...
}
acct_unique {
…
#files
…
}
accounting {
…
sql
…
}
session {
…
sql
…
}
non cambiare invece i valori nella sezione “post-auth”.
riavviamo freeradius con:
$ service freeradius restart
ed inseriamo un utente di prova nel database:
$ echo "INSERT INTO radcheck (Username, Attribute, Value) VALUES ('mysqltest','Password','testsecret');" | mysql -u root -p
testando alla fine il tutto:
$ radtest mysqltest testsecret 127.0.0.1 0 radiuspassword
come prima, l’ultima riga della risposta dovrebbe assomigliare a:
rad_recv: Access-Accept packet from host ...
installare apache
$ apt-get install apache2 libapache2-mod-php5 libdate-manip-perl php5-mysql
poi in /etc/php5/apache2/php.ini aggiungere, nella sezione “Extensions”:
extension=mysql.so
fatto questo provvediamo ad installare gli script che gestiranno l’autenticazione via web degli utenti:
$ mkdir -p /var/www/hotspot{,/cgi-bin}
$ zcat -c /usr/share/doc/chillispot/hotspotlogin.cgi.gz > /var/www/hotspot/cgi-bin/hotspotlogin.cgi
$ chmod a+x /var/www/hotspot/cgi-bin/hotspotlogin.cgi
per poi modificare in /var/www/hotspot/hotspotlogin.cgi:
$uampassword=[password-condivisa-tra-chilli-e-webserver]
$userpassword=1
va poi creato il file /etc/apache2/sites-available/hotspot eventualmente usando questo come esempio (attenzione agli ip!):
hotspot (togliere il .txt)
a questo punto possiamo abilitare il nuovo sito ed il modulo ssl con:
$ a2ensite hotspot
$ a2enmod ssl
per usare correttamente ssl vanno generati i certificati appropriati, per comodità si può utilizzare apache2-ssl-certificate, creandolo come /usr/sbin/apache2-ssl-certificate (togliere il .txt) dandogli poi i permessi 766 (di root:root)
prima di lanciarlo creiamo la directory /etch/apache2/ssl:
$ mkdir /etc/apache2/ssl
controllando poi che i permessi siano drwxr-xr-x
e creiamo anche /usr/share/apache2/ssleay.cnf di root:root, con permessi 644, mettendoci dentro ssleay.cnf (togliere il _.txt)
finalmente lanciamo:
$ apache2-ssl-certificate
e compiliamo i campi coerentemente (quando viene chiesto “YOUR name” inserite l’ip esterno del server o un nome che un dns possa risolvere correttamente)
riavviamo apache:
$ service apache2 restart
ora andando a visitare https://ip-esterno/cgi-bin/hotspotlogin.cgi dovrebbe comparire una pagina generata da chillispot, che si lamenta che il demone non è in funzione…
ultima parte: configurazione di chillispot
modifichiamo /etc/chilli.conf:
net [fate attenzione che la rete generata non si sovrapponga con qualcosa che già esiste]
radiuslocation [impostarlo correttamente]
radiuslcoationname [impostarlo correttamente]
dhcpif [verificare che punti all'interfaccia giusta (in quest'esempio: eth1) ]
uamserver [dovrebbe essere https://ip-esterno/cgi-bin/hotspotlogin.cgi]
uamlisten [coerente con la rete che vorrete utilizzare]
#uamhomepage [commentato]
uamallowed [che contenga almeno questo pc, per sicurezza]
infine su /etc/default/chillispot impostare:
ENABLED=1
e finalmente…
$ service chillispot start
configurazione di iptables
perché tutto funzioni correttamente è necessario (oltreché consigliabile in ogni caso
) sistemare anche le impostazioni di iptables aggiungendo:
$ iptables -t nat -I POSTROUTING -j MASQUERADE
alle regole che avete per il vostro firewall.
diciamo almeno queste
:
# per riduzione problemi dovuti a brute force ssh
$ iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource
$ iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH --rsource -j DROP
$ iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ iptables -A INPUT -i eth1 -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
$ iptables -A INPUT -i eth1 -j REJECT --reject-with icmp-port-unreachable
# i pacchetti che provengono dall'interfaccia interna ma non sono stati accettati prima vengono droppati
$ iptables -A INPUT -i eth0 -j DROP
# qui arriva solo roba che non viene da eth1 o eth0, principalmente (e sperabilmente solo) tun0 e lo
$ iptables -A INPUT -p tcp -m tcp --dport 443 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
$ iptables -A INPUT -p tcp -m tcp --dport 3990 --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
$ iptables -A INPUT -i lo -j ACCEPT
# per log normativa antiterrorismo italiana 
$ iptables -A FORWARD -s [ip-rete-interna.0]/24 -i tun0 -o eth1 -m state --state NEW -j LOG --log-prefix "HOTSPOT:"
# i pacchetti che arrivano direttamente dal'interfaccia interna ma non passano per tun0 vengono droppati
$ iptables -A FORWARD -i eth0 -j DROP
$ iptables -A FORWARD -o eth0 -j DROP
e poi, come ultima aggiunta (che teniamo separata dato che potrebbe tagliarci fuori):
# ultima cosa: prima di questa accertarsi, se si sta usando ssh, di aver lasciato aperto la strada per questo pc
$ iptables -P INPUT DROP