Apache Virtualhosts

Apache is the most used web server in the world. We will see some configurations that can be used for our tutorial.

This manual was written for Ubuntu and RedHat based distros, also we will see some techniques to make Apache more secure.

Planning

Each server need a FQDN for host name and for virtualhosts.
Other best practise is create an alias for the virtualhost like this:

HostName:

web1.oneos.it

ServerName:

www.oneos.it

ServerAlias:

oneos.it

Attention

All names will be registerd on authoritative Dns Server for ths domain.

Virtual Enviroment - VirtualHost

The Apache virtualhosts are made for publish several web site on the same Server Web, there are two metod for obtain this; ip-based or name-based.

For the first one we need an ip address for each virtualhosts, for the second one ip is enough because Apache responds to the requested FQDN. For thsi tutorial we use the metod name-based.

Ubuntu 20.04/22.04

Those are the step for Ubuntu based distros.

Installation Basics

Per prima cosa installiamo i pacchetti necessari. Successivamente abiliteremo i moduli necessari e configureremo l’ambiente per ospitare i VirtualHost.

sudo apt install apache2 apache2-utils php libapache2-mod-php

Abilitiamo alcuni moduli utili ed impostiamo apache per avviarsi al boot del SO.

root@web1:/etc/apache2# a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.


root@web1:/etc/apache2# a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
  systemctl restart apache2

root@web1:/etc/apache2# a2enmod userdir
Enabling module userdir.
To activate the new configuration, you need to run:
  systemctl restart apache2


root@web1:/etc/apache2# systemctl enable --now apache2

L’opzione --now avvia immediatamente il servizio.

Editare il file /etc/apach2/site-available/000-default.conf e modificare la direttiva ServerName con il FQDN del server.

root@web1:/etc/apache2/sites-available# cat 000-default.conf
<VirtualHost *:80>
       # The ServerName directive sets the request scheme, hostname and port that
       # the server uses to identify itself. This is used when creating
       # redirection URLs. In the context of virtual hosts, the ServerName
       # specifies what hostname must appear in the request's Host: header to
       # match this virtual host. For the default virtual host (this file) this
       # value is not decisive as it is used as a last resort host regardless.
       # However, you must set it for any further virtual host explicitly.
       ServerName web1.oa-roma.inaf.it

       ServerAdmin webmaster@localhost
       DocumentRoot /var/www/html

       # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
       # error, crit, alert, emerg.
       # It is also possible to configure the loglevel for particular
       # modules, e.g.
       #LogLevel info ssl:warn

       ErrorLog ${APACHE_LOG_DIR}/error.log
       CustomLog ${APACHE_LOG_DIR}/access.log combined

       # For most configuration files from conf-available/, which are
       # enabled or disabled at a global level, it is possible to
       # include a line for only one particular virtual host. For example the
       # following line enables the CGI configuration for this host only
       # after it has been globally disabled with "a2disconf".
       #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Riavviare il servzio e verificare con un browser il sito http://web1.oneos.it.
A questa URL deve comparire la pagina predifinita di Apache.

root@web1:/etc/apache2/sites-available# systemctl restart apache2

Possiamo personalizzare la pagina predefinita o possiamo decidere di redirezionare tutto il traffico che arriva a questa URL ad uno dei VirtualHost.
Vedremo in seguito come effettuare una redirezione utilizzando il modulo rewrite.

UserDir

Prima di creare il nostro primo VirtualHost occorre decidere come sarà fatto, abbiamo già detto che useremo il metodo del name-based, quello che faremo in più è utilizzare il modulo userdir per isolare a livello di permessi sul filesystem i diversi VirtualHost che saranno presenti sul server.

Quello che di solito viene fatto è posizionare i contentuti dei VirtualHost nella DocumentRoot di Apache che solitamente corrisponde alla cartella /var/www/html.
Questa pratica soffre di problemi di sicurezza in quanto è possibile, mischiare i contenuti dei VirtulHost semplicemente usando una URL malformata.
Non vedremo come fare perché esula da questo manuale, basta sapere che l’utilizzo di di questo modulo è altamente consigliato.

Il modulo Usermod abilita in modalità predefinita la cartella public_html nelle home dir degli utenti di sistema, questa pratica consente agli utenti di pubblicare il loro spazio web semplicemente indicando nella URL il loro nome utente; Es. http://web1.oneos.it/~federico.fiordoliva.
In questo modo i permessi dei file contenuti nello spazio web saranno escusivamente dell’utente che li ha generati.

Le best practice ci dicono di non dare a tutti gli utenti di sistema questa possibilità ma solo agli utenti che dovranno effettivamente pubblicare uno spazio web, nel nostro caso non saranno veri utenti ma utenti dedicati per il VirtualHost.

Editare il file /etc/apache2/mods_enabled/userdir.conf e modificare come da figura.

<IfModule mod_userdir.c>
      UserDir www
      UserDir disabled root
      UserDir enabled doc-oneos

      <Directory "/home/*/www">
              AllowOverride FileInfo AuthConfig Limit Indexes
              Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
              Require method GET POST OPTIONS
      </Directory>
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

In questo modo abiamo detto ad usermod di non abilitare all’utente root e di farlo solo all’utente doc-oneos e di utilizzare la cartella www. Questa impostazione è da considerarsi a livello globale, ma possiamo sovrascrivere alcune cose dal file del VirtualHost.

A questo punto occorre creare l’utente doc-oneos.

root@web1:~# adduser doc-oneos
Adding user `doc-oneos' ...
Adding new group `doc-oneos' (1001) ...
Adding new user `doc-oneos' (1001) with group `doc-oneos' ...
Creating home directory `/home/doc-oneos' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for doc-oneos
Enter the new value, or press ENTER for the default
       Full Name []: doc user
       Room Number []:
       Work Phone []:
       Home Phone []:
       Other []:
Is the information correct? [Y/n] y

Impostare i permessi corretti alla home di doc-oneos.

root@web1:~# chmod o+x /home/doc-oneos

Accedere al server come utente doc-oneos e creare la cartella www. Successivamente creare un file index.html dentro la cartella www con questo contenuto.

<html>
  <body>
    <h1> doc-oneos's first page </h1>
  </body>
</html>

Per verificare l’effettivo funzionamento aprire il browser alla URL http://web1.oneos.it/~doc-oneos.

Note

Best Practice: un VirtualHost necessita di alcune cartelle aggiuntive oltre la www per operare in sicurezza, logs ed etc. Nella prima verranno scritti i logs e nella seconda i file che hanno bisogno di essere maggiormente protetti come i certificati e le password usate da htpasswd.

Accedere di nuovo come utente doc-oneos e creare le cartelle logs, etc e poi le cartelle certs e keys entrambe dentro etc.

Possiamo ora passare alla creazione del vero e proprio VirtuaHost.
Posizionarsi nella directory /etc/apache2/sites-avilable e creare il file docs.oneos.conf con questo contenuto.

<virtualhost *:80>
ServerAdmin federico.fiordoliva@inaf.it
        DocumentRoot /home/doc-oneos/www
        DirectoryIndex index.htm index.html home.php home.htm home.html index.php
        ServerName docs.oneos.it
        ServerAlias www.docs.oneos.it
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        CustomLog /home/doc-oneos/logs/doc_access_log.txt combined
        ErrorLog /home/doc-oneos/logs/doc_error_log.txt
                <Directory /home/doc-oneos/www/>
                        Options Includes FollowSymLinks
                        AllowOverride All
                </Directory>
</virtualhost>

Creato il file occorr abilitarlo, per questo utilizzeremo l’utility a2ensite.

root@web1:~# a2ensite docs.oneos.it

Possiamo far rileggere le configurazioni ad Apache sernza riavviare.

systemctl reload apache2

Per testare il VirtualHost accedere al sito dal browser, http://docs.oneos.it, oppure il suo alias http://www.docs.oneos.it come descritto nella direttiva ServerAlias del VirtualHost.

mod_ssl

Altra pratica fondamentale è configurare il modulo ssl per abilitare la cifratura della connessione attraverso i certificati rilasciati dalle CA, questa procedura configura il modulo solo per il VirtualHost in questione. Per ogni altro che decideremo di configurare, andranno inserite le direttive nel file del VirtualHost.

Una volta ottenuto il certificato dalla CA, possiamo prcedere all’attivazione del modulo.

Attention

Per vedere come richiedere un certificato valido andare alla sezione del manuale riferita ad Let’s Encrypt on pfSense.

Posizionare i due certificati nella directory etc/certs e la chiave privata nella directory etc/keys. Va decisa una nomenclatura univoca perchè alcune versioni di Apache vogliono i file scritti in un determinato modo. Creaimo i nostri 3 file dei certificati con questi nomi:

  • chiave privata: docs_oneos_it.key

  • certificato: docs_oneos_it.pem

  • fullchain: fullchain.pem

Accediamo come root e configuriamo il VirtualHost per rispondere alle richieste in modalità criptata.

Rendiamo più sicura la chiave privata impostando i permessi del file in questo modo:

root@web1:/home/doc-oneos/etc/keys$ chown root:root docs_oneos_it.key
root@web1:/home/doc-oneos/etc/keys$ chmod 400 docs_oneos_it.key

Editare il file docs.oneos.it.conf ed aggiungere le seguenti direttive.

<IfModule mod_ssl.c>
<VirtualHost *:443>
       ServerAdmin federico.fiordoliva@inaf.it
       DocumentRoot /home/doc-oneos/www
       DirectoryIndex index.htm index.html home.php home.htm home.html index.php
       ServerName www.doc.oa-roma.inaf.it
       ServerAlias doc.oa-roma.inaf.it
       LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
       CustomLog /home/doc-oneos/logs/doc_ssl_access_log.txt combined
       ErrorLog /home/doc-oneos/logs/doc_ssl_error_log.txt
               <Directory /home/doc-oneos/www/>
                       Options Includes FollowSymLinks
                       AllowOverride All
               </Directory>
 SSLEngine on
        SSLCertificateFile /home/doc-oneos/etc/certs/docs_oneos_it.pem
        SSLCertificateKeyFile /home/doc-oneos/etc/keys/docs_oneos_it.key
       SSLCertificateChainFile /home/doc-oneos/etc/certs/fullchain.pem
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                        SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                        SSLOptions +StdEnvVars
        </Directory>
        BrowserMatch "MSIE [2-6]" \
                        nokeepalive ssl-unclean-shutdown \
                        downgrade-1.0 force-response-1.0
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
       # HSTS (mod_headers is required) (15768000 seconds = 6 months)
        #Header always set Strict-Transport-Security "max-age=15768000"



</VirtualHost>
</IfModule>

Per testare aprire il browser alla pagina https://docs.oneos.it.

A questo punto il sito è raggiungibile in diversi modi:

ma anche

Forziamo il redirect su https, impostiamo la direttiva sottostante nel file del VirtualHost, tra i tag <virtualhost *.80> e </virtualhost>.

RedirectMatch permanent ^/(.*) https://docs.oneos.it/$1

Digitando sul browser http://docs.oneos.it verremo redirezionati automaticamente sulla connessione sicura https.

RHEL/EL/CentOS

Vediamo i passi da eseguire per le RHEL based.

Installazione

Per prima cosa installiamo i pacchetti necessari. Successivamente abiliteremo i moduli necessari e configureremo l’ambiente per ospitare i VirtualHost.

[root@web1 ~]# sudo dnf install httpd mod_ssl httpd-tools

Le distribuzioni RedHat based abilitano in modalità predefinita il modulo usermod e avendo installato il mod_ssl questo viene abilitato automaticamente.
Abilito apache al boot.

[root@web1 ~]# systemctl enable --now httpd

L’opzione --now avvia immediatamente il servizio.

Creare il file /etc/httpd/conf.d/000-default.conf con questo contenuto.

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    ServerName web1.oa-roma.inaf.it

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog /var/log/httpd/default-vhost.error.log
    CustomLog /var/log/httpd/default-vhost-access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

Aprire le porte 80 e 443 sul firewall che qui è abilitato.

[root@web1 ~]# firewall-cmd --permanent --add-service=httpd
[root@web1 ~]# firewall-cmd --permanent --add-service=httpds
[root@web1 ~]# firewall-cmd --reload

UserDir

Prima di creare il nostro primo VirtualHost occorre decidere come sarà fatto, abbiamo già detto che useremo il metodo del name-based, quello che faremo in più è utilizzare il modulo userdir per isolare a livello di permessi sul filesystem i diversi VirtualHost che saranno presenti sul server.

Quello che di solito viene fatto è posizionare i contentuti dei VirtualHost nella DocumentRoot di Apache che solitamente corrisponde alla cartella /var/www/html.
Questa pratica soffre di problemi di sicurezza in quanto è possibile, mischiare i contenuti dei VirtulHost semplicemente usando una URL malformata.
Non vedremo come fare perché esula da questo manuale, basta sapere che l’utilizzo di di questo modulo è altamente consigliato.

Il modulo Usermod abilita in modalità predefinita la cartella public_html nelle home dir degli utenti di sistema, questa pratica consente agli utenti di pubblicare il loro spazio web semplicemente indicando nella URL il loro nome utente; Es. http://web1.oneos.it/~federico.fiordoliva.
In questo modo i permessi dei file contenuti nello spazio web saranno escusivamente dell’utente che li ha generati.

Le best practice ci dicono di non dare a tutti gli utenti di sistema questa possibilità ma solo agli utenti che dovranno effettivamente pubblicare uno spazio web, nel nostro caso non saranno veri utenti ma utenti dedicati per il VirtualHost.

Editare il file /etc/httpd/cond.d/userdir.conf.

#
# UserDir: The name of the directory that is appended onto a user's home
# directory if a ~user request is received.
#
# The path to the end user account 'public_html' directory must be
# accessible to the webserver userid.  This usually means that ~userid
# must have permissions of 711, ~userid/public_html must have permissions
# of 755, and documents contained therein must be world-readable.
# Otherwise, the client will only receive a "403 Forbidden" message.
#
<IfModule mod_userdir.c>
    #
    # UserDir is disabled by default since it can confirm the presence
    # of a username on the system (depending on home directory
    # permissions).
    #
    UserDir www
    UserDir disabled root
    UserDir enabled doc-oneos

    #
    # To enable requests to /~user/ to serve the user's public_html
    # directory, remove the "UserDir disabled" line above, and uncomment
    # the following line instead:
    #
    #UserDir public_html
</IfModule>

#
# Control access to UserDir directories.  The following is an example
# for a site where these directories are restricted to read-only.
#
<Directory "/home/*/www">
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
</Directory>

In aquesto modo abbiamo detto ad usermod di non abilitare l’utente root e di farlo solo per doc-oneos e di utilizzare la cartella www.
Questa impostazione è da considerarsi a livello globale, ma possiamo sovrascrivere alcune cose dal file del VirtualHost.

A questo punto occorre creare l’utente doc-oneos.

[root@web1 ~]# firewall-cmd --permanent --add-service=httpd
[root@web1 ~]# firewall-cmd --permanent --add-service=httpds
[root@web1 ~]# firewall-cmd --reload
[root@web1 ~]# adduser doc-oneos
[root@web1 ~]# passwd doc-oneos
  Nuova password:
  Reimmettere la nuova password:
  passwd: tutti token di autenticazione sono stati aggiornati con successo.

Impostastare i permessi corretti alla home di oa-roma.

root@web1:~# chmod o+x /home/doc-oneos

Note

Best Practice: un VirtualHost necessita di alcune cartelle aggiuntive oltre la www per operare in sicurezza, logs ed etc. Nella prima verranno scritti i logs e nella seconda i file che hanno bisogno di essere maggiormente protetti come i certificati e le password usate da htpasswd.

Accedere al server come utente doc-oneos e creare la cartella www.
Creare le cartelle logs, etc e poi le cartelle certs e keys entrambe dentro etc. Successivamente creare un file index.html dentro la cartella www con questo contenuto.

<html>
 <body>
   <h1> doc-oneos's first page </h1>
 </body>
</html>

Selinux

Sui sistemi REHL based occorre fare i conti con Selinux che è abilitato in modalità predefinita.

Per utilizzare il modulo UserDir occorre abilitare i contesti corretti.

root@web1:~# sudo setsebool -P httpd_enable_homedirs true
root@web1:~# chcon -R -t httpd_sys_rw_content_t /home/doc-oneos/logs/
root@web1:~# chcon -R -t httpd_user_content_t /home/doc-oneos/www/
root@web1:~# chcon -R -t httpd_sys_content_t /home/doc-oneos/etc/

root@web1:~# ls -laZ /home/doc-oneos/
totale 16
 drwx------. 5 doc-oneos doc-oneos unconfined_u:object_r:user_home_dir_t:s0        117 22 ago 09.24 .
 drwxr-xr-x. 3 root       root       system_u:object_r:home_root_t:s0                 24 22 ago 09.04 ..
 -rw-------. 1 doc-oneos doc-oneos unconfined_u:object_r:user_home_t:s0            249 22 ago 09.54 .bash_history
 -rw-r--r--. 1 doc-oneos doc-oneos unconfined_u:object_r:user_home_t:s0             18  2 ago 09.41 .bash_logout
 -rw-r--r--. 1 doc-oneos doc-oneos unconfined_u:object_r:user_home_t:s0            141  2 ago 09.41 .bash_profile
 -rw-r--r--. 1 doc-oneos doc-oneos unconfined_u:object_r:user_home_t:s0            376  2 ago 09.41 .bashrc
 drwxrwxr-x. 4 doc-oneos doc-oneos unconfined_u:object_r:httpd_sys_content_t:s0     31 22 ago 09.24 etc
 drwxrwxr-x. 2 doc-oneos doc-oneos unconfined_u:object_r:httpd_sys_rw_content_t:s0  57 22 ago 09.56 logs
 drwxrwxr-x. 2 doc-oneos doc-oneos unconfined_u:object_r:httpd_user_content_t:s0    24 22 ago 09.29 www

Riavviare apache.

root@web1:~# systemctl restart httpd

Per verificare l’effettivo funzionamento aprire il browser alla URL http://web1.oneos.it/~doc-oneos.

Possiamo ora passare alla creazione del vero e proprio VirtuaHost.
Posizionarsi nella directory /etc/httpd/conf.d e creare il file docs.oneos.conf con questo contenuto.

<virtualhost *:80>
ServerAdmin federico.fiordoliva@oneos.it
        DocumentRoot /home/doc-oneos/www
        DirectoryIndex index.htm index.html home.php home.htm home.html index.php
        ServerName docs.oneos.it
        ServerAlias www.docs.oneos.it
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        CustomLog /home/doc-oneos/logs/doc_access_log.txt combined
        ErrorLog /home/doc-oneos/logs/doc_error_log.txt
                <Directory /home/doc-oneos/www/>
                        Options Includes FollowSymLinks
                        AllowOverride All
                </Directory>
</virtualhost>

Possiamo far rileggere le configurazioni ad Apache

root@web1:~# systemctl reload httpd

Per testare il VirtualHost accedere al sito dal browser, http://docs.oneos.it, oppure il suo alias www.docs.oneos.it.

mod_ssl

Altra pratica fondamentale è configurare il modulo ssl per abilitare la cifratura della connessione attraverso i certificati rilasciati dalle CA, questa procedura configura il modulo solo per il VirtualHost in questione. Per ogni altro che decideremo di configurare, andranno inserite le direttive nel file del VirtualHost.

Una volta ottenuto il certificato dalla CA, possiamo prcedere all’attivazione del modulo.

Attention

Per vedere come richiedere un certificato valido andare alla sezione del manuale riferita ad Let’s Encrypt on pfSense.

Posizionare i due certificati nella directory etc/certs e la chiave privata nella directory etc/keys. Va decisa una nomenclatura univoca perchè alcune versioni di Apache vogliono i file scritti in un determinato modo. Creaimo i nostri 3 file dei certificati con questi nomi:

  • chiave privata: docs_oneos_it.key

  • certificato: docs_oneos_it.pem

  • fullchain: fullchain.pem

Accediamo come root e configuriamo il VirtualHost per rispondere alle richieste in modalità criptata.

Rendiamo più sicura la chiave privata impostando i permessi del file in questo modo:

root@web1:/home/doc-oneos/etc/keys$ chown root:root docs_oneos_it.key
root@web1:/home/doc-oneos/etc/keys$ chmod 400 docs_oneos_it.key

Editare il file docs.oneos.it.conf ed aggiungere le seguenti direttive.

<IfModule mod_ssl.c>
<VirtualHost *:443>
       ServerAdmin federico.fiordoliva@oneos.it
       DocumentRoot /home/doc-oneos/www
       DirectoryIndex index.htm index.html home.php home.htm home.html index.php
       ServerName docs.oneos.it
       ServerAlias www.docs.oneos.it
       LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
       CustomLog /home/doc-oneos/logs/doc_ssl_access_log.txt combined
       ErrorLog /home/doc-oneos/logs/doc_ssl_error_log.txt
               <Directory /home/doc-oneos/www/>
                       Options Includes FollowSymLinks
                       AllowOverride All
               </Directory>
 SSLEngine on
        SSLCertificateFile /home/doc-oneos/etc/certs/docs_oneos_it.pem
        SSLCertificateKeyFile /home/doc-oneos/etc/keys/docs_oneos_it.key
       SSLCertificateChainFile /home/doc-oneos/etc/certs/fullchain.pem
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                        SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                        SSLOptions +StdEnvVars
        </Directory>
        BrowserMatch "MSIE [2-6]" \
                        nokeepalive ssl-unclean-shutdown \
                        downgrade-1.0 force-response-1.0
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
       # HSTS (mod_headers is required) (15768000 seconds = 6 months)
        #Header always set Strict-Transport-Security "max-age=15768000"



</VirtualHost>
</IfModule>

Per testare aprire il browser alla pagina https://docs.oneos.it.

A questo punto il sito è raggiungibile in diversi modi:

ma anche

Forziamo il redirect su https, impostiamo la direttiva sottostante nel file del VirtualHost, tra i tag <virtualhost *.80> e </virtualhost>.

RedirectMatch permanent ^/(.*) https://docs.oneos.it/$1

Digitando sul browser http://docs.oneos.it verremo redirezionati automaticamente sulla connessione sicura https.

Apache Hardening

Vedremo come diminuire la superficie di attacco da parte di malintenzionati sul nostro server web Apache. Ci sono dei piccoli accorgimenti che possiamo prendere per evitare di dare informazioni utili agli attacanti semplicemente abilitando o disabilitando delle direttive.

Ubuntu 20.04/22.04

Vediamo cosa fare per le Ubuntu based.

Server Info - mod_info

Non attivo per modalità predefinita.

Server Status - mod_status

Disabilitare questo modulo che consente di visionare in tempo reale lo stato di Apache e le performance. Questo potrebbe dare infomazioni preziose all’attaccante.

Per disabilitare il modulo usare questo comando.

root@web1:/etc/apache2# a2dismod status
Module status disabled.
To activate the new configuration, you need to run:
systemctl restart apache2

Riavviare il servizio.

Server Signature

Altre informazioni preziose da nascondere sono date dalle direttive: ServerSignature e ServerTokens. Entrambe vanno rese configurate per non dare informazioni.

Editare il file /etc/apache2/apache2.conf e aggiungere queste due rige alla fine del file.

ServerSignature Off
ServerTokens Prod

File .htaccess

Questo file è molto utile se stiamo dando un servizio di hosting a terzi, perchè consente sovrascrivere alcune direttive a chi gestisce i contenuti del VirtualHost.

Nel nostro caso conviene disabilitarlo a livello globale e poi abilitarlo nel VirtualHost dove serve.

Fortunatamente Ubuntu non abilita questa direttiva in modalità predefinita.

HTTP request metod

Tipicamente in una web app abbiamo bisogno solo dei metodi HTTP GET POST HEAD, tutti gli altri possono essere disabilitati se non espressamente utilizzati.

Editare il file /etc/apache2/apache2.conf ed inserire questa direttiva come da esempio.

<Directory />
  AllowOverride none
  Require all denied
  <LimitExcept GET POST HEAD>
    deny from all
  </LimitExcept>
</Directory>

In qeusto modo è disabilitato globalmente è sempre possibile sovrascrivere nella configurazione del VirtualHost.

X-XSS Protection

Possiamo utilizzare una direttiva per dire ai browser di non accettare le URL che possono essere usate per generare un attacco Cross Site Scripting (XSS).

Editare il file /etc/apache2/apache2.conf ed inserire questa direttiva alla fine del file.

Header set X-XSS-Protection "1; mode=block"

RHEL/EL/CentOS

Vediamo cosa fare per le RHEL based.

Server Info - mod_info

Disabilitare questo modulo che consente, puntando una speficia directory, di ottenere infomazioni sulla configurazione attuale. Per disabilitare il modulo editare il file /etc/httpd/conf.module.d/00-base.conf e commentare la riga relativa.

#LoadModule info_module modules/mod_info.so

Riavviare il servizio.

Server Status - mod_status

Disabilitare questo modulo che consente di visionare in tempo reale lo stato di Apache e le performance. Questo potrebbe dare infomazioni preziose all’attaccante.

Per disabilitare il modulo editare il file /etc/httpd/conf.module.d/00-base.conf e commentare la riga relativa.

#LoadModule status_module modules/mod_status.so

Riavviare il servizio.

Server Signature

Altre informazioni preziose da nascondere sono date dalle direttive: ServerSignature e ServerTokens. Entrambe vanno rese configurate per non dare informazioni.

Editare il file /etc/httpd/conf/httpd.conf e aggiungere queste due rige alla fine del file.

ServerSignature Off
ServerTokens Prod

Il primo elimina la riga di testo in fondo alle pagine di errore che identifica la versione di Apache e di OpenSSL.

Il secondo elimina le stesse infomazioni ma dall’ header http. Riavviare il servizio.

File .htaccess

Questo file è molto utile se stiamo dando un servizio di hosting a terzi, perchè consente sovrascrivere alcune direttive a chi gestisce i contenuti del VirtualHost.

Nel nostro caso consivene disabilitarlo a livello globale e poi abilitarlo nel VirtualHost dove serve.

Editare il file /etc/httpd/conf/httpd.conf ed inserire questa direttiva.

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

Per abilitarlo a livello VirtualHost utilizzare la direttiva così come nell’esempio.

HTTP request metod

Tipicamente in una web app abbiamo bisogno solo dei metodi HTTP GET POST HEAD, tutti gli altri possono essere disabilitati se non espressamente utilizzati.

Editare il file /etc/httpd/conf/httpd.conf ed inserire questa direttiva come da esempio.

<Directory />
  AllowOverride none
  Require all denied
  <LimitExcept GET POST HEAD>
    deny from all
  </LimitExcept>
</Directory>

In qeusto modo è disabilitato globalmente è sempre possibile sovrascrivere nella configurazione del VirtualHost.

X-XSS Protection

Possiamo utilizzare una direttiva per dire ai browser di non accettare le URL che possono essere usate per generare un attacco Cross Site Scripting (XSS).

Editare il file /etc/httpd/conf/httpd.conf ed inserire questa direttiva alla fine del file.

Header set X-XSS-Protection "1; mode=block"