Installation
sudo apt-get install apache2 php mysql-server libapache2-mod-php php-mysql
Durant l’installation, un mot de passe sera demandé pour mysql.
Configuration
Activation du https via TLS
#Activation du module ssl sudo a2enmod ssl #Activation du virtual host https sudo a2ensite default-ssl.conf #Redémarrage du service apache2 sudo service apache2 restart
C’est bien fonctionnel. En revanche le certificat utilisé sera celui généré à l’installation.
Il est donc préférable de le remplacer et d’en générer un avec plus d’information voire d’utiliser un certificat signé par une autorité.
Création de certificats
Processus de génération des certificats
Nota : lors de la génération du certificat serveur, il faut veiller à bien renseigner le champ Common Name et qu’il corresponde parfaitement au nom de domaine, sinon dans votre navigateur vous obtiendrez une erreur comme ci-dessous :
Une fois le certificat et la clef du serveur générés, il faut les transférer sur ce dernier.
#Si le port ssh a été modifié il faudra donc ajouter le port à utiliser "scp -P 30 {...}" scp ./server.* username@serveur:/home/username/
Il faut ensuite les placer dans les bons répertoires.
#Pour le certificat sudo mv ~/server.cer /etc/ssl/certs/ sudo chmod 644 /etc/ssl/certs/server.cer sudo chown root:root /etc/ssl/certs/server.cer #Pour la clef privée sudo mv ~/server.key /etc/ssl/private/ sudo chmod 640 /etc/ssl/private/server.key sudo chown root:ssl-cert /etc/ssl/private/server.key
On peut faire un peu de ménage et supprimer l’ancien certificat et la clef privée.
Il faut maintenant éditer le fichier de notre virtual host et faire pointer vers nos deux nouveaux fichiers.
#Les deux lignes à modifier SSLCertificateFile /etc/ssl/certs/server.cer SSLCertificateKeyFile /etc/ssl/private/server.key
Nous relançons le serveur apache2 afin d’appliquer ces changements.
Si nous allons sur la page en question, le certificat sera utilisé et si vous l’avez fait signer par une autorité de certification, le résultat sera le suivant :
En revanche, si nous avons signé notre certificat via notre propre autorité de certification, nous obtiendrons :
crl certificat revocation list
Car notre autorité de certification n’est pas connue des navigateurs et il y a peu de chance qu’elle le soit un jour.
Il faut donc sur les postes clients, ajouter le certificat de notre autorité au navigateur(s).
Pour Firefox, c’est dans « préférences », puis « Avancé », « Certificats », « Afficher les certificats », « Autorités », « Importer » il faut utiliser le fichier ca.cert.
Une fois ajouté, tous les certificats que nous signerons avec notre autorité de certification seront reconnus par le navigateur.
Sécurisation
Rediriger vers https
Il existe trois principales méthodes pour effectuer une redirection de http vers https :
- via virtual host,
- via htaccess,
- via l’applicatif web
Pour le faire via les fichiers .htaccess, voici les directives à ajouter au fichier (je n’ai pas testé).
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
La méthode qui est plus pro est via les virtual hosts.
Une façon de faire serait d’avoir tous ses virtual hosts en https et en faire un générique qui écoute sur le port 80 afin de faire les réécritures d’URL.
Voici un exemple de VirtualHost pour du https
<IfModule mod_ssl.c> <VirtualHost serveur.com:443> ServerAdmin webmaster@serveur.com ServerName www.serveur.com DocumentRoot /var/www/html_files # Available loglevels: trace8, ..., trace1, debug, info, notice, warn, # error, crit, alert, emerg. LogLevel info ssl:error ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # SSL Engine Switch: SSLEngine on #Permet de désactiver des protocoles obsolètes SSLProtocol All -SSLv2 -SSLv3 # SSLCertificateFile directive is needed. SSLCertificateFile /etc/ssl/certs/mon_site_securise.cer SSLCertificateKeyFile /etc/ssl/private/mon_site_securise.key #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> </VirtualHost> </IfModule>
<VirtualHost *:80> {...} <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [L,R] </IfModule> {...} </VirtualHost>
Mais il faut pour que cela fonctionne activer le module de réécriture des URL
#Activation du module sudo a2enmod rewrite #Redémarrage du serveur apache sudo service apache2 restart
Ainsi tous les accès seront redirigés sur le port 443 soit https.
Il est aussi possible de la faire sans réécriture d’URL mais juste en redirigeant.
<VirtualHost www.serveur.com:80> ServerAdmin webmaster@serveur.com ServerName www.serveur.com Redirect 301 / https://www.serveur.com </VirtualHost>
Utilisation d’un certificat utilisateur pour accéder à un virtual host
Afin d’utiliser le certificat utilisateur importé dans le navigateur pour réaliser l’authentification, voici les quelques manipulations à effectuer.
#Copier le certificat de notre autorité de certification sur le serveur scp ./ca.cer username@server:/home/username/
Il faut ensuite le placer dans le répertoire des certificats des autorités.
sudo mv ~/ca.cer /etc/ssl/certs/ sudo chmod 644 /etc/ssl/certs/ca.cer sudo chown root:root /etc/ssl/certs/ca.cer
Il en reste plus qu’à éditer le virtual host concerné et d’ajouter ces quelques lignes.
SSLVerifyClient require SSLVerifyDepth 10 SSLCACertificateFile /etc/ssl/certs/ca.cer SSLOptions +StdEnvVars
Puis de relancer Apache.
Maintenant lorsque vous consulterez le site concerné, le navigateur vous demandera de sélectionner le certificat utilisateur à utiliser pour l’authentification.
Une fois le choix effectué, si le certificat est correct, l’accès vous sera donné au virtual host et le site pourra avoir accès aux données de ce dernier pour vous authentifier sur l’application.
Restreindre les informations divulguées par Apache
/etc/apache2/conf-available/security.conf
Il faut remplacer les deux directives suivantes (ce qui est barré par ce qui suit) :
# ServerTokens # This directive configures what you return as the Server HTTP response # Header. The default is 'Full' which sends information about the OS-Type # and compiled in modules. # Set to one of: Full | OS | Minimal | Minor | Major | Prod # where Full conveys the most information, and Prod the least. #ServerTokens Minimal #ServerTokens Full#ServerTokens OSServerTokens Prod # Optionally add a line containing the server version and virtual host # name to server-generated pages (internal error documents, FTP directory # listings, mod_status and mod_info output etc., but not CGI generated # documents or custom error documents). # Set to "EMail" to also include a mailto: link to the ServerAdmin. # Set to one of: On | Off | EMail#ServerSignature OnServerSignature Off
De cette façon, les informations relatives à la distribution et au serveur web ne seront plus divulguées.
Tests de charge sur Apache2
Un paquet permet de réaliser des tests de charge sur le serveur Apache2 : slowhttptest.
#Installation sudo apt-get install slowhttptest #Usage pour l'exemple slowhttptest -c 200 -r 10 -i 50 -l 100 -g -u http://serveur.com
Les paramètres sont :
- -c : nombre de connexions
- -r : connexions/sec
- -l : durée du test
- -g : générer un rapport
- -i : intervalle
La documentation officielle est sur Git shekyan/slowhttptest
MYSQL
La commande suivante permet d’apporter plus de sécurité à MYSQL.
sudo mysql_secure_installation
Les modules
Module Apache status
Il existe un module Apache qui permet de visualiser en direct les statistiques du serveur. Il s’agit de mod_status.
Pour l’activer si ce n’est pas déjà le cas.
sudo a2enmod status
Il faut ensuite l’ajouter dans un virtual host. Ici 000-default.conf
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined <Location "/etat-serveur"> #Complément de l'URL de la page SetHandler server-status #Module utilisé Order deny,allow #Ordre d'application des règles d'accès Deny from all #Refus pour tout le monde Allow from xx.xx.xx.xx #Accès pour l'adresse IP </Location> </VirtualHost>
L’accès ce fait ensuite via le navigateur http://serveur/etat-serveur
Il est aussi possible de passer en GET un intervalle de rechargement de la page : ?refresh=5
Sources :
Doc Ubuntu – SSL
Arscenic – Redirection http vers https automatiquement
Quennec – Redirection http vers https automatiquement
apache.org – ssl accesscontrol
Florian Bogeycacher – Cacher la version d’Apache
Florian Bogeycacher – Activer et configurer Mod_status
Module Apache mod_status