Installare il web server su Centos

Molti siti vengono creati su sistemi Centos (un'alternativa sono anche quelli Debian-based). Il motivo può essere che Centos è considerato più sicuro (SELinux installato di default) e, in virtù di meno frequenti ma più consolidati aggiornamenti, può essere considerato più stabile.

Dopo uno yum update per aggiornare tutti i repository, si può procedere con l’installazione del server web:

Una volta installato, avviamo il servizio:

Per verificare lo status del servizio:

In Centos dobbiamo abilitare nel firewall il traffico con Apache. Se proviamo ad accedere al sito di default con l'indirizzo Ip o localhost dallo stesso Centos, nessun problema. Provando invece da un altro host sulla LAN otterremo un errore nel browser. Per vederlo anche da host esterni dobbiamo aggiungere il servizio alle regole.

Quello che si vede nello SS seguente sono i servizi inclusi nel firewall prima di effettuare le modifiche:

manca il servizio httpd.

Aggiungiamo quindi al firewall il traffico con protocollo HTTP e, per connessioni sicure, il traffico con HTTPS. Alla fine ricarichiamo il firewall riconfigurato.

Nello SS seguente si vede come si modifica il firewall:

Un primo check restituirà la pagina seguente:

Per la gestione del servizio Apache dobbiamo utilizzare:

systemctl “comando” httpd

dove comando può essere:

stop - ferma
start - avvia dopo stop
restart - riavvia senza prima fare stop
reload - ricarica il servizio dopo un cambiamento nella configurazione
enable - fa sì che parta in automatico al boot
disable - disabilita avvio automatico
is-enabled per sapere se si avvia al boot


per avviare il servizio Apache automaticamente al boot scegliamo:

Il parametro --now serve ad abilitare il servizio al boot (enable) e ad avviarlo contestualmente, nel caso fosse stato messo in stop.

Per default su Centos 8 non esiste un file index.html nella directory /var/www/html, andrà creato per ogni virtual host che vorremmo inserire, anche se uno solo.
La pagina di test che ho mostrato prima si trova nella dir /usr/share/httpd/noindex. Questa pagina viene richiamata dal file /etc/httpd/conf.d/welcome.conf.

Di prassi, i siti web per Apache dovrebbero essere inseriti nella directory /var/www/html, nel caso di un solo sito. Nel caso di più siti, o per una migliore organizzazione, andrà caricata in /var/www una directory per ogni sito e, in questa posizione, creare poi una directory "html" dove mettere le pagine e altro del sito.

Pertanto creiamo la directory per uno dei siti che vorremo ospitare:

e lo stesso creiamo una directory per i file di log:

diamo la proprietà allo user con il quale stiamo lavorando (prima di entrare come root):

diamo i permessi di lettura e scrittura (- esecuzione) per la dir /var/www (e, ricorsivamente, a tutto il contenuto) allo user ed al gruppo:

nello SS sopra si può vedere che ho utilizzato la notazione con i numeri: 7=rwx, 5=r-x, 5=r-x, rispettivamente Root-User-Group.

Per procedere con l’installazione, ho utilizzato un classico file index.html Apache di altre distribuzioni in cui ho fatto una modifica per essere sicuro che si tratti del mio sito. Questo è utile per non dovere preparare una pagina web di prova troppo complicata che poi andrà cancellata. Ricordatevi che potete chiamare la pagina principale in qualsiasi modo, non per forza index.html, basta poi specificarlo nella configurazione di usare la pagina preferita come default.

Quindi potete o editare (creare) una nuova minimale pagina di prova con nano (che io trovo più immediato di vi o vim) o copiare il file già pronto nella directory seguente:

     /var/www/miosito/html/index.html

ricordarsi, nel caso di copia di un file esistente, di ridare il comando chmod -R 755 /var/www/ per includere il nuovo file index.html tra quelli con permessi validi.

Ora creiamo due directory (nelle altre distribuzioni vengono create automaticamente all'installazione di Apache):

La prima dovrà raccogliere le informazioni dei siti e la seconda conterrà i link simbolici ai siti.
Vi sarete domandati perchè non avere un'unica dir da cui pescare tutti i siti? Il motivo è che nel caso di preparazione di molti siti (i siti "available") mediante il link noi metteremo in rete solo quelli che vorremo ovvero quelli collegati, con il comando sopra, ai siti "enabled". Questo è utile per server commerciali in cui si vuole, per esempio, sospendere la pubblicazione di un sito, togliendolo momentaneamente dai sites-enabled, senza cancellarlo.

A questo punto si deve dire ad Apache di prendere le informazioni per servire i siti dalla directory contenete i link simbolici. Editiamo quindi il file /etc/httpd/conf/httpd.conf:

ed aggiungiamo alla fine il comando IncludeOptional sites-enabled/*.conf:

Questo comando dirà ad Apache di non prendere più (in via prioritaria) le informazioni dal file welcome.conf ma di prenderli dai file di configurazione che prepareremo per i singoli (virtual) host.
Per fare ciò creiamo nella dir /etc/httpd/sites-available/ il file di configurazione che chiameremo <mio nome >.conf, es miosito.conf

In questo file mettiamo le istruzioni come da manuale:

L’asterisco indica che tutti i siti saranno sulla porta 80, solo in caso di più indirizzi IP, ciascuno per ogni sito si deve specificare (procedura non semplice di avere più indirizzi IP sul singolo host fisico).
Le istruzioni riportate sono proprio quelle minime per vedere un sito sulla rete.

Per ultimo creiamo il link simbolico a questo file appena creato:

Si tratta dell’equivalente del comando usato su altre distribuzioni (a2ensite....). Ora il file httpd.conf, di cui sopra, troverà nei link specificati in sites-enabled le istruzioni di configurazione desiderate per il nostro primo sito.

Attenzione, se abbiamo aggiunto il file di log alla configurazione di VirtualHost e provando ad accedere ora al sito non riusciremo. Avviando il servizio httpd avremo questo errore:

manca un passaggio molto importante.

SELinux (Ess_I_Linucs, non selinucs)

In Centos è installato automaticamente SELinux. Si tratta di un modulo aggiuntivo di sicurezza per monitorare gli accessi. Su Centos è configurato per lavorare con Apache e le directory di default ma usando i VirtualHost e volendo registrare i log di ognuno nella rispettiva directory deve essere riconfigurato. Dobbiamo quindi rivedere le policy di SELinux.

Per modificare la configurazione di SELinux è d'uopo utilizzare il pacchetto di gestione semanage che su Centos 8 è già installato ed avviato. Infatti lo potete verificare facendo semplicemente un "man semanage" che riporterà il manuale di semanage. Lo potete anche cercare in /usr/sbin/.

Prima di modificare la policy della directory di log da noi creata per il nostro VirtualHost, vediamo come SELinux li ha impostati per essa:

come si legge, questo commando riporterà:

    unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/sitotest/log/

questo significa che SELinux, nel contesto con il "type" httpd_sys_content_t, permette ad Apache di leggere solamente (Read-Only) nella directory /var/www (che include il nostro virtualhost e la rispettiva directory di log). I file di log devono essere invece scritti (meglio "appesi") nella directory /var/www/miosito/log appena creata. Per fare ciò dobbiamo taggare questa directory con un contesto differente: httpd_log_t che permette anche di scrivere. Infatti, normalmente, Apache scrive i file di log in /var/log/httpd/error.log che ha, come tipo, httpd_log_t (lo potete verificare con un ls -dZ /var/log/httpd). Se vogliamo fare sì che il nostro nuovo path per i file di log sia scrivibile da Apache, dobbiamo dare alla directory i permessi richiesti da SElinux.

Con il comando seguente modificheremo la policy per la dir voluta (che però con semanage non saranno disponibili immediatamente in runtime):

con il seguente comando applicheremo immediatamente i cambiamenti e li renderemo persistenti ai reboot:

Il comando restorecon ristabilisce le policy che abbiamo scritto nella configurazione (il comando "semanage" sopra).
Mettiamo, giusto per un esempio, di preparare un file.html nella directory /home. Se poi prendiamo questo file e lo copiamo in /var/www/miosito/html non c'è nessun problema perchè la copia prende un file scritto in una directory (con la policy rispettiva) e crea uno nuovo identico nella directory di destinazione, assumendo la policy di quest'ultima.
Ma se invece facciamo un move, in realtà prendiamo un file e lo ricreiamo nella directory di destinazione, mantenendo la policy della directory originaria.
Questo è il motivo per il quale dobbiamo riconfigurare le policy per il nuovo file in modo che siano dello stesso tipo che permette ad Apache di leggerlo o di leggerlo-scriverlo. Con il comando restorecon facciamo proprio un restore della policy originaria della directory di destinazione per il file nuovo.
Nell'esempio seguente, con -R, applico il comando a tutti i file presenti nella directory html, ricorsivamente:

Qui sotto, grazie alla -v di verbose, possiamo vedere gli output dei suddetti comandi applicati alla directory di log:

Ricontrolliamo:

ora Apache potrà leggere i file dalla directory /var/www/miosito/log perchè il tipo è httpd_log_t.

Verifichiamo

La pagina dovrebbe essere ora visibile dal browser di un pc della LAN digitando

    http://<indirizzo ip host>

Perchè sia accessibile con il nome del sito dovete aggiungere al file /etc/hosts (sugli Unix) il collegamento tra il vostro indirizzo ip e il nome del sito.

Ricordarsi di cambiare il file DNS degli altri host perché, digitando sul rispettivo browser il nome del sito invece dell'indirizzo IP, lo riconoscano. Per esempio, su Windows 10, aggiungere l’IP e il nome del sito al file:

    C:\Windows\System32\drives\etc\hosts

usando Note come Amministratore.

Volendo e se disponibile si può aggiungere la coppia “IP : nome sito” al proprio router in modo che sia accessibile da ogni device sulla LAN.

Su Firefox può capitare che, senza esservi accorti del trucchetto di seguito spiegato, se mettete nella casella di ricerca solo “miosito” e lo avete preparato per la porta 80 ci sarà un reindirizzamento verso https://miosito che ovviamente non troverà.
Per avere invece la possibilità di scrivere semplicemente miosito volendo intendere http://miosito sarà necessario andare in cronologia, cancella cronologia, spuntare solo “Sites Preference” e procedere con la cancellazione.
Ora se scrivete miosito vi verrà chiesto se intendete http://miosito, confermate e non dovrete più scrivere l’URL completo di http...