## HTTPD - Server web Apache2

Apache è il server web più utilizzato nei sistemi Linux. I server web sono usati per inviare le pagine web che vengono richieste da un client, che richiedono pagine web usando browser web come Firefox, Opera o Mozilla.

Gli utenti inseriscono un URL (Uniform Resource Locator) per contattare un server web conoscendo il suo FQDN (Fully Qualified Domain Name, nome di dominio non ambiguo, ndt) e un percorso per la risorsa richiesta. Per esempio, per vedere la pagina principale del sito web di Ubuntu,> l'utente deve inserire solamente il FQDN. Per richiedere informazioni specifiche sul supporto a pagamento, l'utente deve inserire il FQDN seguito da un percorso.

Il protocollo più utilizzato per il trasferimento delle pagine web è l'HTTP (Hyper Text Transfer Protocol). Sono anche supportati protocolli come HTTPS (Hyper Text Transfer Protocol over Secure Sockets Layer) e FTP (File Transfer Protocol), un protocollo per caricare e scaricare file dalla rete.

I web server Apache vengono comunemente usati in combinazione con il motore di database MySQL, il linguaggio di scripting per il pre-processamento dell'ipertesto PHP (Pre-processor Hyper Text) e altri noti linguaggi di scripting come Python e Perl. Questa configurazione viene denominata LAMP (Linux, Apache, MYSQL e Perl/Phyton/PHP) e costituisce una piattaforma robusta e potente per lo sviluppo e l'installazione di applicazioni basate sul web.

### Installazione

Il server web Apache2 è disponibile in Ubuntu Linux. Per installarlo:

- Inserire il seguente comando a un prompt di terminale:

      sudo apt-get install apache2

### Configurazione

Apache viene configurato inserendo delle direttive in alcuni file di configurazione (file di testo semplice). Il file di configurazione principale è `apache2.conf. Include;`

Il server inoltre legge un file contenente i tipi MIME dei documenti. Il nome di questo file è impostato attraverso la direttiva TypesConfig; in modo predefinito il nome è `mime.types`.

Il file di configurazione predefinito di Apache2 è `/etc/apache2/apache2.conf`. È possibile modificare questo file per configurare il server Apache2. È possibile configurare il numero della porta, l'origine dei documenti, i moduli, i file di registro, gli host virtuali e altro.

#### Impostazioni di base

Questa sezione espone i parametri di configurazione fondamentali del server Apache2. Per maggioni informazioni, consultare la documentazione di Apache2.

- Apache2 viene fornito con una configurazione predefinita di un singolo host virtuale. L'host virtuale viene definito attraverso la direttiva VirtualHost che può essere usata così com'è, se si dispone di un unico sito, oppure modificata per aggiungere altri host virtuali, a seconda delle necessità. Se viene lasciato solo un host virtuale, questo diventa il sito predefinito o il sito che gli utenti vedono se l'URL inserito non corrisponde a nessuna direttiva ServerName di altri siti. Per cambiare l'host virtuale predefinito, modificare il file `/etc/apache2/sites-available/default`. Se si desidera configurare un altro host virtuale o un altro sito, bisogna copiare il file all'interno della stessa directory cambiandone il nome. Per esempio sudo cp /etc/apache2/sites-available/default /etc/apache2/sites-available/mynewsite Modificare quindi il nuovo file di configurazione usando alcune delle direttive descritte in seguito.

- La direttiva ServerAdmin specifica a quale indirizzo email il sistema deve indirizzare la posta destinata agli amministratori. Il valore predefinito è «webmaster@localhost». Quest’impostazione deve essere modificata con l’indirizzo che è stato assegnato all’utente (nel caso sia l’amministratore). Se il sito presenta dei problemi, Apache2 mostrerà un messaggio di errore indicante l'indirizzo a cui deve essere segnalato il problema. Questa direttiva è presente nel file /etc/apache2/sites-available del proprio sito.

- La direttiva Listen specifica la porta, e opzionalmente l'indirizzo IP, su cui Apache2 dovrebbe essere in ascolto. Se l'indirizzo IP non è specificato, Apache2 ascolta tutti gli indirizzi IP assegnati alla macchina. Il valore predefinito per la direttiva Listen è 80. Modificare questo valore, in 127.0.0.1:80 per fare in modo che Apache2 ascolti solo l'interfaccia di loopback e non sia disponibile verso internet, in 81 per modificare la porta di ascolto o lasciare il valore predefinito per il normale funzionamento. Questa direttiva può essere trovata e modifica in un file specifico: `/etc/apache2/ports.conf`

- La direttiva ServerName è opzionale e specifica a quale FQDN il proprio sito dovrebbe rispondere. Se l'host virtuale predefinito non ha alcun ServerName specificato, tutte le richieste non corrispondenti a un'altra direttiva ServerName di un altro host virtuale saranno soddisfatte. Se si ha appena acquistato il dominio «ubunturocks.com» e si vuole "ospitarlo" sul proprio server Ubuntu, il valore della direttiva ServerName nel file di configurazione dell'host virtuale dovrebbe essere impostato a «ubunturocks.com». Aggiungere questa direttiva al file dell'host virtuale appena creato (`/etc/apache2/sites-available/mynewsite`).

  Potrebbe essere necessario fare in modo che il proprio sito risponda anche a www.ubunturocks.com, dato che molti utenti ritengono il prefisso «www» appropriato. Per fare questo utilizzare la direttiva ServerAlias. È possibile utilizzare anche metacaratteri in questa direttiva. Per esempio, ServerAlias *.ubunturocks.com causerà il proprio sito a rispondere a tutte le richieste che finiscono con «.ubunturocks.com».

- La direttiva DocumentRoot stabilisce in che posizione il server Apache deve cercare i file che compongono il sito. Il valore predefinito è /var/www. Nessun sito è configurato, se si tolgono i commenti alla direttiva RedirectMatch in `/etc/apache2/apache2.conf` le richieste sono indirizzate verso /var/www/apache2-default dove Apache2 è in attesa. Modificare questo valore nel file del proprio host virtuale e creare la directory se necessario.

La directory /etc/apache2/sites-available non è analizzata da Apache2. Collegamenti simbolici in /etc/apache2/sites-enabled puntano ai siti disponibili. Per creare questi collegamenti simbolici, utilizzare l'utilità a2ensite (Apache2 Enable Site) in questo modo: sudo a2ensite mynewsite, dove il file di configurazione del sito è `/etc/apache2/sites-available/mynewsite`. Allo stesso modo, l'utilità a2dissite dovrebbe essere utilizzata per disabilitare siti web.

#### Impostazioni predefinite

Questa sezione si occupa delle impostazioni predefinite del server Apache2. Per esempio, se viene aggiunto un host virtuale, le impostazioni modificate dell'host virtuale hanno precedenza rispetto quelle dell'host. Per una direttiva non definita, viene utilizzato il valore predefinito.

- DirectoryIndex è la pagina predefinita proposta dal server alle richieste dell'indice di una directory, specificate attraverso l'uso di una barra (/) come suffisso al nome della directory.

  Se, per esemio, un utente richiede la pagina http://www.example.com/questa_directory/ ottiene la pagina DirectoryIndex se esiste, un elenco di directory generato dal server se è stata specificata l'opzione Indexes o una pagina di permesso negato se nessuna delle opzioni precedenti è abilitata. Il server cerca tra i file elencati nella direttiva DirectoryIndex e visualizza il primo che trova. Se il server non trova nessuno di questi file ed è presente l'opzione OptionsIndexes per quella directory, allora creerà un elenco in HTML di tutte le sottodirectory e dei file di tale directory. Il valore predefinito in `/etc/apache2/apache2.conf` è «index.html index.cgi index.pl index.php index.xhtml». Se Apache2 trova un file corrispondente a quelli elencati, visualizza il primo.

- La direttiva ErrorDocument consente di specificare un file da utilizzare in caso di errori. Per esempio, se un utente richiede delle risorse inesistenti, si ha un errore 404 e, in base alla configurazione predefinita di Apache2, viene visualizzato il file `/usr/share/apache2/error/HTTP_NOT_FOUND.html.var`. Il file non è elencato in DocumentRoot del server, ma esiste una direttiva Alias in `/etc/apache2/apache2.conf` che indirizza le richeste alla directory /error a /usr/share/apache2/error. Per una lista completa delle direttive predefinite ErrorDocument utilizzare il seguente comando: grep ErrorDocument /etc/apache2/apache2.conf

- Il server, in modo predefinito, registra i trasferimenti nel file `/var/log/apache2/access.log`. È possibile cambiare questa impostazione per ogni sito nel file di configurazione dell'host virtuale utilizzando la direttiva CustomLog oppure tralasciare tale configurazione per mantenere quella specificata nel file `/etc/apache2/apache2.conf`. Attraverso la direttiva ErrorLog è possibile specificare il file in cui vengono registrati gli errori, il valore predefinito è `/var/log/apache2/error.log`. Queste impostazioni sono tenute separate dal log dei trasferimenti per aiutare l'utente nella risoluzione dei problemi. È anche posibile specificare il LogLevel (valore predefinito «warn») e LogFormat (consultare `/etc/apache2/apache2.conf` per il valore predefinito).

- Alcune opzioni vengono definite in base alle directory piuttosto che in base al server. Una di queste direttive è Option. Una clausola Directory è racchiusa tra dei tag in stile XML, come:

                          <Directory /var/www/mynewsite>
      ...
      </Directory>

  Le direttive Option, all'interno di una clausola Directory, accettano uno o più dei seguenti valori separati da spazi:

  - ExecCGI: permette l'esecuzione di script CGI. Questi script non vengono eseguiti se l'opzione non è selezionata.

    La maggior parte dei file non dovrebbe essere eseguita come script CGI. Questo potrebbe essere molto pericoloso. Gli script CGI dovrebbero essere tenuti in un directory separata rispetto la DocumentRoot e solo questa directory dovrebbe avere l'opzione ExecCGI abilitata. Questo è il comportamento predefinito e la directory predefinita per gli script CGI è /usr/lib/cgi-bin.

  - Includes: abilita inclusioni lato server. Le inclusioni lato server consentono un file HTML a includere altri file. Questa noon è un'opzione comune. Consultare l'Apache2 SSI Howto per maggiori informazioni.

  - IncludesNOEXEC: permette l'inclusione lato server, ma disabilita i comandi #exec e #include negli script CGI.

  - Indexes: visualizza un elenco dei contenuti della directory, se non esiste alcuna DirectoryIndex (come index.html).

    Per motivi di sicurezza, quest'opzione non dovrebbe essere impostata e soprattutto non su DocumentRoot. Abilitare questa opzione con molta cautela solo su alcune directory e nel caso in cui si desideri poter visualizzare l'intero contenuto della directory.

  - Multiview: supporta una visualizzazione multipla in base al contenuto, questa opzione è disabilitata per ragioni di sicurezza. Per maggiori informazioni consultare la documentazione di Apache2.

  - SymLinksIfOwnerMatch: segue i collegamenti simbolici solamente se il file di arrivo o la directory hanno gli stessi proprietari del collegamento.

#### Impostazioni degli host virtuali

Gli host virtuali consentono l'esecuzione di diversi server per diversi indirizzi IP, host o per diverse porte sulla stessa macchina. Per esempio, è possibile avere in esecuzione sullo stesso server le pagine web http://www.esemio.it e http://www.unaltroesempio.it grazie ai server virtuali. Questa opzione corrisponde, alla direttiva <VirtualHost> per l'host virtuale predefinito e per gli host virtuali basati su indirizzo IP, alla direttiva <NameVirtualHost> per un host virtuale basato sul nome.

Le direttive impostate per un host virtuale si applicano solamente a quel particolare host. Se una direttiva è impostata all'interno del server e non è definita nelle impostazioni dell'host virtuale, vengono utilizzate le impostazioni predefinite. Per esempio, è possibile impostare un indirizzo email per il webmaster e non definirne nessuno per per gli host virtuali.

Impostare la direttiva DocumentRoot in modo che contenga il documento iniziale (come index.html) per l'host virtuale. La DocumentRoot predefinita è `/var/www`.

La direttiva ServerAdmin all'interno di VirtualHost, è l'indirizzo email usato nel piè di pagina nella pagine di errore nel caso in cui si scelga di visualizzare un piè di pagina.

#### Impostazioni del server

Questa sezione si occupa della configurazione delle impostazioni base del server.

LockFile: la direttiva LockFile imposta il percorso al file di lock utilizzato quando il server viene compilato con USE_FCNTL_SERIALIZED_ACCEPT o USE_FLOCK_SERIALIZED_ACCEPT. Deve essere conservato nel disco locale. Questo valore dovrebbe essere lasciato invariato a meno che la directory di log non sia localizzata su una condivisione NFS. In questo caso, il valore dovrebbe essere modificato con una posizione sul disco locale e una directory accessibile solamente dall'utente root.

PidFile: la direttiva PidFile imposta il file in cui il server registra il proprio «pid». Questo file dovrebbe essere leggibile solamente dall'utente root. Nella maggior parte dei casi può essere lasciata invariata.

User: la direttiva User imposta lo «userid» utilizzato dal server in modo tale che risponda alle richieste. Questa impostazione determina l'accesso al server. Qualsiasi file non accessibile a questo utente è inaccessibile anche a chi cerca di visitare il sito. Il valore predefinito è www-data.

A meno che non sia estremamente necessario, non impostare mai la direttiva «User» a root. Utilizzare root con «User» può creare una falla nella sicurezza del server Web.

La direttiva Group è simile alla direttiva User. Group imposta il gruppo a cui il server è tenuto rispondere. Il gruppo predefinito è anche www-data.

#### I moduli di Apache

Apache è un server modulare. Questo implica che solo le funzionalità di base sono incluse nel server e maggiori funzionalità possono essere aggiunte tramite il caricamento di moduli specifici. Alcuni moduli sono inclusi nel server durante la fase di compilazione. Se il server viene compilato affinché utilizzi il caricamento dinamico dei moduli, questi possono essere compilati separatamente e caricati nel server tramite la direttiva LoadModule. In caso contrario, è necessario ricompilare Apache per aggiungere o rimuovere un modulo. Ubuntu compila Apache2 in modo tale da poter caricare i moduli dinamicamente. Potrebbe essere necessario includere delle direttive per un particolare modulo, per fare questo è necessario includerle in un blocco del tipo <Module>. È possibile installare altri moduli per Apache2 e utilizzarli per il proprio server utilizzando, per esempio, apt-get. Per installare il modulo per l'autenticazione MySQL, da terminale digitare:

    sudo apt-get install libapache2-mod-auth-mysql

Una volta installato il modulo, sarà disponibile all'interno della directory `/etc/apache2/mods-available`. È possibile utilizzare il comando a2enmod per abilitare un modulo o a2dismod per disabilitarne uno. Una volta abilitato un modulo, questo sarà disponibile all'interno della directory `/etc/apache2/mods-enabled`.

### Configurazione HTTPS

Il modulo mod_ssl aggiunge un'importante caratteristica al server Apache2, l'abilità di cifrare le comunicazioni. In questo modo, quando il browser utilizza la cifratura SSL per le comunicazioni e il prefisso «https://» viene utilizzato nell'URL (Uniform Resource Locator).

Il modulo mod_ssl è disponibile nel pacchetto apache2-common. Se è stato installato questo paccheto, è possibile eseguire, in un terminale, il seguente comando per avviare il modulo mod_ssl:

    sudo a2enmod ssl

#### Certificati e sicurezza

Per impostare un server sicuro, utilizzare crittografia a chiave pubblica per creare una chiave pubblica e una privata. Nella maggior parte dei casi, viene inviata la richiesta del certificato (compresa la chiave pubblica), una prova dell'identità della società e del pagamento a un Certificate Authority (CA, Autorità di certificazione, ndt). La CA verifica la richiesta e la propria identità e quindi invia il certificato.

In alternativa, è possibile creare i propri certificati auto-firmati. I certificati auto-firmati non dovrebbero essere utilizzati in ambito commerciale dato che non sono accettati automaticamente dai browser web. Agli utenti viene chiesto di accettare il certificato per stabilire una connessione sicura.

Una volta ottenuto un certificato auto-firmato o un certificato da una CA, è necessario installarlo nel proprio server.

#### Tipologie dei certificati

Per far funzionare un server sicuro sono necessari un certificato e una chiave, questo vuol dire che è possibile generare un certificato auto-firmato o comprarne uno firmato da una CA. Un certificato firmato da una CA fornisce due importanti caratteristiche al server:

- I browser, solitamente, riconoscono automaticamente il certificato e consentono l'attivazione di una connessione sicura senza chiedere nulla all'utente.

- Quando un CA emette un certificato, garantisce l'identità dell'organizzazione che fornisce la pagina web al browser.

La maggior parte dei browser web che supportano SSL possiede una lista di CA i cui certificati vengono accettati automaticamente. Se un browser incontra un certificato il cui CA emittente non è presente all'interno della lista, richiede all'utente se accettare o rifiutare la connessione.

È possibile generare un certificato auto-firmato per il proprio server sicuro, ma questo non fornisce le stesse funzionalità di un certificato emesso da una CA. Un certificato auto-firmato non viene riconosciuto dai browser web e allo stesso tempo non fornisce nessuna garanzia riguardo l'organizzazione che gestisce il sito web. Un certificato firmato da una CA fornisce invece queste funzionalità. Il procedimento per ottenere un certificato da una CA è semplice:

1. Creare un coppia di chiavi pubblica e privata.

2. Creare una richiesta per un certificato basato su chiave pubblica. La richiesta del certificato contiene informazioni riguardo il server a la società che lo ospita.

3. Inviare la richiesta, con una fotocopia di un documento di identità, a una CA. Non è possibile consigliare quale autorità di certificazione scegliere. La decisione potrebbe essere basata su esperienze passate, esperienze di amici o colleghi o per un fattore economico.

   Una volta scelta la CA, è necessario seguire le istruzioni fornite dal CA per ottenere il certificato.

4. Una volta che la CA ha verificato l'identità del richiedente, invierà un certificato digitale.

5. Installare il certificato sul server per poter utilizzare le connessioni sicure.

Sia che si sita ottenendo un certificato da una CA sia che si auto-firmi il proprio, il primo passo consiste nel generare una chiave di cifratura.

#### Generare di un CSR (Certificate Signing Request)

Per generare un CSR (Certificate Signing Request), è necessario creare una chiave. Per generare una chiave, da terminale, digitare:

    openssl genrsa -des3 -out server.key 1024

    Generating RSA private key, 1024 bit long modulus
    .....................++++++
    .................++++++
    unable to write 'random state'
    e is 65537 (0x10001)
    Enter pass phrase for server.key:

È ora necessario inserire una passphrase. Per una maggiore sicurezza, dovrebbe contenere almeno 8 caratteri. La lunghezza minima con l'opzione «-des3» è di 4 caratteri. Dovrebbe includere numeri e/o segni di punteggiatura e non dovrebbe essere una parola reperibile in un vocabolario. Ricordarsi che la passphrase è "case-sensitive".

Ripetere la passphrase per la verifica. Una volta inserita correttamente, la chiave per il server è generata e salvata nel file `server.key`.

È possibile utilizzare il server sicuro anche senza una passphrase. Può essere utile in quanto non viene richiesta la passphrase a ogni riavvio del server, ma è altamente insicuro in quanto, se viene compromessa la chiave, è possibile compromettere l'integrità del server.

È comunque possibile utilizzare il server sicuro senza la passphrase non utilizzando l'opzione «-des3» durante la fase di creazione della chiave o eseguendo il seguente comando:

    openssl rsa -in server.key -out server.key.insecure

Una volta eseguito il comando precedente, la chiave non sicura è creata nel file `server.key.insecure`. È possibile utilizzare questo file per generare il CSR senza una passphrase.

Per creare il CSR, eseguire il seguente comando:

    openssl req -new -key server.key -out server.csr

Viene richiesta la passphrase. Se inserita correttamente, è necessario inserire alcune informazioni come nome della società, nome del sito, email, ecc.... Una volta forniti tutti i dati, il CSR è creato nel file `server.csr` e sarà quindi possibile inviare questo CSR a una CA che lo utilizzerà per emettere il certificato. È anche possibile utilizzare il CSR per creare certificati auto-firmati.

#### Creare un certificato auto-firmato

Per creare un certificato auto-firmato, eseguire da un terminale il seguente comando:

    openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Il comando precedente chiederà la passphrase. Una volta digitata correttamente, il certificato viene creato e sarà disponibile nel file `server.crt`.

Se il server deve essere utilizzato in ambito commerciale, è necessario un certificato emesso da una CA. Non è raccomandato utilizzare un certificato auto-firmato.

#### Installare il certificato

Per installare il file della chiave `server.key` e il file del certificato `server.crt` o il certificato emesso dalla CA, eseguire i seguenti comandi in un terminale:

    sudo cp server.crt /etc/ssl/certs
    sudo cp server.key /etc/ssl/private

È necessario anche aggiungere le seguenti quattro righe al file `/etc/apache2/sites-available/default` o al file di configurazione dell'host virtuale. Vanno collocate nella sezione VirtualHost sotto la riga DocumentRoot:

    SSLEngine on

    SSLOptions +FakeBasicAuth +ExportCertData +CompatEnvVars +StrictRequire

    SSLCertificateFile /etc/ssl/certs/server.crt
    SSLCertificateKeyFile /etc/ssl/private/server.key

HTTPS dovrebbe essere in ascolto sulla porta 443. È necessario aggiungere la seguente riga al file `/etc/apache2/ports.conf`:

    Listen 443

#### Accedere al server

Una volta installato il certificato, è necessario riavviare il server web. Per fare ciò, da un terminale digitare:

    sudo /etc/init.d/apache2 restart

È bene ricordarsi la propria passphrase da inserire a ogni riavvio del server web.

Viene richiesta la passphrase. Se inserita correttamente, il server web sicuro viene avviato. È possibile accedere alle pagine sicure del server digitando nella barra degli indirzzi del browser https://nome_host/url.

### Riferimenti

Documentazione di Apache2

Documentazione di Mod SSL

Capitolo 8. Server web |  | PHP5 - Linguaggio di scripting