Liberamente adattato da “Linux Server per l`amministratore di rete

Transcript

Liberamente adattato da “Linux Server per l`amministratore di rete
Laboratorio di sistemi
Apache
Sistemi operativi
Liberamente adattato da “Linux Server per l'amministratore di rete” di Silvio Umberto
Zanzi
Web server Apache
Un sito web notoriamente è costituito da un insieme di pagine web tra loro collegate e
contenenti informazioni di natura molto varia. Le pagine sono rese disponibili per la
consultazione da un computer (il server) su cui è installato un programma chiamato
server web. Per consultare le pagine, gli utenti usano un programma client chiamato
browser (ad esempio Internet Explorer, Firefox, Opera, Netscape ecc). Il browser richiede
una pagina al server mediante il protocollo HTTP e il server, tramite lo stesso protocollo,
restituisce la pagina richiesta (costituita da codice HTML) che poi viene “renderizzata” dal
browser.
Uno dei server web Open Source di maggior successo, come è evidenziato nelle figure
seguenti, è costituito da Apache (http://httpd.apache.org/ e http://www.apache.org),
attualmente alla versione 2.2. Esso è supportato praticamente in tutte le installazioni di
Linux.
Market Share for Top Servers Across All Domains August 1995 - October 2007
Top Developers
Developer
Apache
Microsoft
Google
Sun
lighttpd
September 2007 Percent October 2007 Percent Change
68,228,561 50.48%
68,155,320 47.73%
-2.75
47,232,300 34.94%
53,017,735 37.13%
2.18
6,616,713
4.90%
7,763,516
5.44%
0.54
2,212,821
1.64%
2,262,019
1.58%
-0.05
1,515,963
1.12%
1,541,779
1.08%
-0.04
appunti_apache.pdf
Pag. 1/14
Cozzetto ©
Laboratorio di sistemi
Apache
Sistemi operativi
Apache in genere nei sistemi basati su Debian è già incluso; se si volesse comunque
verificare la presenza del pacchetto nei repository di Ubuntu, si può digitare (nel nostro
caso abbiamo usato la nuova versione 7.10 di Ubuntu uscita lo scorso 18 ottobre):
maurizio@maurizio-laptop:~$ apt-cache search apache2 | grep apache2
Qualora il pacchetto non sia già installato sulla macchina, possiamo installarlo con
maurizio@maurizio-laptop:~$ sudo apt-get install apache2
Una volta installato, verifichiamo la presenza dei 2 pacchetti di base, apache2 e apache2doc.
Occorre controllare poi la presenza di alcuni moduli aggiuntivi di fondamentale
importanza:
libapache2-mod-python (supporto per il linguaggio Python)
libapache2-mod-perl (supporto per il linguaggio Perl)
libapache2-mod-ssl (supporto SSL per le transazioni web sicure)
libapache2-mod-php (supporto per il linguaggio Php)
Completata l'installazione si dovrebbe avere una server root, cioè una directory
contenente i file di configurazione, nel nostro caso /etc/apache2 e una document root
ossia la directory contenente le pagine web da pubblicare, nel nostro caso /var/www.
Per verificare che il processo Apache sia in esecuzione si può usare il comando:
maurizio@maurizio-laptop:~$ sudo ps aux | grep apache2
appunti_apache.pdf
Pag. 2/14
Cozzetto ©
Laboratorio di sistemi
Apache
Sistemi operativi
Il server web in realtà come si può vedere dalla figura precedente utilizza un processo
principale residente in memoria più una serie di processi secondari. E' possibile una
rappresentazione grafica dei processi in esecuzione tramite il comando
maurizio@maurizio-laptop:~$ pstree -p | grep apache2
Avviare, fermare, riavviare il server
Se facciamo delle modifiche alla configurazione di Apache, dobbiamo riavviare il server
con
maurizio@maurizio-laptop: sudo /etc/init.d/apache2 restart
mentre per farlo partire, scriviamo
maurizio@maurizio-laptop: sudo /etc/init.d/apache2 start
appunti_apache.pdf
Pag. 3/14
Cozzetto ©
Laboratorio di sistemi
Apache
Sistemi operativi
per fermarlo invece scriviamo
maurizio@maurizio-laptop: sudo /etc/init.d/apache2 stop
File di configurazione
In genere le distribuzioni di Linux comprendono un'installazione di Apache in grado di
funzionare sin dal primo avvio del sistema. Questo può risultare comodo ma se si pensa
di mettere in produzione il server web così com'è si commette un grave errore. Occorre
configurare il server in modo che soddisfi ad alcuni requisiti minimi di sicurezza.
Occorre innanzitutto impostare il file di configurazione principale di Apache. Nelle
distribuzioni basate su Debian, si chiama apache2.conf.
Se non si sa dove si trova, si provi a cercarlo con
maurizio@maurizio-laptop:/$ sudo find / -name 'apache2.conf'
Lo troviamo nella directory /etc/apache2. Editiamolo con nano editor
maurizio@maurizio-laptop:/$ sudo nano apache2.conf
Questo file in genere è diviso in 3 sezioni: “global environment”, che contiene opzioni
per il funzionamento generale del server Apache, “main server configuration” che
raggruppa opzioni che regolano il funzionamento del sito di default e “virtual host”, che
regola il funzionamento dei siti virtuali.
Diamo uno sguardo alla sezione 1: global environment.
ServerTokens Full
Troviamo l'opzione ServerTokens e il qualificatore Full
La risposta fornita dal server quando si digita l'indirizzo del server (http://127.0.0.1
appunti_apache.pdf
Pag. 4/14
Cozzetto ©
Laboratorio di sistemi
Apache
Sistemi operativi
oppure http://localhost) può andar bene quando si è appena installato il server e si
vogliono effettuare alcuni controlli sulla configurazione. E' preferibile invece, se il server è
destinato alla produzione, di fornire all'esterno meno informazioni possibili: meno
informazioni vengono pubblicate e più sicura è l'installazione.
I qualificatori possibili sono: Full, OS, Minor, Minimal, Major oppure Prod per cui Minimal
è quello che ci interessa.
Adesso le informazioni fornite sono solo quelle essenziali
ServerRoot "/etc/apache2"
Rappresenta la radice del server di default. È possibile modificare il percorso e far
puntare la radice del server ad altra posizione nel file system.
File /var/run/apache2.pid
Contiene l'id del processo principale di Apache. Infatti se apriamo con un editor il file
apache2.pid si può leggere il numero del processo principale di Apache.
maurizio@maurizio-laptop:/var/run$ sudo nano apache2.pid
oppure
maurizio@maurizio-laptop:/var/run$ sudo gedit apache2.pid
(se usiamo gedit come editor come nella figura)
appunti_apache.pdf
Pag. 5/14
Cozzetto ©
Laboratorio di sistemi
Apache
Sistemi operativi
Server-Pool Size Regolation (MPM specific, Multi-Processing Module)
E' un'opzione che regola il numero dei server Apache presente nel sistema. La scelta viene
fatta in base alla particolare configurazione hardware della macchina.
Nelle installazioni base di Linux, si può scegliere tra il modulo prefork MPM (attivo di
default) o worker MPM per le installazioni a elevato carico.
Nel modulo prefork sono interessanti i parametri di seguito riportati:
StartServers: numero di processi che saranno attivati all'avvio del servizio.
MinSpareServers: il numero dei processi in attesa in un dato istante. Tale numero è
variabile e in genere occorre impedire che tale valore scenda al di sotto della soglia
stabilita in quanto in caso contrario ciò potrebbe portare ad un esaurimento delle risorse
del sistema.
MaxSpareServers: numero massimo di processi liberi. Se il numero di processi sale oltre
questa soglia, i processi in eccesso vengono eliminati.
MaxCLients: il numero massimo di processi che è possibile creare.
MaxRequestPerChild: numero massimo di richieste che un processo può elaborare nel
corso della sua esistenza.
Listen 80
Indica la porta su cui il server è in ascolto. Per default è la porta 80.
Qualora sulla macchina ci siano più schede di rete, si può stabilire su quale porta
ascoltare: basta inserire l'ip relativo
Listen 192.168.1.100:80 indica l'ip della macchina e la porta (80) su cui il server è in
ascolto
Listen 192.168.1.101:8080 indica l'ip della macchina e la porta (8080) su cui il server
web è in ascolto
appunti_apache.pdf
Pag. 6/14
Cozzetto ©
Laboratorio di sistemi
Apache
Sistemi operativi
LoadModule
Allo scopo di espandere le proprie funzionalità, Apache è in grado di caricare in memoria
dei moduli software di solito in formato binario. Per farlo, basta usare la direttiva
LoadModule seguita dal nome del modulo che si vuole caricare. Ad esempio
Load cgi_module modules/mod_cgi.so
carica il modulo mod_cgi.so per la gestione delle cgi.
Include
La configurazione di Apache non è tutta contenuta all'interno del file di configurazione
apache2.conf. Con questa direttiva possiamo caricare ulteriori configurazioni da file
specificati esternamente disponibili nella directory specificata. Ad esempio
Include conf.d/*.conf
carica tutti i file di configurazione presenti nella directory conf.d. Molte volte con Apache
viene fornito anche il supporto per il linguaggio di programmazione Php che è regolato
dal file di configurazione php.conf contenuto nella directoy conf.d; tutte le volte che il
server web incontra una pagina php attiverà l'interprete del Php trasformando il codice
Php in codice HTML in base alle funzionalità previste dagli script presenti sul sistema.
Sito predefinito
Per sito predefinito (o di default) intendiamo la raccolta di pagine web che si possono
ottenere digitando l'indirizzo del server che come abbiamo visto precedentemente può
essere raggiungibile digitando http://127.0.0.1 oppure http://localhost. Apache
consente inoltre di definire un certo numero di siti virtuali e di siti utente come vedremo
più avanti. La seconda sezione del file di configurazione regola appunto il sito web di
default.
Verifichiamo le direttive User e Group
User www-data
Group www-data
Durante l'installazione del programma vengono infatti creati un gruppo e un utente di
default; nel nostro caso il gruppo è www-data e lo user di default è ancora www-data; in
altre distribuzioni esiste l'utente chiamato Apache e il gruppo con lo stesso nome dotati
di limitati diritti di accesso.
In molte installazioni si compie la scelta sbagliata di inserire anche l'utente root. Questo
costituisce un bug per la sicurezza dei dati perchè in caso di violazione del servizio web
si può attaccare il sistema con il ruolo di superuser.
ServerAdmin [email protected]
indica l'indirizzo di posta elettronica sul quale verrano inviati i messaggi generati dal
servizio web.
ServerName www.nomesito.dominio
Spesse volte all'avvio o al riavvio di Apache appare il seguente messaggio:
appunti_apache.pdf
Pag. 7/14
Cozzetto ©
Laboratorio di sistemi
Apache
Sistemi operativi
Questo indica che non è stato assegnato un nome al server nel file di configurazione (la
direttiva ServerName potrebbe essere commentata). Si può assegnare quindi un nome al
server ma esso deve essere comunque un nome risolvibile attraverso il DNS. Se non si
dispone di un nome risolvibile come accade di solito nelle installazioni di test effettuate
sulla propria macchina in locale, si può comunque eliminare il messaggio sulla mancata
risoluzione del nome assegnando l'indirizzo convenzionale 127.0.0.1. Decommentiamo la
riga e modifichiamola come segue:
ServerName 127.0.0.1
Al riavvio Apache non presenta più il messaggio relativo al nome.
DocumentRoot
Il parametro DocumentRoot specifica la posizione nel file system del sito di default; nella
maggior parte dei casi è /var/www/html; nel nostro caso è /var/www. Il nome del file
principale è stabilito dalla direttiva DirectoryIndex; per default è index.html.
appunti_apache.pdf
Pag. 8/14
Cozzetto ©
Laboratorio di sistemi
Apache
Sistemi operativi
Protezione delle directory
omesso
Protezione dei file
omesso
Log di Apache
Le attività di Apache sono memorizzate in alcuni file testuali denominati file di log che si
trovano nella cartella /var/log/apache2 (nel caso della nostra distro Ubuntu).
Il file più interessante è il file access.log all'interno del quale sono registrati i singoli
accessi eseguiti al web server. Nel file sono riportate informazioni quali l'indirizzo IP, la
risorsa richiesta, la data e l'ora. Leggendo tale file si possono trarre informazioni sul
gradimento del sito e molti sistemi di statistiche infatti producono dei grafici proprio
elaborando le informazioni contenute in questo file.
Un altro file interessante è il file error.log che raccoglie tutti gli errori generati dal web
server e tutte le richieste di accesso a risorse inesistenti o protette. Il file error.log
rappresenta quindi il punto di partenza per eventuali tentativi di abuso del sistema.
I nomi dei file di log sono modificabili mediante il parametro ErrorLog
ErrorLog /var/log/apache2/error.log
I file di log raccolgono molti altri tipi di informazioni differenti che è possibile combinare
in un file di log unico con la direttiva CustomLog. Ad esempio:
CustomLog logs/access_log combined
oppure è possibile generare file di log distinti.
Nei file di log vengono registrati gli indirizzi IP degli accessi esterni. E' possibile
eventualmente ottenere la risoluzione dell'IP mediante la direttiva HostNameLookUps
appunti_apache.pdf
Pag. 9/14
Cozzetto ©
Laboratorio di sistemi
Apache
Sistemi operativi
impostata ad On
HostNameLookUps On
Siti utente
Linux è un sistema operativo multiutente. Ogni utente accede al sistema mediante
credenziali univoche (username e password) e accede a un certo numero di risorse tra cui
la propria directory utente. Tutte le directory utente sono memorizzate all'interno della
directory /home e al momento della creazione dell'utente (comando useradd) viene
generata la cartella relativa all'utente (con lo stesso nome) e altri file di configurazione (in
genere nascosti, cioè cominciano col . ad esempio il file .profile).
E' possibile fare in modo che ogni utente crei un proprio sito web all'interno della propria
home directory e che Apache ne pubblichi il contenuto.
Per accedere al sito web di un certo utente sarà sufficiente digitare
http://www.nomesito.dominio/~nomeutente
Per ottenere questa funzionalità, ogni utente dovrà creare una cartella il cui nome è
stabilito dalla direttiva UserDir
UserDir public_html
(nel nostro caso public_html) al cui interno saranno pubblicate le pagine web. Le cartelle
all'interno di /home dovranno possedere diritti 711 mentre i file del sito personale
dovranno possedere diritti 744 (basta impartire il comando chmod).
Per poter usare la direttiva UserDir, bisogna ricordarsi di caricare il modulo
corrispondente mod_userdir (basta scrivere la direttiva LoadModule prima della direttiva
UserDir):
LoadModule userdir_module /usr/lib/apache2/modules/mod_userdir.so
e riavviare Apache.
Occorre ricordare infine che l'amministratore del sistema deve regolare attentamente i
criteri di protezione delle cartelle per impedire a utenti malintenzionati di accedere
indisciminatamente al sistema. Infatti questi potrebbero collegarsi al sistema in shell
remota e tentare di penetrare nel sistema sfruttando la conoscenza della user-id di
accesso magari immettendo password che hanno attinenza con l'utente.
Siti virtuali
Apache è in grado di gestire un numero arbitrario di siti appartenenti a diversi domini.
appunti_apache.pdf
Pag. 10/14
Cozzetto ©
Laboratorio di sistemi
Apache
Sistemi operativi
Per prima cosa, nella DocumentRoot si deve creare una directory per ogni sito cliente, ad
esempio
maurizio@maurizio-laptop:/var/www$ mkdir sito_cliente1
maurizio@maurizio-laptop:/var/www$ mkdir sito_cliente2
All'interno delle directory si caricano i file dei vari clienti (pagine web, immagini ecc).
Poi si apre il file apache2.conf e si va nella sezione 3 (Virtual Hosts) e si specifica la
configurazione per il primo sito:
### Section 3: Virtual Hosts
<VirtualHost *:80>
ServerName dominio_cliente1.com
DocumentRoot /var/www/sito_cliente1
ServerAdmin [email protected]
ErrorLog logs/cliente1_error_log
CustomLog logs/cliente1_access_log_common
</VirtualHost>
La prima riga indica su quale indirizzo e su quale porta si vuole ascoltare.
ServerName è il dominio DNS del cliente senza www.
Sotto con DocumentRoot è indicata la directory che contiene il sito del cliente 1. Le
direttive seguenti indicano dive si vogliono registrare i file di log.
La stessa cosa va fatta per gli altri siti dei clienti.
Si riavvia Apache. A questo punto, l'utente digita la url del sito del cliente1: Apache
riconosce il dominio e in base alla configurazione visualizza il sito relativo.
Protezione di directory utente
Apache dispone di un meccanismo per la protezione di directory utente che diventano
accessibili solo dopo aver fornito uno username e una password.
Innanzitutto creiamo nella cartella public_html della nostra home directory una cartella
privata e controlliamo il percorso con pwd
maurizio@maurizio-laptop:~$ cd public_html/
maurizio@maurizio-laptop:~/public_html$ mkdir private
maurizio@maurizio-laptop:~/public_html$ ls
index.html private
maurizio@maurizio-laptop:~/public_html$ cd private
maurizio@maurizio-laptop:~/public_html/private$ pwd
/home/maurizio/public_html/private
Creiamo il file .htpasswd (è un file nascosto per cui dovremo digitare il comando ls -al
per vederlo nella lista delle directory e dei file) contenente la coppia username:password
maurizio@maurizio-laptop:~/public_html/private$ htpasswd -c .htpasswd maurizio
appunti_apache.pdf
Pag. 11/14
Cozzetto ©
Laboratorio di sistemi
Apache
Sistemi operativi
New password:
Re-type new password:
Adding password for user maurizio
L'opzione -c ci consente di creare il file la prima volta. La password sarà criptata.
maurizio@maurizio-laptop:~/public_html/private$ cat .htpasswd
maurizio:RwueYUlC5KHNA
(nome utente maurizio, password ciccio)
Creiamo ora il file .htaccess contenente le seguenti direttive:
AuthUserFile /home/maurizio/public_html/private /.htpasswd
AuthName "Title for Protected Site"
AuthType Basic
Require valid-user
Cambiamo gli attributi dei file .htaccess e .htpasswd nel seguente modo (sola lettura)
maurizio@maurizio-laptop:~/public_html/private$ sudo chmod a+r .htaccess .htpasswd
maurizio@maurizio-laptop:~/public_html/private$ ls -al
totale 16
drwxr-xr-x 2 maurizio maurizio 4096 2007-11-29 07:01 .
drwx--x--x 3 maurizio maurizio 4096 2007-11-29 06:57 ..
-rw-r--r-- 1 root
root
128 2007-11-29 07:00 .htaccess
-rw-r--r-- 1 maurizio maurizio 23 2007-11-29 07:01 .htpasswd
Facciamo ripartire Apache
maurizio@maurizio-laptop:~/public_html/private$ sudo /etc/init.d/apache2 restart
* Restarting web server apache2
[OK]
Adesso, digitiamo nella barra degli indirizzi
http://localhost/~maurizio/private
Forniamo nome utente e password
appunti_apache.pdf
Pag. 12/14
Cozzetto ©
Laboratorio di sistemi
appunti_apache.pdf
Apache
Pag. 13/14
Sistemi operativi
Cozzetto ©
Laboratorio di sistemi
Apache
Sistemi operativi
Penseremo in seguito a preparare le pagine da inserire nell'area protetta. Ricordiamo
comunque che la trasmissione dei dati avviene in chiaro e che è pertanto sconsigliato
inserire informazioni strettamente riservate e confindenziali con questa tecnica.
Meglio ricorrere a tecniche di compressione crittografica più sofisticate e ad un server
sicuro.
Listing delle directory
Se si digita la url di un indirizzo web con riferimenti a directory che non contengono
pagine web, Apache mostra la lista dei file presenti (listing). Questa non è una buona
misura di sicurezza perchè consente ad un malintenzionato di esaminare il contenuto
delle directory presenti nel sistema e di navigare in qualche modo il file system del
server.
Bisogna cancellare l'opzione Indexes da tutte le direttive Options dei blocchi <Directory>
come nel caso della root del server. Pertanto
<Directory />
Options FollowSymLinks Indexes
AllowOverride None
</Directory>
diventa
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
Ovviamente è necesario riavviare il server.
appunti_apache.pdf
Pag. 14/14
Cozzetto ©