======================
Apache Virtualhosts
======================
.. meta::
:description: Apache virtualhost
:keywords: apache, networking, security, network, load balancing, ha proxy, haproxy, web, site, images, content
:robots: noindex,nofollow
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 :abbr:`FQDN(Fully Qualified Domanin NAme)` for host name and for virtualhosts. |br|
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 :abbr:`FQDN(Fully Qualified Domanin NAme)`.
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``.
.. highlight:: bash
::
sudo apt install apache2 apache2-utils php libapache2-mod-php
Abilitiamo alcuni moduli utili ed impostiamo ``apache`` per avviarsi al boot del ``SO``.
.. highlight:: bash
::
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.
.. highlight:: Apache
::
root@web1:/etc/apache2/sites-available# cat 000-default.conf
# 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
# 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. |br|
A questa ``URL`` deve comparire la pagina predifinita di ``Apache``.
.. highlight:: bash
::
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``. |br|
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``. |br|
Questa pratica soffre di problemi di sicurezza in quanto è possibile, mischiare
i contenuti dei ``VirtulHost`` semplicemente usando una ``URL`` malformata. |br|
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. |br|
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.
.. highlight:: apache
::
UserDir www
UserDir disabled root
UserDir enabled doc-oneos
AllowOverride FileInfo AuthConfig Limit Indexes
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
# 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``.
.. highlight:: apache
::
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``.
.. highlight:: bash
::
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.
.. highlight:: html
::
doc-oneos's first page
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``. |br|
Posizionarsi nella directory ``/etc/apache2/sites-avilable`` e creare il file
``docs.oneos.conf`` con questo contenuto.
.. highlight:: apache
::
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
Options Includes FollowSymLinks
AllowOverride All
Creato il file occorr abilitarlo, per questo utilizzeremo l'utility ``a2ensite``.
.. highlight:: bash
::
root@web1:~# a2ensite docs.oneos.it
Possiamo far rileggere le configurazioni ad ``Apache`` sernza riavviare.
.. highlight:: bash
::
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 :doc:`letsencrypt`.
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:
.. highlight:: bash
::
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.
.. highlight:: apache
::
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
Options Includes FollowSymLinks
AllowOverride All
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
SSLOptions +StdEnvVars
SSLOptions +StdEnvVars
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"
Per testare aprire il browser alla pagina https://docs.oneos.it.
A questo punto il sito è raggiungibile in diversi modi:
- http://docs.oneos.it
- http://www.docs.oneos.it
ma anche
- https://docs.oneos.it/
- https://www.docs.oneos.it/
Forziamo il redirect su ``https``, impostiamo la direttiva sottostante nel file del ``VirtualHost``,
tra i tag ```` e ````.
.. highlight:: apache
::
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``.
.. highlight:: bash
::
[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. |br|
Abilito **apache** al boot.
.. highlight:: bash
::
[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.
.. highlight:: apache
::
# 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
Aprire le porte ``80`` e ``443`` sul firewall che qui è abilitato.
.. highlight:: bash
::
[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``. |br|
Questa pratica soffre di problemi di sicurezza in quanto è possibile, mischiare
i contenuti dei ``VirtulHost`` semplicemente usando una ``URL`` malformata. |br|
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. |br|
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``.
.. highlight:: apache
::
#
# 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.
#
#
# 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
#
# Control access to UserDir directories. The following is an example
# for a site where these directories are restricted to read-only.
#
AllowOverride FileInfo AuthConfig Limit Indexes
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
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``. |br|
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``.
.. highlight:: bash
::
[root@web1 ~]# firewall-cmd --permanent --add-service=httpd
[root@web1 ~]# firewall-cmd --permanent --add-service=httpds
[root@web1 ~]# firewall-cmd --reload
.. highlight:: bash
::
[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``.
.. highlight:: bash
::
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``. |br|
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.
.. highlight:: html
::
doc-oneos's first page
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.
.. highlight:: bash
::
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.
.. highlight:: bash
::
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``. |br|
Posizionarsi nella directory ``/etc/httpd/conf.d`` e creare il file
``docs.oneos.conf`` con questo contenuto.
.. highlight:: apache
::
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
Options Includes FollowSymLinks
AllowOverride All
Possiamo far rileggere le configurazioni ad ``Apache``
.. highlight:: bash
::
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 :doc:`letsencrypt`.
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:
.. highlight:: bash
::
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.
.. highlight:: apache
::
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
Options Includes FollowSymLinks
AllowOverride All
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
SSLOptions +StdEnvVars
SSLOptions +StdEnvVars
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"
Per testare aprire il browser alla pagina https://docs.oneos.it.
A questo punto il sito è raggiungibile in diversi modi:
- http://docs.oneos.it
- http://www.docs.oneos.it
ma anche
- https://docs.oneos.it/
- https://wwww.docs.oneos.it/
Forziamo il redirect su ``https``, impostiamo la direttiva sottostante nel file del ``VirtualHost``,
tra i tag ```` e ````.
.. highlight:: apache
::
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.
.. highlight:: bash
::
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.
.. highlight:: apache
::
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.
.. highlight:: apache
::
AllowOverride none
Require all denied
deny from all
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.
.. highlight:: apache
::
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.
.. highlight:: apache
::
#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.
.. highlight:: apache
::
#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.
.. highlight:: apache
::
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.
.. highlight:: apache
::
AllowOverride none
Require all denied
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.
.. highlight:: apache
::
AllowOverride none
Require all denied
deny from all
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.
.. highlight:: apache
::
Header set X-XSS-Protection "1; mode=block"