• cerca

SEI GIA' REGISTRATO? EFFETTUA ADESSO IL LOGIN.



HAI DIMENTICATO LA PASSWORD? CLICCA QUI

NON SEI ANCORA REGISTRATO A WEBAREA? CLICCA QUI E REGISTRATI !

Come configurare il server web Apache in Linux per mettere subito on line le tue pagine web!

di :: 01 marzo 2018

apache web server

Apache è probabilmente il pù conosciuto e diffuso server web, cioè colui che eroga le pagine web (come questa che state visualizzando).

In questo articolo vedremo come installare e configurare Apache per utilizzarlo in locale o con un IP Pubblico, e come configurare un virtual host per il nostro sito web. E daremo alcuni accenni sulle regole di Firewall per il vostro Apache.

Vedremo la configurazione per visualizzare pagine web sotto la porta 80, cioè siti web non sicuri raggiungibili con indirizzo "http://", senza l'ormai noto lucchetto verde che appare nella barra degli indirizzi del browser. Per la configurazione sotto "https" si invita alla lettura di un altro articolo, menzionato a fondo pagina.

La sua configurazione è semplice, quanto meno nella configurazione standard.

L'ambiente di lavoro che utilizzerò in questo articolo è il seguente:

  • Il sistema operativo utilizzato è Centos 7 (che per comodità abbiamo installato su una Virtual Box) a cui dovete avere accesso come utenti root.
  • Dovete anche essere connessi alla rete per poter scaricare Apache e testare il suo funzionamento.
  • L'ip locale del server è 192.168.1.10, il nome della macchina è "localhost" (ma nulla vieta di avere un nome diverso)
  • Disponiamo di un IP pubblico 77.81.228.175 e di un dominio "www.ilmiosito.it" (non è necessario averli, ma faremo vedere come configurare Apache anche con un IP Pubblico e un dominio)

Installazione di Apache

Come prima cosa installiamo Apache utilizzando Yum oppure Dnf. E già che ci siamo installiamo anche PHP

# yum intall httpd php
// oppure
# dnf install httpd php

Accettate tutte le richieste che appariranno nel prompt di installazione (dite sempre si)

Pochi istanti e Apache sarà installato sul vostro server

Configurazione di Apache

Il file di configurazione principale di Apache si chiama httpd.conf e si trova in questa posizione: "/etc/httpd/conf/httpd.conf"

Modifichiamolo utilizzando l'editor "vi"

# vi /etc/httpd/conf/httpd.conf

Aperto l'editor, possiamo modificare il file digitando "i". Da questo momento possiamo scrivere nel file.

Andiamo ad inviduare le parti più importanti e cosa modificare/integrare in questo file di configurazione.

Il primo elemento da modificare è l'istruzione Listen, che definisce l'indirizzo IP e la porta su cui Apache deve ascoltare le richieste.

Come porta utilizziamo quella di default per i server web, la porta 80.

Mentre come indirizzo IP hai varie possibilità

  1. Se stai lavorando solo in locale, senza IP pubblico e vuoi vedere le pagine web da questa stessa macchina, devi settare Listen affinchè resti in ascolto in localhost quindi imposti come IP il noto 127.0.0.1
  2. Se vuoi vedere le pagina da un altro PC della rete locale LAN, e non hai un IP pubblico, setta l'IP locale della macchina: 192.168.1.10
  3. Se disponi di un dominio e di un IP Pubblico, indica l'IP pubblico

Ipotizzando di essere nel caso 2, Apache resterà in ascolto sull'ip 192.168.1.10 e sulla porta 80

Listen 192.168.1.10:80

Potresti anche essere meno restrittivo e non indicare l'IP. Apache resterà in ascolto sulla porta 80 (è l'impostazione di default).

Listen 80

Proseguendo nella configurazione incontriamo la direttiva "ServerAdmin": di default è indicato root@localhost.

E' l'indirizzo mail al quale verranno inviati eventuali alert dovuti ad errori di Apache. Dovreste inserire l'indirizzo dell'amministratore del web server ... oppure lascia l'indirizzo di default.

ServerAdmin root@localhost

Successivamente abbiamo al direttiva "ServerName": decommentiamo e indichiamo l'IP pubblico della macchina, se la macchina disponde dell'IP pubblico, o in mancanza, l'IP locale, e la porta sulla quale Apache è in ascolto, la stessa indicata in Listen (la porta 80).

ServerName 192.168.1.10:80

Aggiungiamo poi, se non è presente, la direttiva "ServerTokens" a cui assegnamo valore "Prod".

ServerTokens Prod

ServerTokens indica quante informazioni devono venire inviate dal server nell'header. Un utente smaliziato o un potenziale hacker potrebbe leggere le informazioni inviate dal web server nei suoi header, e iniziare da queste informazioni base per elaborare un attacco. Queste informazioni si carpiscono facilmente, ad esempio utilizzando in Firefox "FireBug" (non più utilizzabile dall'ultima release di Firefox) o "Analizza elemento". Aprendo una pagina di un sito web, negli header trasmessi dal server web, appaiono anche queste informazioni.

header apache

Meno informazioni forniamo sul nostro server, sulla versione di Apache e sui moduli installati (ad esempio la versione di PHP utilizzata), e più sicuri saremo. I valori vanno da "Full", che trasmette il maggior numero di informazioni, a "Prod" che presenta il minor numero di informazioni. La nostra scelta ricade su "Prod".

Sempre per motivi di sicurezza aggiungiamo anche la direttiva "ServerSignature" impostandola ad "Off".

ServerSignature Off

La direttiva ServerSignature viene considerata da Apache se ServerTokens ha valore "Full". ServerSignature consente di visualizzare o meno la versione del server utilizzata. Impostandola ad "Off" la versione non verrà indicata negli header trasmessi. Noi abbiamo impostato "ServerTokens Prod" per cui volendo, potremmo tralasciare questa direttiva.

header apache

Andiamo avanti con il file di configurazione.

Segue una direttiva necessaria per la sicurezza del server

<Directory />
    AllowOverride none
    Require all denied
</Directory>

Con questa direttiva impediamo l'accesso da browser web all'intero server cioè alla root "/". Importantissimo!!!!

Incontriamo poi la direttiva DocumentRoot che specifica la posizione della directory dove sono collocate le pagine web nel nostro server.

Questa direttiva non dovrebbe essere cambiata perché punta già alla posizione standard che è "/var/www/html" (nulla però vi vieta di cambiare path alle pagine web)

DocumentRoot "/var/www/html"

In questa directory andremo a uplodare le pagine web del nostro sito web (o dei nostri siti web, possono essere anche più di uno).

Seguono alcune direttive che sia aprono con "<Directory>" e si chiudono con "</Directory>". Eliminiamole e sostituiamo con questa unica direttiva:

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Tornando alle pagine web, di default la prima pagina che viene visualizzata quando si apre un sito web, senza indicare una specifica pagina da aprire, è la index.html (o index.php se il sito è stato sviluppato in php). Questa pagina di default la definiamo nella successiva direttiva "DirectoryIndex". Nel nostro esempio, come detto, mettiamo come default page la index.html, e in sua assenza prevediamo la index.php

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

Proseguendo nel codice, dovremmo incontrare questa istruzione: serve ad evitare l'apertura da browser web di file "riservati" come i file ".htaccess" e ".htpasswd" (in generale dei file che iniziano per ".ht").

<Files ".ht*">
Require all denied
</Files>

Nei miei lavori, sono più restrittivo e bado molto alla sicurezza, per cui utilizzo anche questo codice, che impedisce l'apertura di file che hanno come estensione ".log", ".inc", ".sh", ".ini", oltre ai ".htaccess" e ".htpasswd"

<FilesMatch "\.(htaccess|htpasswd|ini|log|sh|inc)$">
Order Allow,Deny
Deny from all
</FilesMatch>

Proseguiamo con la configurazione.

Definiamo adesso dove salvare i log degli errori di Apache, ad esempio a seguito di errori nel codice PHP di una pagina web

ErrorLog "logs/error_log"

Gli errori vengono salvati nel file "error_log". Attenzione: "logs" non è un directory ma un alias che il server usa in alternativa al più lungo "/var/log/httpd". Quindi possiamo leggere quel path come "/var/log/httpd/error_log"

Un po diversa è l'istruzione relativa ai log di accesso alle pagine web, contenute nel blocco "<ifModule log_config_module>": all'interno troveremo il path di salvaggio

CustomLog "logs/access_log" combined

Anche in questo caso "logs" è un alias di "/var/log/httpd"
Leggiamo anche "combined", che è una della modalità di salvataggio dei log. Esistono altre modalità come ad esempio, "common" o modalità personalizzate: in pratica indichiamo quante informazioni salvare e il modo in cui il log viene scritto. Approfondite da soli l'argomento log in altri articoli dedicati.

Andiamo avanti nel codice.

Individuiamo "AddDefaultCharset": è il charset, cioè il tipo di codifica caratteri, utilizzato di default da Apache per visualizzare le pagine web: UTF-8

AddDefaultCharset UTF-8

Se le tue pagine web utilizzano, ad esempio, il charset ISO-8859-1, lo indicherete al posto di UTF-8 ... ma il mio consiglio è di sviluppare siti sempre con codifica UTF-8 per evitare problemi con la codifica caratteri particolari o di altri paesi.

A fondo file di configurazione, troviamo una inclusione di un ulteriore file di configurazione, anzi di tutti i file di configurazione (l'asterisco * indica proprio questo) presenti nella vicina directory "/etc/httpd/conf/conf.d".

IncludeOptional conf.d/*.conf

Quindi tutti i file presenti in quella directory verranno quindi inclusi.

Il lavoro sul file di configurazione httpd.conf è completato. Salvate il file, cliccando su "Esc" e poi digitando ":wq" (write quite)

Siamo quasi pronti: 3, 2, 1 ........ avviamo Apache!

# service httpd start

Se nel terminale non appaiono errori, Apache è pronto ad erogare le pagine web.

Volete essere sicuri che Apache stia funzionando correttamente? Verifichiamo il suo stato così:

# service httpd status

Bene, digitiamo nel browser l’indirizzo ip della macchina 192.168.1.10, ed apparirà la pagina di dafault di Apache.

apache test page

Non riusciamo a raggiungere la pagina? Occorre probabilmente verificare le regole di firewall che impediscono l'accesso alle pagine web. Vedremo il firewall, in modo molto sintetico, al fondo di questo articolo.

La pagina di default di Apache

Questa pagina non è la "index.html"... che non abbiamo ancora creato. E' una pagina che appare di default in mancanza d'altro.

E se proprio siete curiosi di sapere tutto su questa pagina di default di Apache vi dico che:

  • questa pagina risiede qui: "/usr/share/httpd/noindex/index.html"
  • viene caricata tramite il file di configurazione "/etc/httpd/conf.d/welcome.conf" (file richiamato dal file di configurazione generale httpd.conf)
  • e se volete rimuoverla, aprite questo file e commentate tutte le sue righe.

Bene, adesso mettiamo on line una nostra pagina.

Creiamo la nostra prima pagina

Se non disponiamo di una pagina da uplodare nello spazio web /var/www/html creiamo al volo una pagina, e la chiamiamo index.html

// mi sposto nella directory
cd /var/www/html
// creo un file index.html
touch index.html
// assegno i permessi di apache al file
chown apache.apache index.html
// scrivo nel file appena creato
echo "CIAO MONDO" > index.html

Et voiltà, riapriamo o aggiorniamo la pagina aperta sul browser ed apparirà la nostra index.html con la scritta "CIAO MONDO"

Se stiamo lavorando senza un dominio e quindi vogliamo raggiungere le pagine da browser web digitando semplicemente l'IP del server web, il nostro lavoro finisce qui.

In caso contrario dobbiamo parlare dei Virtual Hosts

I Virtual Hosts

Se disponiamo di un dominio, ad esempio "www.ilmiosito.it", e vogliamo che il mondo esterno raggiunga il sito web utilizzano il dominio, e non un IP, occorre seguire questa procedura:

  1. Per prima cosa dovete, nel pannello di configurazione del dominio disponibile presso il provider dove l'avete acquistato (ad esempio Aruba.it, Register.it,....) dovete configurare il DNS e fare in modo che a quel dominio sia associato l'IP Pubblico della nostra macchina. Nel nostro esempio è il 77.81.228.175. Normalmente i provider mettono a disposizione dei pannelli semplificati per cui sarà semplice creare questa configurazione. In caso contrario... leggete un articolo dedicato ai DNS :-)
    Configurando correttamente il DNS, chi digiterà nel suo browser il dominio "www.ilmiosito.it", tramite il sistema DNS, arriverà al nostro server.
  2. Occore configurare un Virtual Host su Apache relativo al vostro sito web. Quando pensiamo ad un Virtual Host, pensiamo ad un sito web, così non ci confondiamo.

I siti internet ospitati da Apache vengono detti Virtual Host e possono essere integrati tramite diverse metodologie ma quella usata più utilizzata si chiama "VirtualHost Name-based": ad un indirizzo IP vengono fatti corrispondere più Virtual Host. Quindi un solo IP per tutti i siti che vuoi! Un bel risparmio anche perchè ottenere un IP STATICO PUBBLICO ha un costo spesso elevato. Se pensate di tenere un server in casa o in ufficio, dovete chiedere al vostro fornitore di connettività (ad esempio Fastweb), metre per un siti amatoriali potete utilizzare un IP DINAMICO che è fornito gratuitamente da vari servizi come DynDNS. Se avete preso un server in housing i cui costi mensili di un IP Statico Pubblico sono sicuramente più abbordabili... perchè senza IP non potreste usare il server!

Quando un utente digita il dominio nel browser web (detto "Client", ad esempio Firefox), e quindi fa una richiesta al server Apache, questo eroga la pagina web relativamente al Virtual Host richiesto.

Vediamo come configurare un Virtual Host

Entriamo nella cartella "conf.d" e editiamo il file "vhost.conf"dedicato agli Host Virtuali. E' qui che andiamo ad aggiungere la configurazioni relative al nostro sito web o dei nostri siti web.

Ogni VirtualHost creato, cioè ogni sito, deve aprirsi e chiudersi con i seguenti tag:

<VirtualHost *:80>
.........................
</VirtualHost>

Nel mezzo avremo la configurazione di quel sito web. Questo è un esempio di configurazione, in cui il nostro sito verrà uplodato nella directory "miosito" all'interno del path "/var/www/html"

<VirtualHost *:80>
     ServerName www.ilmiosito.it
     ServerAlias ilmiosito.it ilmiosito.com www.ilmiosito.com www.pippo.it pippo.it 
     DocumentRoot /var/www/html/miosito
     ErrorLog logs/ilmiosito_error_log
     CustomLog logs/ilmiosito_access_log
</VirtualHost>

Vediamo nel dettaglio questa configurazione:

  • Come detto, ogni Virtual Host si apre con il tag <VirtualHost *:80>
    Se vogliamo, al posto dell'asterisco possiamo indicare l'ip pubblico della macchina, quindi <VirtualHost 77.81.228.175:80>
  • ServerName è il dominio del nostro sito, nel nostro esempio: www.ilmiosito.it
  • Server Alias sono tutti i possibili alias del nostro dominio. In poche parole, io voglio che il mio sito si apra anche se digito altri domini come, ad esempio, ilmiosito.it o ilmiosito.com o www.ilmiosito.com o www.pippo.it o pippo.it o ... Tutti questi domini ovviamente vanno configurati sul DNS alla stessa stregua del dominio principale. Digitando uno qualunque di questi alias il sito si vedrà.
  • DocumentRoot è il percorso della directory che contiene le pagine del nostro sito, nel nostro esempio "/var/www/html/miosito"
  • ErrorLog: è il percorso al file di log che registra gli errori di questo sito. In mancanza il log viene registrato nel log di default di Apache, visto in fase di configurazione.
    Nel nostro caso abbiamo usato il file "logs/ilmiosito_error_log"
  • CustomLog: è il percorso al file di log che registra gli accessi a questo sito.

Abbiamo configurato il virtualhost del nostro sito. Ricarichiamo le configurazioni di Apache, oppure riavviamolo con i comandi che già conosciamo.

Digitiamo nel browser il dominio "www.ilmiosito.it" oppure uno dei suoi alias se configurati, e se tutto è andato a buon fine la vostra index.html dovrebbe visualizzarsi.

Abbiamo ultimato la configurazione di Apache

Avviare automaticamente Apache al riavvio del server

In caso di riavvio del server, è necessario che anche Apache si riavvii automaticmente. Per fare questo utilizziamo questo comando:

# chkconfig httpd on

Riavviare o fermare Apache

Finiamo questo articolo indicando i comandi per riavviare (ad esempio perchè avete cambiato configurazione e volete riacaricarla) o fermare Apache

Per riavviare Apache

# service httpd restart

Se abbiamo modificato i file di configurazione e vogliamo ricaricarli senza un riavvio completo, possiamo fare un "reload".

# service httpd reload

Per fermare Apache

# service httpd stop

Comandi alternativi

In alternativa ai comandi "service" e "chkconfig", visti nei paragrafi precendeti, se il vostro server Linux è installato il pacchetto "systemd" potete usare questi comandi

// avvio apache
# systemctl start httpd.service
// verifica dello stato di apache
# systemctl status httpd.service
// arresto di apache
# systemctl stop httpd.service
// riavvio di apache
# systemctl restart httpd.service
// caricare le nuove configurazioni senza riavvio
# systemctl reload httpd.service
// avvio automatico in caso di riavvio del sistema
# systemctl enable httpd.service

Configurare il Firewall per Apache: iptables (o firewalld)

Se Apache è correttamente configurato, e il stato non presenta errori, il problema è molto probabilmente o nella configurazione della rete o nel firewall o in SeLinux

Vediamo come configurare il firewall per visualizzare le pagine web.

Personalmente, utilizzo "IpTables", un po complesso ma avendo una lunga storia web alle spalle sono cresciuto con lui. Qui vedremo solo qualche accenno perchè l'argomento è veramente ampio e complesso.

Visto che stiamo facendo solo delle prove, e vogliamo esser certi che non sia il firewall a bloccare la visualizzazione delle pagine, apriamo tutte le porte!
Crea un file e dentro metti queste righe: in pratica resettiamo IpTables alla sua configurazione di default (tutto aperto)
Carichiamo il file "./mioiptables.sh"

Le regole sono state caricate da IpTables.

Apriamo la pagiana web: si vede? Bene, allora mettiamo qualche regola al nostro firewall. Blocchiamo le connessioni tranne quelle necessarie per visualizzare le pagine web sulla porta 80.

Abbiamo 2 modi per operare in IpTables, o da terminale scriviamo le singole regole, oppure creiamo un file di configurazione personale e lo salviamo. Procediamo per questa seconda via.

Il file lo chiamiamo "miofirewall.sh" (creiamo uno script bash) e lo salviamo nella root del server, quindi qui "/miofirewall.sh"

// mi sposto nella root del server
# cd /
// creo il file myfirewall.sh
touch myfirewall.sh

Editiamo il file (non vi ricordiamo più come si fa) e scriviamo queste righe al suo interno, incluso il cancelletto:

#!/bin/sh

# cancelliamo tutte le regole precenti attive
iptables -F
iptables -X
iptables -Z
# accettiamo tutte le connessioni
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Salviamo il file (ormai sapete come fare), e gli diamo permessi 700 (di esecuzione per l'utente che l'ha creato, cioè l'utente root, cioè noi)

# chmod 700 myfirewall.sh

Adesso, per caricare la configurazione lanciamo il file così

# ./myfirewall.sh

Riapriamo la pagina web: dovreste continuare a vedere la pagina.

Abbiamo capito che era il firewall a bloccare le connessioni alla pagina web, ma in questo momento il firewall non sta proteggendo il nostro server. 

Modifichiamo le regole così

#!/bin/sh

# cancelliamo tutte le regole precenti attive
iptables -F
iptables -X
iptables -Z
# accettiamo tutte le connessioni in uscita
iptables -P OUTPUT ACCEPT
# blocchiamo tutte le connessioni in ingresso e transito
iptables -P INPUT DROP
iptables -P FORWARD DROP
# accettiamo in ingresso solo le connessioni alla porta 80 di Apache
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Ricaricate questo script e dovreste ancora vedere la pagina. Bene, adesso il firewall protegge il serve e consente di vedere le nostre pagine.

Volete conoscere le regole di IpTables attive? Digitate:

# iptables -L

 Adesso vogliamo rendere permanenti le regole create, cioè vogliamo che al riavvio della macchina questo file venga letto.

In Centos, entriamo nella directory "/etc/rc.d": qui si trovano gli script lanciati al boot.
Se esiste un file chiamato "rc.local" editiamo questo file

Se il file esiste già aggiungiamo al fondo una riga dove indicheremo il percorso al file appena creato nella root (quindi "/myfirewall.sh"), se invece lo abbiamo creato dobbiamo inserire questo codice (incluso l'asterisco: è uno script bash)

#!/bin/sh
/myfirewall.sh

Il file deve avere permessi 700

chmod 700 /etc/rc.d/rc.local

Riavviate il server ad esempio usando questo comando (esistono anche altri comandi per il riavvio)

# shutdown -r now

Al riavvio verificate le regole di Iptables attive.

E con questo anche l'argomento IpTables per Apache, che abbiamo visto in modo molto sintetico, è chiuso.

Se invece utilizzate come firewall il programma "firewalld" le istruzioni da seguire sono le seguenti

// aggiungere apache alle regole di firewalld
firewall-cmd --permanent --add-service=http
// oppure
firewall-cmd --permanent --add-port=80/tcp
// riavviare firewalld
systemctl restart firewalld

Disabilitare SeLinux

Riapriamo la pagina web... ancora non si vede? Potrebbe essere presente SeLinux (in CentOS è presente): rappresenta un sistema di sicurezza agli accessi in Linux

Verifichiamo se SeLinux è attivo usando il comando "sestatus"

# sestatus

SELinux status:   enabled
........              

Se appare quella indicazione, SeLinux è presente ed attivo. Disattiviamolo in modo permanente andando a modificare il suo file di configurazione, utilizzando l'editor "vi"

# vi /etc/sysconfig/selinux

Digitiamo il solito "i" per editare il file, e modifichiamo la riga "SELINUX=enforcing " in "SELINUX=disabled"

# vi /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
SELINUX=disabled
..............

Salviamo la configurazione di SeLinux con il solito "Esc" seguito da ":wq"

A questo punto devi riavviare il server affinchè la modifica diventi effettiva.

# shutdown -r now

Attendi il riavvio e prova ad aprire la pagina web. Il riavvio è anche un modo per verificare che Apache venga automaticamente riavviato grazie alla direttiva vista nei paragrafi precedenti.

Se neanche così si apre la tua pagina web probabilmente da qualche parte, o in qualche configurazione, c'è qualcosa di non correttamente configurato... ma le possibilità sono molte e non potremmo elencarle tutte in un articolo.

Per questo: that's all!

Potrebbe interessarti

x

ATTENZIONE