WebServer stand-alone
WebServer stand-alone
Questo articolo non era in previsione, lo scrivo perché un ragazzo ha necessità di realizzare un web server per l’esame di stato.
Benché ampiamente trattato in precedenza, Giugno e gli esami di stato sono prossimi, non posso permettere che un ragazzo impazzisca nel andare a cercare articoli precedenti e documentazione varia per adattarli alle proprie esigenze, prendo spunto dal suo problema per realizzare questo nuovo progetto basato su Raspberry pi 3 b+. Purtroppo non ho la board in questione e visto il poco tempo a disposizione non faccio in tempo a procurarmene una, tuttavia, grazie a qemu, che fa miracoli, credo di aver emulato perfettamente la board in questione.
Con un sano debootstrap installo la Devuan Ascii sulla micro SD (in realtà io ho un disco emulato).
Prima di procedere è doveroso fare alcune precisazioni.
Firewall
Firewall non è un programma, il firewall non è un oggetto che mi protegge dai cattivi, il firewall è una disciplina matematica che ricade nella branca della sicurezza informatica. Se installo un “FIREWALL” non sono protetto da tutto, un firewall mal configurato o con policy sbagliate è peggio di non avere nulla. Il NAT non è un firewall.
Per configurare un firewall in maniera corretta servono anni di esperienza e di studio, non ci si improvvisa configuratori di firewall.
Ip statito Ip Dinamico
Per poter funzionare, la rete internet necessita del utilizzo del protocollo IP
Un Ip dinamico non potrà MAI e poi MAI diventare statico con l’utilizzo di dns dinamici come DynDns.
Poiché è complesso ricordare sequenze di numeri, si è pensato all’utilizzo di nomi mnemonici. Ci sono anche tanti altri motivi per cui si usano i nomi al posto degli indirizzi, ma questo non è l’articolo adatto per trattare queste specifiche.
La risoluzione del nome è affidata al DNS, questo associa il nome all’indirizzo ip.
In caso di ip dinamico, il dns non trasforma quest’ultimo in un indirizzo ip statico, bensì riassocia la risoluzione del nome al nuovo ip ogni volta che questo cambia.
Dire che ho reso statico un indirizzo ip dinamico con un servizio di DNS provoca in me un senso di sconforto.
Le varie compagnie telefoniche tipo wind e wodafone che vendono ip dinamici resi fissi dal servizio di DNS dinamico, meritano la fucilazione alle spalle per alto tradimento della fiducia del consumatore.
Quindi è giusto dire: IP DINAMICO. IL NOME ASSEGNATO RIMANE UGUALE ANCHE IN CASO DI CAMBIO INDIRIZZO, GRAZIE AL AUSILIO DI UN SERVIZIO DI DNS DINAMICO !!!
CONFIGURAZIONE
Dopo questo doveroso preambolo di sfogo, cominciamo con la configurazione del nostro web server stand-alone.
cominciamo a definire le polycy del firewall, sfruttiamo il firewall interno di linux per creare un server che firewalla se stesso.
Dunque vogliamo permettere tutto il traffico generato dall’esterno verso il web server stand-alone purché questo sia diretto unicamente ai servizi http e destinato alla scheda di rete eth0
Vogliamo un log dettagliato di tutto il traffico scartato e il motivo di tale rifiuto.
Vogliamo, inoltre la possibilità di accedere in ssh per poter effettuare la manutenzione ordinaria.
Il nostro web server stand-alone avrà tutto il traffico in uscita bloccato eccezion‘ fatta per il traffico di risposta, e il traffico destinato alla risoluzione dei nomi nonche quello necessario al funzionamento del DDNS, questo ci garantisce la non usabilità come amplificatore per attacchi DDOS in caso di breccia al perimetro della rete.
CONFIGURAZIONE DEL FIREWALL
tutti gli script li faccio partire dalla directory /script
quindi creo la directory
#mkdir /script
#apt update
#apt full-upgrade
#apt install net-tools vim iptables apache2 apache2-utils libexpat1 ddclient dnsutils lynx
Durante l’installazione, ddclient ci porrà delle domande, rispondiamo quel che ci pare, tanto poi andremo a configurare manualmente il servizio. Io rispondo A a tutte le domande.
disabilitiamo IPV6
#cat >> /etc/sysctl.d/99-sysctl.conf << EOF
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1
EOF
#
Adesso, dopo il reboot necessario, impartendo il comando ifconfig, vedremo rimosso l’indirizzo V6 dal nostro web server stand-alone.
#shutdown -r now
sistemiamo qualche scorciatoia che ci facilita la vita e da un pochino di colore alla shell
#vi .bash_profile
export PS1=’\[\033[01;31m\]\u\[\033[01;33m\]@\[\033[01;36m\]\h:\[\033[01;33m\]\w \[\033[01;35m\]\$ \[\033[00m\]’
umask 022
eval “`dircolors`”
alias ls=’ls $LS_OPTIONS’
alias ll=’ls $LS_OPTIONS -l’
alias l=’ls $LS_OPTIONS -la –si’
alias lll=’ls -la’
alias ..=’cd ..’
alias …=’cd ../..’
alias s=’ssh -l root’
alias shred=’shred -n 30′
alias dhcp-conf=’vi /etc/dhcp/dhcpd.conf’
alias dhcp=’/etc/init.d/isc-dhcp-server’
alias syslog=’tail -f /var/log/syslog’
alias jail=’iptables -L’
export EDITOR=”vim”
export HISTFILESIZE=99999999
export HISTSIZE=99999999
export HISTCONTROL=”ignoreboth”
export LS_OPTIONS=’–color=auto -h’
Salviamo e usciamo con ESC :wq
carichiamo la configurazione appena creata
#source .bash_profile
adesso è il momento di scrivere il firewall
#vi /script/firewall.sh
#!/bin/bash
PRG=/sbin/iptables
NET=192.168.0
LAN=eth0
DDNS=checkip.dyndns.it
# Pulisco eventuali catene residuo di vecchie configurazioni
$PRG -F
$PRG -X
# Abilito il traffico sulla loopback se generato dall’interfaccia lo e rigetto il traffico
# di localhost se non generato dalla lo.
$PRG -A INPUT -i lo -j ACCEPT
$PRG -A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
$PRG -A OUTPUT -o lo -j ACCEPT
# Abilito il ping bidirezionale.
$PRG -A INPUT -p icmp -m state –state NEW –icmp-type 8 -j ACCEPT
$PRG -A INPUT -p icmp -m state –state ESTABLISHED,RELATED -j ACCEPT
$PRG -A OUTPUT -p icmp -j ACCEPT
# Abilito SSH per la manutenzione ordinaria.
$PRG -A INPUT -i $LAN -s $NET.(MANAGEMANT) -p tcp -m state –state NEW,ESTABLISHED –dport 22 -j ACCEPT
$PRG -A OUTPUT -o $LAN -p tcp -m state –state ESTABLISHED –sport 22 -j ACCEPT
# Abilito il WebServer stand-alone
$PRG -A INPUT -i $LAN -p tcp -m state –state NEW,ESTABLISHED –dport 80 -j ACCEPT
$PRG -A OUTPUT -o $LAN -p tcp -m state –state ESTABLISHED –sport 80 -j ACCEPT
# Abilito le risoluzioni dns e il check del mio ip attuale da passare al servizio DDNS.
$PRG -A INPUT -i $LAN -p udp -m state –state ESTABLISHED –sport 53 -j ACCEPT
$PRG -A OUTPUT -o $LAN -p udp -m state –state NEW,ESTABLISHED –dport 53 -j ACCEPT
$PRG -A INPUT -i $LAN -s $DDNS -p tcp -m state –state ESTABLISHED –sport 80 -j ACCEPT
$PRG -A OUTPUT -o $LAN -d $DDNS -p tcp -m state –state NEW,ESTABLISHED –dport 80 -j ACCEPT
# Richiedo di loggare tutto il traffico scartato
$PRG -A INPUT -m limit –limit 3/min -j LOG –log-prefix “iptables_INPUT_denied: ” –log-level 4
$PRG -A FORWARD -m limit –limit 3/min -j LOG –log-prefix “iptables_FORWARD_denied: ” –log-level 4
$PRG -A OUTPUT -m limit –limit 3/min -j LOG –log-prefix “iptables_OUTPUT_denied: ” –log-level 4
# Scarto tutto il traffico non presente nella policy precedente
$PRG -A INPUT -j REJECT
$PRG -A FORWARD -j REJECT
$PRG -A OUTPUT -j REJECT
Salviamo e usciamo [ESC :wq]
#
Diamo il permesso di esecuzione al firewall
# chmod 700 /script/firewall.sh
Gli unici punti critici sono:
— vuol dire che devo mettere due segni –
al posto di MANAGEMENT devo mettere l’ultima parte del mio ip, ovvero se il mio ip è 192.168.1.4 io dovrò mettere solo 4, il resto del IP è nomenclato in testa alla voce NET
devo anche adeguare il nome della mia scheda di rete se diversa da eth0.
E facciamo partire il nostro firewall
#/script/firewall.sh
Se tutto è andato per il meglio non dovrebbe dare errori, digitando il comando
jail dovremmo vedere una cosa simile a questa:
# jail
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all — anywhere anywhere
REJECT all — loopback/8 anywhere reject-with icmp-port-unreachable
ACCEPT icmp — anywhere anywhere state NEW icmp echo-request
ACCEPT icmp — anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp — 192.168.0.2 anywhere state NEW,ESTABLISHED tcp dpt:ssh
ACCEPT tcp — anywhere anywhere state NEW,ESTABLISHED tcp dpt:http
ACCEPT udp — anywhere anywhere state ESTABLISHED udp spt:domain
LOG all — anywhere anywhere limit: avg 3/min burst 5 LOG level warning prefix “iptables_INPUT_denied: ”
REJECT all — anywhere anywhere reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT)
target prot opt source destination
LOG all — anywhere anywhere limit: avg 3/min burst 5 LOG level warning prefix “iptables_FORWARD_denied: ”
REJECT all — anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all — anywhere anywhere
ACCEPT icmp — anywhere anywhere
ACCEPT tcp — anywhere anywhere state ESTABLISHED tcp spt:ssh
ACCEPT tcp — anywhere anywhere state ESTABLISHED tcp spt:http
ACCEPT udp — anywhere anywhere state NEW,ESTABLISHED udp dpt:domain
LOG all — anywhere anywhere limit: avg 3/min burst 5 LOG level warning prefix “iptables_OUTPUT_denied: ”
REJECT all — anywhere anywhere reject-with icmp-port-unreachable
#
Ho evidenziato il mio indirizzo ip di management.
In apache dobbiamo soltanto aggiungere il nome del server, quindi, editiamo il file e aggiungiamo il nome come prima riga.
#vi /etc/apache2/apache2.conf
ServerName webserver.dibrigida.it (ognuno metterà il nome che preferisce)
Salviamo e usciamo [ESC :wq]
Riavviamo il servizio
#apache2ctl graceful
Test del WebServer stand-alone
Apriamo un browser e puntiamolo all’indirizzo ip del nostro server, se tutto è andato per il meglio dovremmo vedere la pagina di benvenuto.
Test del firewall
Dalla shell del nostro WebServer stand-alone proviamo a navigare un qualunque sito internet
#lynx www.dibrigida.it
Il risultato sarà più o meno una cosa simile: Attenzione: Impossibile stabilire la connessione con l’host remoto.
Adesso proviamo un sito che dovrebbe funzionare
#lynx checkip.dyndns.it
Il risultato dovrebbe essere il nostro ip address PUBBLICO
Cosa è accaduto nello specifico ?
Il traffico è vietato in qualsiasi direzione, tranne la direzione che ci occorre per stabilire qual’è il nostro ip. Questo sarà da comunicare al provider di DNS dinamico.
Configurazione del servizio di DNS Dinamico
Per rendere rintracciabile il nostro WebServer stand-alone abbiamo necessità di un nome univoco (visto che l’ip è dinamico) che ci consenta di tradurre il nostro indirizzo ip DINAMICO, che rimane DINAMICO anche dopo la configurazione del servizio.
Io utilizzo dyndns.it, semplice, intuitivo, gratuito
Dopo esserci registrati sul sito e aver scelto la versione gratis, andiamo a configurare il servizio sul nostro WebServer stand-alone
#echo “# /etc/ddclient.conf” >/etc/ddclient.conf
#echo “protocol=dyndns2” >>/etc/ddclient.conf
#echo “use=web, web=checkip.dyndns.it” >>/etc/ddclient.conf
#echo “server=dyndns.it” >>/etc/ddclient.conf
#echo “login=NOSTROLOGIN” >>/etc/ddclient.conf
#echo “‘password=NOSTRAPASSWORD'” >>/etc/ddclient.conf
#echo “NOMEDELSERVERSCELTO” >>/etc/ddclient.conf
Riavviamo il servizio
#service ddclient restart
…. sul sito dovremmo vedere l’aggiornamento del nome con il nostro ip
Da dentro il nostro WebServer stand-alone digitiamo:
#dig NOSTRAURL, il dns dovrebbe risolvere il nostro nome con il nostro ip attuale
…..
Non ci resta che abilitare il port-forward sul router di frontiera
…. Questo è tutto gente !
Pingback: Videoconferenza - Il pensiero di un uomo libero