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 ©