Avendo un Windows Server con cartelle in condivisione su dominio, montare un percorso condiviso di dominio su una cartella all’interno di Ubuntu avendo installato Samba.
Ammettiamo di avere:
192.168.2.2 come percorso del server/macchina sul quale si trova la condivisione di dominio
tuoutente come nome dell’utente all’interno di Ubuntu (UID e GID entrambi su 1001)
cartella_dominio il nome della cartella sul dominio che intendiamo montare all’interno della nostra partizione su linux
Abbiamo già visto come installare un Server LAMP al momento dell’installazione di Ubuntu. Vediamo adesso come configurarlo correttamente ed installare i nostri virtual host.
Prima di cominciare chiariamo che cosa sono i virtual host. Un webserver si suppone che possa offrire diversi siti web, ciascuno collegato ad uno specifico nome di dominio. Se abbiamo un singolo web server si potrà supporre che diversi nomi di dominio punteranno alla medesima macchina. Immaginiamo di avere il seguente server
ubuntu (192.168.56.1)
Il nostro server si trova all’indirizzo IP 192.168.56.1 (in questo caso di una LAN, ma per i nostri scopi questo è poco importante). Poi abbiamo tre domini:
miosito.com → 192.168.56.1
torregatti.com → 192.168.56.1
miosito.it → 192.168.56.1
Nel nostro esempio supponiamo che tutti e tre i domini puntino alla medesima macchina, ovvero chiedano alla medesima macchina di restituire dei risultati web per le loro richieste; supponiamo anche che il dominio miosito.com e miosito.it facciano capo allo stesso hosting, ovvero a quello che comunemente si chiama lo stesso sito, mentre torregatti.com fa capo ad un altro sito.
Detto questo vediamo come configurare il nostro server Apache.
Installare Apache se non lo abbiamo ancora fatto
Se ancora non abbiamo installato il server LAMP sarà sufficiente eseguire i seguenti comandi.
Per installare apache:
1
sudo apt-get install apache2
Per installare il server MySQL (qui ci verranno richiesti nome utente e password per l’utente root del database, che ricordiamoci non è l’utente root del server)
1
sudo apt-get install mysql-server
Installiamo il PHP. Ricordiamoci che il PHP ha diverse versioni, quella ancora più utilizzata, è la versione 5, anche se l’ultima versione disponibile è la 7.
A questo punto riavviamo il server Apache e verifichiamo che tutto funzioni aprendo il nostro localhost.
1
sudo service apache2 restart
Configurazione Apache
Anzitutto prendiamo confidenza con la configurazione di apache. Digitiamo da terminale:
1
ls/etc/apache2/
Verranno visualizzati i contenuti della cartella di configurazione di apache, che dovrebbero essere qualcosa di simile a questo:
Adesso apriamo il file apache2.conf:
1
sudo nano/etc/apache2/apache2.conf
Questo è il file principale di Apache, per ora lo possiamo scorrere un po’ per prendere confidenza con alcuni elementi chiave. Faccio notare i seguenti parametri:
Timeout 300 – è il tempo predefinito per cui il server manda in timeout richieste che non riesce a gestire
IncludeOptional mods-enabled/*.load – include nella configurazione presente tutti i file *.load dentro la cartella mods-enabled
IncludeOptional mods-enabled/*.conf – include nella configurazione presente tutti i file *.conf dentro la cartella mods-enabled
Include ports.conf – include il file chiamato ports.conf nel quale sono impostate le configurazioni predefinite delle porte
AccessFileName .htaccess – .htaccess è il nome del file delle configurazioni locali per ogni virtual host, il punto iniziale sta a significare che è un file nascosto di linux (i file nascosti, come succede anche sul Mac, sono preceduti da un punto)
IncludeOptional conf-enabled/*.conf – include nella configurazione presente tutti i file *.conf della cartella conf-enabled (idealmente qui si trovano tutte le configurazioni attive)
IncludeOptional sites-enabled/*.conf – include nella configurazione presente tutti i file *.conf della cartella sites-enabled
Facciamo caso anche ad alcune configurazioni di base:
1
2
3
<FilesMatch"^\.ht">
Require all denied
</FilesMatch>
Questo significa che per qualunque posizione tutti i file che cominciano con .ht sono proibiti a qualunque richiesta (richiesta da webserver).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Directory/>
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory/usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory/var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
Qui abbiamo la configurazione base del server. Notiamo che le cartelle /usr/share e /var/www sono accessibili a tutti. Sono preclusi tutti gli Override, questo significa che di predefinito non è possibile utilizzare le configurazioni dai file .htaccess per modificare la configurazione dei virtual host. Su questo torneremo tra poco. Inoltre notiamo che le opzioni attive su /var/www sono Indexes e FollowSymLinks.
Prima di proseguire facciamo un piccolo test, anche per prendere confidenza con il nostro server apache (ricordiamoci che il server si trova su 192.168.56.1). Da terminale digitiamo:
1
2
sudo mkdir/var/www/html/test
sudo chown www-data:www-data/var/www/html/test/
In questo modo creiamo una cartella test dentro la cartella predefinita del nostro server apache e le assegniamo www-data come proprietario (e gruppo).
Adesso apriamo dal nostro browser l’indirizzo http://192.168.56.1/test/
Dovrebbe aprirsi qualcosa di simile a questo:
Quello che viene mostrato non ci fa molto piacere. Anzitutto è mostrato il dettaglio del contenuto della cartella test, in secondo luogo sono mostrati i dettagli del nostro server.
Sistemiamo subito entrambi i problemi.
1
sudo nano/etc/apache2/apache2.conf
Modifichiamo la configurazione predefinita di /var/www rimuovendo la voce Indexes
1
2
3
4
5
<Directory/var/www/>
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
Riavviamo apache:
1
sudo service apache2 restart
Aggiornando l’indirizzo di cui sopra otterremo questo:
Adesso sistemiamo l’intestazione del nostro server (Apache/2.4.18 (Ubuntu) Server at 192.168.56.1 Port 80). Questo perché in generale è una buona idea non mostrare la versione del proprio software, per rendere più difficile la vita a chi volesse approfittare di eventuali falle note per la nostra versione.
Anzitutto dobbiamo abilitare mod_headers su apache, per farlo digitiamo:
1
sudo a2enmod headers
Dopodiché procediamo alla modifica del nostro file di configurazione della sicurezza:
Notiamo che non c’è niente di speciale nel nome miosito.conf. E’ solo l’ennesimo file di configurazione che sarà incluso in quello principale di apache, il nome è del tutto indifferente ai fini del nostro dominio.
Adesso modifichiamo il file di configurazione appena creato (quello che scriveremo dentro lo trasformerà nel file di configurazione del sito che vogliamo registrare):
Dopo le nostre modifiche sarà sufficiente che contenga i seguenti dati (ricordiamoci che anche in questo caso il # sta a rappresentare il commento alle righe).
1
2
3
4
5
6
7
8
9
<VirtualHost *:80>
ServerName miosito.com
ServerAdminwebmaster@localhost
DocumentRoot/var/www/miosito
ErrorLog${APACHE_LOG_DIR}/error.log
CustomLog${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Adesso dobbiamo abilitare il sito creato, digitando (qui conta il nome del file che abbiamo dato prima):
1
sudo a2ensite miosito
Fatto tutto questo riavviamo apache.
1
sudo service apache2 restart
A questo punto possiamo testare la nostra configurazione; nel mio caso, non disponendo di un server DNS e non avendo usato un dominio registrato, modificherò le impostazioni del file hosts del mio computer affinché il dominio miosito.com punti al server all’indirizzo 192.168.56.1.
Per farlo apro come amministratore il blocco note su Windows e vado a modificare il file in C:\Windows\System32\drivers\etc chiamato hosts. In fondo al file inserisco:
1
192.168.56.1miosito.com
Salviamo il file hosts (ricordandoci di rimetterlo a posto dopo) e andiamo sul browser all’indirizzo http://miosito.com
Dovremmo vedere qualcosa come:
Per verificare che abbiamo fatto tutto bene modifichiamo il contenuto della cartella /var/www/miosito in modo che ci sia solo un file index.php con dentro il seguente contenuto:
1
2
3
4
5
<?php
echo"ciao da miosito.com";
?>
Per creare il file index.php è sufficiente digitare:
1
sudo nano/var/www/miosito/index.php
Se abbiamo fatto tutto bene aggiornando il suddetto indirizzo dovremmo vedere:
Adesso torniamo a modificare il nostro file hosts (questo ricordo lo facciamo solo per le nostre prove interne, non è assolutamente necessario durante la vera configurazione di un dominio, che è sufficiente che punti all’IP della nostra macchina su cui gira apache)
1
2
3
4
192.168.56.1miosito.com
192.168.56.1www.miosito.com
192.168.56.1www.miosito.it
192.168.56.1miosito.it
Aggiungendo le ultime tre righe alla prima già esistente, configuriamo l’accesso al nostro server anche per i sottodomini www ed il dominio miosito.it.
A questo punto verifichiamo dove punta http://www.miosito.com
Dovremmo vedere qualcosa di simile, con la risposta della pagina predefinita che si trova in /var/www/html. Quello che adesso vogliamo è che il server risponda con il sito nella cartella /var/www/miosito. Quindi torniamo alla configurazione del nostro sito digitando:
Con questo definiamo gli alias del dominio principale. Riavviamo apache.
1
sudo service apache2 restart
A questo punto possiamo verificare che tutte e quattro i domini di prima puntano alla medesima cartella.
Qualora volessimo disabilitare miosito dalla nostra configurazione di apache sarà sufficiente digitare:
1
sudo a2dissite miosito
Per configurare il sito della torregatti.com ripetiamo la procedura precedente, creando una nuova cartella e configurando un nuovo file per il virtual host desiderato.
Esistono diverse edizioni di Linux chiamate distro (da distribuzione) ed una delle più popolari e maggiormente utilizzate (oltre che da me preferite) è Ubuntu, una distribuzione derivativa da quella di Debian.
Senza entrare in ulteriori dettagli vediamo quindi come realizzare un webserver pronto all’uso con Ubuntu.
Anzitutto dobbiamo scaricare il sistema operativo dal sito ufficiale.
Scegliete il meccanismo di download che più vi aggrada.
La versione che utilizzeremo sarà la 16.04.2 LTS.
Le versioni LTS (long-term support) offrono invece aggiornamenti per cinque anni: l’ideale per chi ha bisogno di maggiore stabilità.
Altri ingredienti necessari saranno:
VirtualBox (se non avete ancora una macchina fisica su cui installare il server)
putty per l’accesso in SSH al nostro server (sui vantaggi nell’usarlo torneremo successivamente)
Una volta tutto preparato usiamo l’ISO scaricata dal sito ufficiale per iniziare con l’installazione.
Anzitutto ci viene richiesta la lingua, possiamo selezionare l’italiano.
A questo punto selezioniamo “Installa Ubuntu Server”, altre funzioni sono molto utili ma non necessarie in questo momento.
Prima che l’installazione cominci, dal momento che abbiamo scelto l’italiano, veniamo avvisati che alcune parti potrebbero non essere tradotte, quindi saranno in inglese. Niente di importante o che possa compromettere il sistema. Scegliamo quindi di proseguire. Ricordo che ci si può muovere tra le impostazioni premendo la tabulazione (tasto TAB, quello sopra BLOC MAIUSC con le frecce in opposizione), quando scegliamo l’opzione desiderata premiamo INVIO.
Confermiamo il paese come Italia.
Scegliamo di NON determinare automaticamente la tastiera, in genere non è necessario se lavoriamo con una tastiera standard.
A questo punto ci viene richiesta la disposizione della tastiera e lasciamo ancora una volta Italian.
Selezioniamo la prima scelta, nella maggior parte dei casi andrà bene. Se siamo a conoscenza del modello esatto della tastiera, se lavoriamo per esempio con la tastiera di un Mac, scegliamo la voce opportuna.
A questo punto ci viene chiesto di dare un nome al nostro computer, detto nome host, per esempio lo possiamo chiamare ubuntu.
A questo punto ci viene chiesto il nome completo dell’utente, potrei mettere Petar Karan, ma per semplificarmi la vita metto semplicemente petar.
Ora ci viene chiesto il nome dell’account, qui è importante scegliere bene perché sarà anche il nome di login e necessario per altre operazioni dopo, quindi conviene che sia pratico da digitare. In teoria sarebbe opportuno che fosse composto di sole minuscole e caratteri alfanumerici senza spazi.
Inseriamo adesso una password per il nostro account. Qui vi ricordo che l’account root resterà disabilitato di default e con l’utente di sopra e questa password, utilizzando sudo, potremo eseguire le operazioni con privilegi di amministratore. La password dovrebbe essere complessa nel caso che il server sia messo in rete.
Adesso ci viene chiesto se vogliamo cifrare la nostra cartella dell’utente; se non abbiamo timore di perdere il disco o che questo possa essere rubato, non è necessario cifrare la cartella, perché questo appesantirebbe le operazioni successive sui file della medesima (anche se non in modo significativo).
Ci viene chiesto di configurare l’orario del nostro computer, per noi in Italia la zona corretta è Europe/Rome; se va bene possiamo proseguire.
Adesso è il momento di partizionare il disco. Scegliamo di farlo con LVM, il che ci permetterà ulteriori operazioni e modifiche dopo, ma non entriamo nel merito adesso. Diciamo che se intendiamo ingrandire lo spazio sul nostro server e poter gestire agilmente il backup, LVM è quello che fa per noi.
A questo punto scegliamo il disco su cui effettuare l’installazione e da partizionare. Il disco stesso sarà ovviamente formattato. Nel mio caso sto lavorando su una macchina virtuale con un disco da 50GB. Faccio notare che 50GB secondo lo standard tradizionale equivalgono a 53.687.091.200 byte che qui vengono mostrati secondo lo standard scientifico, quindi 53,7 GB.
Adesso ci viene chiesto se intendiamo procedere. Diciamo pure di sì.
Ci viene chiesto di confermare la quantità di memoria da dedicare al gruppo di volumi (LVM). Per adesso su fiducia possiamo dire di selezionare tutto.
Ultima conferma per procedere. Faccio notare che sono stati creati due gruppi di volumi uno per la partizione root e uno per lo swap di sistema (per chi ha familiarità con Windows si tratta di uno spazio sul disco che viene usato per la memoria virtuale del sistema, così come succede su Windows con la memoria fisica – la RAM – e i file di paging)
Adesso ci viene chiesto di configurare, laddove fosse necessario, un server proxy. Nel mio caso, non avendo la rete dietro a proxy, posso saltare la configurazione.
Ci viene chiesto se vogliamo o meno effettuare aggiornamenti automatici. Per quanto siano importanti è bene che li gestiamo noi di persona, verificando via via se sia opportuno o meno aggiornare il server, specialmente se sarà un webserver con servizi offerti a utenti terzi. Qualche aggiornamento potrebbe non andare come ci aspettavamo e potremmo doverlo correggere seduta stante, quindi è meglio gestirli manualmente.
Ora è il momento di selezionare quali software vogliamo aggiungere alla nostra installazione. ATTENZIONE! La selezione viene effettuata premendo il tasto SPAZIO (la barra spaziatrice) e muovendoci con la tabulazione (TAB). Se si preme INVIO l’installazione prosegue con le voci selezionate. Prima di premere invio dovete avere le voci con gli asterischi come nel mio esempio.
In particolare vogliamo installare subito il server LAMP (Linux + Apache + MySQL + PHP) che sarà il nostro classico webserver e il server SSH. Li potremmo installare anche successivamente, ma perché perdere tempo se si può fare subito?
Dal momento che abbiamo deciso per l’installazione del server LAMP ci viene chiesto di configurare la password di root (non è l’utente root di sistema) per il nostro database MySQL. Anche se non sapete ancora di cosa si tratti esattamente, sappiate che serve per avere un webserver LAMP standard e quindi dategli una buona password.
Confermiamo la password.
Infine ci viene chiesto se vogliamo installare il boot loader GRUB. Nel caso in cui il server venga installato ex-novo su una macchina vergine, allora possiamo dire di sì. Questo installerà il boot loader personalizzato che offrirà diverse possibilità di avvio e configurazione dopo.
Quando è tutto completato estraiamo il disco dell’installazione (o rimuoviamo la ISO che abbiamo caricato nella macchina virtuale).
Fatto questo il sistema si riavvierà portandoci alla schermata di accesso.
Per accedere è sufficiente digitare il nome del nostro utente (per me petar) e la password che abbiamo scelto.
Fatto questo abbiamo terminato la prima parte dell’installazione. Adesso il nostro server Ubuntu è pronto e operativo.
Se stiamo utilizzando VirtualBox possiamo cominciare ad inoltrare le prime porte (qualora lo utilizziamo in modalità NAT) verso il nostro server.
Se lavoriamo da Windows possiamo aprire il Prompt dei comandi ed effettuare un ipconfig per trovare l’indirizzo della scheda di rete di VirtualBox. Nel mio caso il risultato è questo (è questo nella maggior parte dei casi standard).
Questo significa che l’IP su cui vedo la rete di VirtualBox è l’indirizzo 192.168.56.1
Per modificare l’inoltro delle porte sulla macchina virtuale è sufficiente andare nelle impostazioni della macchina e poi su Avanzate selezionare “Inoltro delle porte“.
Si aprirà una schermata vuota (se è la prima volta che la usiamo) nella quale dovremo mettere i seguenti dati.
Per aggiungere nuove regole è sufficiente cliccare sul tasto col più verde (freccia rossa). La macchina host è la nostra che vedrà l’IP all’indirizzo suddetto; la macchina guest è la nostra macchina virtuale. Tipicamente, nella configurazione NAT, viene assegnato l’IP 10.0.2.15; per verificarlo è sufficiente utilizzare ifconfig all’interno di Ubuntu nel modo seguente.
Faccio notare che il comando è ifconfig anziché ipconfig come su Windows. Quello che si richiede è la configurazione dell’interfaccia. Ci vengono mostrate due interfacce, enp0s3 (in una configurazione su macchina fisica qui potremmo vedere eht0) e l’interfaccia lo (elle-o, che sta per local), ovvero l’interfaccia degli indirizzi interni alla macchina. Notiamo infatti che sull’interfaccia enp0s3 abbiamo configurato l’indirizzo 10.0.2.15 (che è quello esterno della macchina sulla rete), e sull’interfaccia lo abbiamo configurato 127.0.0.1 che è il nostro localhost.
Fatte tutte queste belle cose, e con la macchina attiva ovviamente, possiamo aprire il browser sulla macchina host (per esempio sul nostro computer Windows) oppure sul computer dal quale ci vogliamo collegare al server con Ubuntu, e digitare nel browser l’indirizzo http://192.168.56.1
Se tutto è andato bene dovremmo vedere una schermata simile a questo. Questo significa che il nostro server web è attivo e pronto all’uso.
Adesso controlliamo che funzioni anche il server SSH. Per farlo ci sarà sufficiente scaricare putty e avviarlo nel modo seguente:
Come potete vedere è sufficiente digitare l’indirizzo del nostro server (tenendo sempre a mente l’inoltro delle porte fatto prima) e cliccare su Open.
Ci verrà chiesto di acquisire la chiave per la crittografia, gli diciamo di sì.
Ci verrà mostrata la solita schermata di accesso ad Ubuntu dove digitare nome utente e password, come abbiamo fatto al primo accesso.
Il motivo per cui preferisco utilizzare putty anche in una configurazione con la macchina virtuale è la possibilità di copiare ed incollare agilmente i comandi che mi interessano sopra. Infatti per copiare da putty è sufficiente selezionare del testo (qualunque testo selezionato verrà automaticamente copiato). Per incollare è sufficiente cliccare col tasto destro del mouse. Vi consiglio di fare un po’ di pratica prima di cominciare a lavorarci, copiando ed incollando dei comandi elementari per non rischiare di fare pasticci dopo.
Fatto questo passiamo alla configurazione del firewall di Linux.
Firewall su Ubuntu
A prima vista potrebbe sembrare difficile, ma in realtà è tutto semplicissimo.
Anzitutto digitiamo nel terminale il seguente comando:
Shell
1
sudo iptables-L-v|grepChain
Siccome è una guida per esordienti totali faccio notare alcune caratteristiche:
sudo server ad eseguire i comandi come SuperUser, significa letteralmente SuperUser do
iptables è il firewall predefinito all’interno di Linux, nello specifico in Ubuntu
-L e -v sono due opzioni per iptables, usando i comandi da terminale possiamo passare ad ogni comando delle opzioni aggiuntive per modificarne il funzionamento, in particolare -L visualizza la lista delle impostazioni e -v lo fa in modo “verbose“, ovvero fornendo numerosi dettagli, per maggiori approfondimenti sui parametri che possiamo passare ad iptables possiamo utilizzare man iptables (man è il manuale interno di Ubuntu)
| questo è un comando di bash che ci permette di effettuare un’operazione successiva sull’output precedente
grep Chain è il comando con il quale “catturiamo” le righe dell’output contenenti la voce Chain che verrà evidenziata
L’output del comando precedente dovrebbe mostrarci qualcosa come:
Prima di proseguire sarà bene chiarire come funziona il firewall dentro Linux. Partiamo con uno schema:
Come si vede nell’immagine di sopra abbiamo 3 canali principali (detti catene); INPUT, OUTPUT e FORWARD. Il loro scopo potrebbe essere descritto in questo modo:
INPUT traffico in entrata, per esempio collegarsi da fuori verso il PC in SSH oppure interrogare il server web in HTTP
FORWARD traffico reindirizzato, si usa solo nel caso in cui il PC effettui operazioni di routing
OUTPUT connessioni in uscita, per esempio operazioni di ping
Sostanzialmente quello che ci interessa controllare, in un primo momento (senza entrare in configurazioni e monitoraggi più complessi ed articolati) sono le catene in INPUT e FORWARD. Il controllo viene eseguito mediante 3 criteri di “catena”, la chain di cui si parlava prima, ovvero dei criteri che stabiliscono se nel flusso dei dati determinati pacchetti debbano o meno proseguire. I criteri sono i seguenti:
ACCEPT permette
DROP blocca come se non esistesse
REJECT blocca inviando un errore
Se vi sembra tutto complicato aspettate un secondo e vedrete che in realtà è semplicissimo.
Anzitutto chiudiamo tutte le catene in INPUT e FORWARD. Utilizziamo i seguenti due comandi (ATTENZIONE! prima di eseguirli leggere quanto segue):
Shell
1
2
sudo iptables-PINPUT DROP
sudo iptables-PFORWARD DROP
Faccio notare che:
-P cambia i criteri della catena
-A aggiunge criterio alla catena esistente
Quando utilizziamo -P significa che vogliamo reimpostare l’intera catena degli INPUT (per esempio), cancellando quindi tutte le impostazioni precedenti. Con il comando -A invece possiamo aggiungere dei criteri.
Se li eseguissimo questi bloccherebbero tutte le connessioni in entrata compresa quella SSH di cui abbiamo bisogno per gestire il sistema, quindi dobbiamo aggiungere un secondo commando nello specifico:
1
sudo iptables-AINPUT-ptcp--dport22-jACCEPT
Questo aprirà le connessioni in INPUT.
Se aveste inavvertitamente bloccato tutto (a parte poter lavorare tranquillamente da dentro la macchina) sarà sufficiente eseguire i seguenti comandi per riattivare tutte le porte.
1
2
3
sudo iptables-F
sudo iptables-PINPUT ACCEPT
sudo iptables-PFORWARD ACCEPT
Sarà comunque sufficiente riavviare la macchina, nel caso estremo di inaccessibilità, per ripristinare tutto (e questo ci porta dopo al vedere come salvare le impostazioni).
Comunque sia per effettuare la suddetta chiusura e lasciare aperta solo la porta 22 sarà sufficiente eseguire il seguente comando:
Faccio notare l’utilizzo di && che serve a concatenare i comandi tra di loro, per cui se ho due comandi A e B e digito A && B, B viene eseguito solo se A ha successo. In questo modo collego tutti e tre i comandi e li eseguo di fila, bloccando tutto e aprendo immediatamente la connessione sulla porta 22. Questo mi consente di continuare ad accedere tranquillamente da putty.
Adesso sblocchiamo gli INPUT sulla scheda interna (ricordate la lo di prima?) digitando:
1
sudo iptables-AINPUT-ilo-jACCEPT
Inoltre sblocchiamo le connessioni in entrata generate da richieste interne (ok, anche qui potremmo avere dei problemi di sicurezza nel caso di malaware interni alla macchina, ma per il momento possiamo supporre di avere un sistema pulito e non preoccuparcene):
Adesso apriamo le porte per l’HTTP e l’HTTPS, rispettivamente le porte 80 e 443 (a meno di non aver cambiato qualcosa):
1
2
sudo iptables-AINPUT-ptcp--dport80-jACCEPT
sudo iptables-AINPUT-ptcp--dport443-jACCEPT
Fatto questo verifichiamo che sia tutto in regola digitando:
1
sudo iptables-L-v
Dovremmo vedere un output simile a questo:
Faccio notare che non abbiamo aperto porte per l’FTP (ma è meglio che resti chiuso), né per IMAP, POP3 o SMTP. Via via che avremo bisogno di tali servizi potremo aprire le specifiche porte.
A questo punto è il momento di salvare la configurazione in modo permanente (ricordate che al riavvio va riconfigurato tutto?), perciò digitiamo:
1
sudo apt-get install iptables-persistent
Questo installerà iptables-persistent (vi ricordo che con apt-get possiamo gestire i pacchetti di installazione Debian/Ubuntu e con il parametro install installarli)
Vi verrà chiesto di confermare l’installazione con un S e poi comparirà una schermata (tipicamente fucsia) dove vi verrà chiesto se salvare la configurazione attuale.
In generale per salvare la configurazione (da Ubuntu 16.04 in poi) è sufficiente utilizzare i seguenti comandi, una volta installato il servizio:
1
sudo netfilter-persistent save
Adesso riavviamo tutto il sistema per verificare di aver configurato tutto correttamente. E’ sufficiente digitare:
1
sudo reboot now
Digitando nuovamente:
1
sudo iptables-L-v
Verifichiamo che sia tutto al proprio posto. Se è così il firewall è configurato e perfettamente funzionante.
Se volessimo adesso escludere un indirizzo IP bloccandolo ci sarebbe sufficiente digitare:
1
sudo iptables-AINPUT-s15.15.15.51-jDROP
Dove l’indirizzo 15.15.15.51 è quello ipotetico che vogliamo bloccare. Ad ogni modifica del firewall ricordiamoci di salvare il tutto.
Fail2Ban per bannare i tentativi di accesso illeciti
Siccome abbiamo aperto il server sul SSH la nostra prima preoccupazione dovrebbe essere quella di bloccare tutti gli accessi indesiderati, in particolare di bloccare i tentativi di accesso malevoli. Per farlo su Ubuntu esiste un fantastico programma chiamato Fail2Ban.
Anzitutto installiamo fail2ban digitando:
1
sudo apt-get install fail2ban
Una volta installato modifichiamo la configurazione principale digitando:
1
2
cd/etc/fail2ban
sudo cp jail.conf jail.local
Visto che siamo degli esordienti totali approfondiamo un paio di cose:
cd serve a cambiare cartella, letteralmente change directory, e ci fa posizionare in /etc/fail2ban, ricordiamoci che nella cartella /etc di solito si trovano i file di configurazione dei programmi
cp serve a copiare il file jail.conf in jail.local, in questo modo non intaccheremo la configurazione originale di fail2ban e potremo sempre ripristinarla semplicemente cancellando il file appena creato e ricreandolo nella suddetta maniera
Fatto questo digitiamo:
1
sudo nano jail.local
nano è un editor da terminale di Ubuntu, le opzioni che appaiono come ^O oppure ^X sono eseguibili premendo CTRL+O oppure CTRL+X. Queste due in particolare servono a salvare le modifiche apportate e ad uscire dall’editor.
Per muoverci dentro il file utilizziamo le frecce direzionali e spostiamoci verso il basso fino ad individuare le voci che vogliamo modificare. I # servono come commenti, quindi rendono nulle le righe di codice che precedono. Quello che vedremo sarà qualcosa di simile a questo:
Modifichiamo le seguenti voci (cercandole scendendo verso il basso):
1
2
bantime=3600
maxretry=3
Questo imposterà il tempo di ban su 1 ora, ovvero 60*60 secondi e il numero massimo di tentativi sbagliati prima di essere bannati sarà 3.
Il parametro findtime determina invece la finestra temporale per gli errori, impostato a 600 significa che si possono fare 3 errori consecutivi, prima di essere bannati, nell’arco di 10 minuti.
Scendiamo ancora in basso e cerchiamo la jail del SSH che si presenterà così:
1
2
3
4
5
6
7
8
#
# SSH servers
#
[sshd]
port=ssh
logpath=%(sshd_log)s
Lo modifichiamo per farlo diventare così:
1
2
3
4
5
6
7
8
9
10
11
#
# SSH servers
#
[sshd]
port=ssh
enabled=true
filter=sshd
maxretry=3
logpath=/var/log/auth.log
Premiamo CTRL+O per salvare il file.
Faccio notare che abbiamo cambiato il percorso dei file log in modo tale che legga quello giusto.
A questo punto riavviamo il servizio fail2ban (per ricaricare le impostazioni), digitando:
In caso di errore significa che abbiamo sbagliato a scrivere qualcosa nel file di configurazione.
Per visualizzare gli IP bannati ci sarà sufficiente usare di nuovo iptables.
1
sudo iptables-L-v
Mentre per rimuovere un indirizzo IP dalla lista di quelli bloccati sarà sufficiente digitare:
1
sudo fail2ban-client set sshd unbanip10.0.2.2
In questo caso la jail dalla quale lo vogliamo sbannare è quella del sshd (la d finale sta per daemon, praticamente un servizio di linux) e sbanniamo l’indirizzo ip 10.0.2.2 che è quello da cui la mia macchia virtuale vede connettersi il sottoscritto.
Adesso passiamo ad installare Webmin, la manna dal cielo per chiunque debba gestire un webserver da remoto.
Installazione Webmin
Anzitutto aggiungiamo la repository di Webmin all’elenco delle sorgenti di installazione per il nostro server. Per farlo modifichiamo il file delle repository digitando:
1
sudo nano/etc/apt/sources.list
Aggiungiamo in fondo la seguente riga (con CTRL+V ci spostiamo velocemente verso il basso)
1
deb http://download.webmin.com/download/repository sarge contrib
Premiamo CTRL+X per salvare il tutto.
Adesso posizioniamoci nella nostra home (in realtà dovremmo già esserci), qualora non lo fossimo digitiamo:
1
cd/home/petar/
Chiaramente al posto di petar ci va il vostro nome utente.
Scarichiamo la chiave della repository aggiunta in modo da installarla nel sistema, affinché la riconosca come attendibile.
1
wget http://www.webmin.com/jcameron-key.asc
wget è il comando che permette di scaricare da internet il contenuto di un link e salvare nel computer. In questo caso scaricherà il file dall’indirizzo dato e lo salverà tale e quale nella nostra cartella home.
Appena finito il download digitiamo:
1
sudo apt-key add jcameron-key.asc
In questo modo registriamo la chiave che ci interessa. Nel terminale dovrebbe comparire un OK di conferma.
A questo punto aggiorniamo la nostra repository interna digitando:
1
sudo apt-get update
Appena il processo sarà finito possiamo passare all’installazione di webmin.
Per farlo sarà sufficiente digitare (e poi confermare con un S come al solito):
1
sudo apt-get install webmin
Se tutto è andato come dovrebbe allora vi comparirà un messaggio come il seguente:
1
2
3
4
5
Webmin install complete.You can now login tohttps://ubuntu:10000/
asroot with your root password,orasany user who can usesudo
torun commands asroot.
Elaborazione dei trigger per systemd(229-4ubuntu16)...
Elaborazione dei trigger per ureadahead(0.100.0-19)...
Questo significa che possiamo raggiungere webmin alla porta 10.000. Ovvero digitando (nel mio caso, per via della configurazione precedente) https://192.168.56.1:10000
Naturalmente l’indirizzo risulterà irraggiungibile perché va aperta la porta 10.000 sul firewall, per farlo sarà sufficiente digitare:
1
2
sudo iptables-AINPUT-ptcp--dport10000-jACCEPT
sudo netfilter-persistent save
Ricordiamoci anche di effettuare l’inoltro (qualora usassimo la macchina virtuale) da virtualbox.
Se abbiamo fatto tutto bene dovremmo poter accedere a Webmin in questo modo.
Vi faccio notare che non abbiamo un certificato valido, quindi il browser potrebbe segnalarci la connessione in HTTPS come non sicura. Inoltre, nonostante si siano aperte le porte per l’HTTPS standard, bisogna aprire anche quella di webmin, perché quello standard va sulla 443, mentre webmin (di predefinito) sulla porta 10.000.
Possiamo effettuare il login con i nostri nome utente e password accedendo alla seguente schermata.
Da qui possiamo gestire buona parte delle impostazioni del nostro server, oltre che controllarne sempre lo stato.
E per concludere ultima modifica di sicurezza. Abilitiamo webmin solo verso il nostro indirizzo IP.
Per farlo è sufficiente modificare il file di configurazione, usando sempre il terminale. Digitiamo:
1
sudo nano/etc/webmin/miniserv.conf
Così apriamo il file di configurazione di webmin.
Subito sotto la riga della porta aggiungiamo una linea dove mettiamo il nostro indirizzo IP (nel mio caso 10.0.2.2, quello da cui mi vede la macchina virtuale)
1
2
3
4
5
port=10000
allow=10.0.2.2
root=/usr/share/webmin
mimetypes=/usr/share/webmin/mime.types
addtype_cgi=internal/cgi
In questo modo l’accesso sarà consentito solamente dal mio indirizzo. Questo è molto pratico quando avete un indirizzo IP statico, ma anche se non lo aveste potete sempre accedere prima in SSH e abilitare il vostro indirizzo corrente. In questo modo tenete webmin al sicuro e lontano da tentativi di hacking (più o meno, ma non è il momento per approfondire).
Perché la configurazione abbia successo è necessario riavviare webmin digitando:
1
sudo service webmin restart
Quest’ultima operazione è fattibile anche da dentro a Webmin, seguendo le seguenti istruzioni.
Testiamo il PHP
Infine testiamo il nostro webserver creando una semplice pagina PHP.
Anzitutto spostiamoci nella cartella di apache, digitando:
1
cd/var/www/html
Utilizzando il comando ls vedremo che qui c’è un unico file chiamato index.html, che è quello che abbiamo visto in precedenza quando abbiamo avviato apache.
Cancelliamolo e creiamo un nuovo file index.php
1
2
sudo rm index.html
sudo nano index.php
Si aprirà l’editor nano, dentro incolliamo il seguente codice:
PHP
1
2
3
4
5
<?php
echo"<h1>Ciao, Mondo!</h1>";
?>
Ancora una volta CTRL+O per salvare (e quindi creare) il file, CTRL+X per uscire.
ATTENZIONE! Abbiamo creato il file come root, infatti digitando ls -l dovreste vedere qualcosa di simile a
1
-rw-r--r--1root root41ago1222:34index.php
Per essere un file eseguibile correttamente da apache, e soprattutto per non avere problemi di sicurezza, il file deve essere impostato su www-data, quindi usiamo il comando chown per cambiare proprietario (letteralmente change owner)
1
sudo chown www-data:www-data index.php
Fatto tutto questo visitiamo nuovamente http://192.168.56.1/
Se tutto è andato per il verso giusto dovremmo vedere una simpatica scritta che dichiara a caratteri cubitali: Ciao, Mondo!
Obiettivo: realizzare una jail personalizzata per Fail2Ban su Ubuntu, per banner gli IP che tentano più di 3 accessi errati su un nostro portale in PHP
Fail2Ban funziona sotto linux e permette di banner mediante il firewall elenchi di indirizzi IP, basandosi sui log dei programmi a cui si vuole applicare.
Vediamo anzitutto come installarlo (per una guida dettagliata rimando alla guida ufficiale, oppure a questa guida qua).
Ricordo che il connettore && concatena due comandi successivi (per esempio A && B), per cui se il comando A ha successo, allora viene eseguito il comando B.
Una volta installato modifichiamo il file jail.conf digitando sempre sul terminale:
1
sudo nano/etc/fail2ban/jail.conf
Da qui possiamo fare una prima configurazione modificando i seguenti parametri (non si trovano in questo ordine):
1
2
3
4
ignoreip=127.0.0.1/8
bantime=600
findtime=600
maxretry=3
Questo significa che verranno ignorati gli IP interni della macchina, che il tempo di ban sarà di 600 secondi (10 minuti), per ogni 3 errori riscontrati nell’arco di 600 secondi.
Per esempio se volessimo abilitare il controllo degli accessi sul SSH allora cerchiamo la jail relativa e impostiamo true ad enabled.
Adesso creiamo il nostro meccanismo di ban personalizzato.
Per farlo, e testarlo, creiamo anzitutto un file apposito in PHP sotto apache. Da terminale digitiamo:
1
2
cd/var/www/html
sudo nano test.php
A questo punto scriviamo nel file PHP il codice necessario per registrare un errore in un file log.
Faccio notare che questo genererà una pagina con un pulsante che ad ogni pressione registrerà un “LoginError” nel file in /var/log/paginatest.log.
Quello che è importante, di tutto lo script, è il modo in cui viene scritto il file di log degli errori con error_log.
Fatto questo creiamo il file log vuoto e diamo i permessi a www-data per poterlo modificare dal PHP. Senza questa modifica il file non risulterà modificabile dal PHP.
Adesso creiamo il nostro filtro personalizzato dentro per Fail2Ban. Dal terminale digitiamo:
1
2
cd/etc/fail2ban/filter.d
sudo nano paginatest.conf
Dentro il file paginatest.conf, aperto con nano, inseriamo le seguenti righe di codice:
1
2
3
4
[INCLUDES]
[Definition]
failregex=<HOST>.*LoginError.*$
ignoreregex=
Salviamo il file. Faccio notare che si userà il riconoscimento di stringa sulle righe contenenti “LoginError” il $msg del file PHP che abbiamo creato in precedenza.
Di nuovo dal terminale digitiamo:
1
sudo nano/etc/fail2ban/jail.conf
A questo punto ci spostiamo in fondo al file, dove si trovano le altre jail ed inseriamo il seguente codice:
1
2
3
4
5
6
7
[paginatest]
enabled=true
port=http,https
filter=paginatest
logpath=/var/log/paginatest.log
maxretry=3
In questo modo impostiamo il ban su tutte le connessioni HTTP e HTTPS alla data pagina, leggendo il file log che abbiamo creato, con un massimo numero di tentativi uguale a 3.
Facciamo ripartire Fail2Ban:
1
sudo service fail2ban restart
Immaginiamo di testare adesso il nostro programma da un altro computer della rete, per esempio un computer all’indirizzo IP 192.168.0.19
Dopo 3 tentativi di errore dovremmo poter verificare qualcosa di simile:
Faccio notare che per visualizzare tutti gli IP bannati è sufficiente interrogare iptables:
1
sudo iptables-L-v|grep REJECT
Se andiamo a verificare il file di log vedremo che i nostri “errori”, ovvero le pressioni sul suddetto tasto, in questo caso, hanno generato le seguenti righe:
Per sbannare un indirizzo IP ricordiamoci di utilizzare il seguente commando:
1
sudo fail2ban-client set paginatest unbanip192.168.0.19
In questo caso rimuoviamo dalla blacklist l’indirizzo 192.168.0.19
Anzitutto vediamo come creare una serie di file vuoti in bash, utilizzando il commando touch.
1
2
3
4
5
#!/bin/bash
fornin$(seq110);do
touch"./elemento$n.txt"
done
Adesso proviamo a rinominare i file creati (cambiando l’estensione da *.txt a *.log), tenendo a mente i seguenti modificatori fondamentali:
#: sottrae dall’inizio della stringa (minimale)
%: sottrae dalla fine della stringa (minimale)
/ : sostituisce una sottostringa con un altra (solo la prima volta che viene incontrata)
1
2
3
4
5
#!/bin/bash
forfin./*.txt;do
mv"$f""${f/%txt/log}";
done
Infine mettiamo insieme il tutto in un piccolo eseguibile che, una volta richiamato, permette di modificare l’estensione di tutti i file da ext1a ext2.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
rinomina(){
forfin./*.$1;do
mv"$f""${f/%$1/$2}"
done
}
if[$# -eq 2 ]
rinomina$1$2
else
echo"Usage: $0 [ext1] [ext2]"
fi
Il programma in questione accetta come argomento le due estensioni da modificare, qualora non vengano forniti esattamente due argomenti segnala all’utente l’utilizzo corretto. Dopodiché passa in rassegna, nella sua cartella di appartenenza tutto i file con estensione ext1e li modifica all’estensione ext2.
Questa volta proviamo un esercizio un poco più complesso sempre con bash e calcoliamo la dimensione totale dei file in una cartella.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
elenca(){
if[$# -eq 0 ]
then
cartella="."
else
cartella=$1
fi
totale=0
ls-l$cartella|(whileread permessi pos utente gruppo dim riga;do
totale=$((totale+dim))
done
echo"$totale bytes")
}
elenca$1
Questa è un’occasione per notare alcune caratteristiche:
dopo la dichiarazione del ciclo while e prima del punto e virgola, è possibile specificare un elenco di parametri nei quali verrà suddivisa la stringa per ogni riga del precedente risultato
il termine $# fa riferimento al numero di parametri presenti nell’argomento al programma (il parametro 0 è il nome del programma stesso)
il termine $1 prende il primo parametro dell’argomento, successivo al termine 0-esimo riferito al nome del programma stesso
Con l’occasione di un corso di Linux che sto tenendo, ho deciso di pubblicare un po’ di esercizi e spunti per tutti quelli che fossero interessati ad avvicinarsi al bellissimo mondo di bash.
Cominciamo con il nostro primo programma in assoluto: ciaomondo.sh
NB: l’estensione *.sh non è obbligatoria
Creiamo un file chiamato ciamondo.sh digitando da terminale
Shell
1
sudo nano ciaomondo.sh
A questo punto ci troviamo dentro l’editor NANO, per salvare utilizziamo CTRL+O, per uscire CTRL+X.
Inseriamo il seguente codice:
Shell
1
2
3
4
5
6
7
8
9
#!/bin/bash
ciao(){
echo"Ciao, Mondo!"
}
ciao
Ciao è una funzione, o metodo, che non va altro che stampare a schermo, mediante echo la stringa “Ciao, Mondo!”.
Perché possa funzionare richiamiamo la funzione dopo averla dichiarata.
Salviamo e torniamo nella cartella dove abbiamo creato il file.
Rendiamo il file eseguibile con:
Shell
1
sudo chmoda+xciaomondo.sh
E poi testiamolo:
Shell
1
./ciaomondo.sh
Gestisci Consenso Cookie
Per fornire le migliori esperienze, utilizziamo tecnologie come i cookie per memorizzare e/o accedere alle informazioni del dispositivo. Il consenso a queste tecnologie ci permetterà di elaborare dati come il comportamento di navigazione o ID unici su questo sito. Non acconsentire o ritirare il consenso può influire negativamente su alcune caratteristiche e funzioni.
Funzionale
Sempre attivo
L'archiviazione tecnica o l'accesso sono strettamente necessari al fine legittimo di consentire l'uso di un servizio specifico esplicitamente richiesto dall'abbonato o dall'utente, o al solo scopo di effettuare la trasmissione di una comunicazione su una rete di comunicazione elettronica.
Preferenze
L'archiviazione tecnica o l'accesso sono necessari per lo scopo legittimo di memorizzare le preferenze che non sono richieste dall'abbonato o dall'utente.
Statistiche
L'archiviazione tecnica o l'accesso che viene utilizzato esclusivamente per scopi statistici.L'archiviazione tecnica o l'accesso che viene utilizzato esclusivamente per scopi statistici anonimi. Senza un mandato di comparizione, una conformità volontaria da parte del vostro Fornitore di Servizi Internet, o ulteriori registrazioni da parte di terzi, le informazioni memorizzate o recuperate per questo scopo da sole non possono di solito essere utilizzate per l'identificazione.
Marketing
L'archiviazione tecnica o l'accesso sono necessari per creare profili di utenti per inviare pubblicità, o per tracciare l'utente su un sito web o su diversi siti web per scopi di marketing simili.