Serveur/LAMP

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 :

SSL_ERROR_BAD_CERT_DOMAIN

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 :

firefoxcertifsecur

En revanche, si nous avons signé notre certificat via notre propre autorité de certification, nous obtiendrons :
crl certificat revocation list
firefoxcertifnonsecur

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.
firefoxdmdcertifutilisateur

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 OS
ServerTokens 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 On
ServerSignature 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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *