Configurazione e sicurezza in Apache [per pinguini esordienti]

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.commiosito.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:

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)

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.

Configurazione Apache

Anzitutto prendiamo confidenza con la configurazione di apache. Digitiamo da terminale:

Verranno visualizzati i contenuti della cartella di configurazione di apache, che dovrebbero essere qualcosa di simile a questo:

Adesso apriamo il file 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:

  1. Timeout 300 – è il tempo predefinito per cui il server manda in timeout richieste che non riesce a gestire
  2. IncludeOptional mods-enabled/*.load – include nella configurazione presente tutti i file *.load dentro la cartella mods-enabled
  3. IncludeOptional mods-enabled/*.conf – include nella configurazione presente tutti i file *.conf dentro la cartella mods-enabled
  4. Include ports.conf – include il file chiamato ports.conf nel quale sono impostate le configurazioni predefinite delle porte
  5. 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)
  6. IncludeOptional conf-enabled/*.conf – include nella configurazione presente tutti i file *.conf della cartella conf-enabled (idealmente qui si trovano tutte le configurazioni attive)
  7. IncludeOptional sites-enabled/*.conf – include nella configurazione presente tutti i file *.conf della cartella sites-enabled

Facciamo caso anche ad alcune configurazioni di base:

Questo significa che per qualunque posizione tutti i file che cominciano con .ht sono proibiti a qualunque richiesta (richiesta da webserver).

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:

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.

Modifichiamo la configurazione predefinita di /var/www rimuovendo la voce Indexes

Riavviamo apache:

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:

Dopodiché procediamo alla modifica del nostro file di configurazione della sicurezza:

Modifichiamo il file sistemando i seguenti attributi (si trovano su righe separate, se non ci sono basta aggiungerli in fondo):

Fatto questo riavviamo apache:

E torniamo a verificare il solito indirizzo di prima che apparirà come:

Come è possibile vedere adesso le intestazioni del server sono sparite (abbiamo anche pulito i header HTTP con cui risponde il server).

Aggiungiamo il nostro primo Virtual Host

Creiamo anzitutto una cartella sotto /var/www nella quale metteremo il nostro sito.

Il nome della cartella è a piacere, ho messo miosito solo per praticità visto che sarà anche il nome del dominio.

Assegniamo l’utente corretto alla cartella:

Adesso copiamo le configurazioni predefinite su quelle nuove per il nostro sito.

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).

Adesso dobbiamo abilitare il sito creato, digitando (qui conta il nome del file che abbiamo dato prima):

Fatto tutto questo riavviamo apache.

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:

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:

Per creare il file index.php è sufficiente digitare:

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)

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:

Modifichiamo il file aggiungendo la seguente riga:

Con questo definiamo gli alias del dominio principale. Riavviamo apache.

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:

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.

Vedi articolo

Fail2Ban creare jail personalizzato (esempio con portale in PHP)

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).

Dal terminale digitiamo:

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:

Da qui possiamo fare una prima configurazione modificando i seguenti parametri (non si trovano in questo ordine):

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:

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:

Dentro il file paginatest.conf, aperto con nano, inseriamo le seguenti righe di codice:

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:

A questo punto ci spostiamo in fondo al file, dove si trovano le altre jail ed inseriamo il seguente codice:

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:

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:

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:

In questo caso rimuoviamo dalla blacklist l’indirizzo 192.168.0.19

Vedi articolo

Operazioni elementari sui file con Bash

Anzitutto vediamo come creare una serie di file vuoti in bash, utilizzando il commando touch.

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)

Infine mettiamo insieme il tutto in un piccolo eseguibile che, una volta richiamato, permette di modificare l’estensione di tutti i file da ext1 a ext2.

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 ext1 e li modifica all’estensione ext2.

Vedi articolo
Bash, dimensione cartella in bytes

Bash, dimensione cartella in bytes

Questa volta proviamo un esercizio un poco più complesso sempre con bash e calcoliamo la dimensione totale dei file in una cartella.

Questa è un’occasione per notare alcune caratteristiche:

  1. 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
  2. il termine $# fa riferimento al numero di parametri presenti nell’argomento al programma (il parametro 0 è il nome del programma stesso)
  3. il termine $1 prende il primo parametro dell’argomento, successivo al termine 0-esimo riferito al nome del programma stesso

L’utilizzo del programma avviene in questo modo:

Vedi articolo
Elenco file in bash con ciclo for

Elenco file in bash con ciclo for

Vediamo come elencare i file con altri due esempi, anzitutto prendendo il commando ls:

E poi con piccola variazione, questa volta eseguiamo il commando all’interno di $( )

 

Vedi articolo
Bash, ciclo for con sequenza

Bash, ciclo for con sequenza

Altro esempio di ciclo for con sequenza in bash.

Il risultato è così:

Vedi articolo
Ciclo for elementare in Bash

Ciclo for elementare in Bash

Prosegue la rubrica delle lezioni banali di Bash.

Proviamo adesso ad inserire un elementare ciclo for che stampi dei numeri a video.

Il risultato dovrebbe essere analogo a questo qua:

Vedi articolo
Come scrivere i programmi in bash, ovvero “Ciao, Mondo!” in bash

Come scrivere i programmi in bash, ovvero “Ciao, Mondo!” in bash

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

A questo punto ci troviamo dentro l’editor NANO, per salvare utilizziamo CTRL+O, per uscire CTRL+X.

Inseriamo il seguente codice:

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:

E poi testiamolo:

 

Vedi articolo