====================== 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"