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"