10.3. Déploiement

10.3.1. HTTPS

10.3.1.1. Configuration

Pour mettre en place le chiffrement pour Apache, on devra tout d'abord lui indiquer d'écouter sur le port 443 en complétant le fichier /etc/apache2/ports.conf :

Listen 443

On devra ensuite modifier les fichiers de configuration de virtualhosts dans /etc/apache2/sites-available/ afin de preciser à quel port s'appliquent ces virtualhost :

NameVirtualHost *:80
NameVirtualHost *:443

<VirtualHost *:80>
...

on remplace la « * » par « *:80 » et on ajoute un entrée pour le port 443. Cela permet d'indiquer à Apache qu'il y aura des virtualhosts sur ces deux ports.

chaque virtualhost devra dorénavant être accompagné du port auquel il est rattaché.

Si un site doit être accessible en HTTP et HTTPS, il faudra créér deux entrées <VirtualHost>.


NameVirtualHost *:443

<VirtualHost *:80>
        ServerAdmin alice@exemple.org
 ...
        ServerSignature Off
</VirtualHost>

<VirtualHost *:443>
        ServerAdmin alice@exemple.org
        ServerName alice.exemple.org
        DocumentRoot /home/alice/monsiteouebe/

        SSLEngine on
        SSLCertificateFile /etc/ssl/certs/serveur.pem
        SSLCertificateKeyFile /etc/ssl/private/serveur.key
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
        </Directory>

        ErrorLog /home/alice/meslogs/error_ssl.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel info

        CustomLog /home/alice/meslogs/access_ssl.log combined
        ServerSignature Off
</VirtualHost>

On devra ensuite activer le module SSL avec a2enmod (voir Section 4.2.2, « Modules »), avant de redémarrer Apache.

root@ubuntu:~# a2enmod ssl
Module ssl installed; run /etc/init.d/apache2 force-reload to enable.
root@ubuntu:~#  /etc/init.d/apache2 force-reload 
 * Forcing reload of web server (apache2)...                              [ OK ] 
root@ubuntu:~# 

10.3.1.2. Redirection SSL

Si l'on désire force l'utilisation de SSL, on pourra utiliser les règles suivantes dans la configuration Apache. On devra auparavant activer mod_rewrite avec a2enmod (Section 4.2.2, « Modules »).

#
# Force SSL
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

10.3.1.3. Filtrage

Coté serveur, on devra, pour finir, autoriser l'accès extérieur au port 443.

Exemple 10.1. Apache HTTPS: configuration du filtrage TCP en entrée

#
# ######################################
# TCP entrant
# Il faudra ouvrir des ports au fil de l'eau
# lors de la mise en place de 
# services TCP (ssh, apache, ...).
# ######################################
#
-A TCP_IN -j TCP_INLIMITS
-A TCP_IN -j STATEFUL
-A TCP_IN -j TCP_SYNLIMITS
-A TCP_IN -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m limit --limit 10/min -j LOG --log-prefix "TCP_IN:" --log-level 6 
-A TCP_IN -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -j DROP
# Ajouter les rêgles ici lors de l'installation de services TCP si ces services
# doivent être ouverts
#
-A TCP_IN -p tcp -m tcp --dport 80 -j ACCEPT
# Ouverture du port HTTPS
-A TCP_IN -s adresse_ip_autorisée -p tcp -m tcp --dport 443 -j ACCEPT ❶
# on peut aussi débloquer le port 80 pour tout le monde
-A TCP_IN -p tcp -m tcp --dport 443 -j ACCEPT ❷
#

Régle autorisant l'accès au port 443/tcp (https) pour l'adresse adresse_ip_autorisée (qui peut aussi être un subnet). Cette règle peut être répétée autant de fois que nécessaire.

Régle autorisant l'accès au port 443/tcp (https) pour tout le monde.


Un test avec un navigateur permet de tester le fonctionnement du serveur en mode HTTPS. Comme prévu, Firefox se plaint du certificat et nous explique que l'autorité de certification est inconnue.

Figure 10.1. Test HTTPS

Test HTTPS


10.3.2. FTP/TLS

ProFTPd permet aux clients de négocier une session SSL/TLS, chiffrant ainsi les connexion de contrôle et de transfert. Ce serveur, à l'instar d'Apache, utilise un système de modules permettant d'ajouter des fonctionnalités. On pourra faite varier les paramètres en fonction des besoins. Ceux utilisés ci-dessous suffisent pour établir un chiffrement entre le client et le serveur.

<IfModule mod_tls.c>
  TLSEngine on
  TLSLog /var/log/proftpd/tls.log

  # TLS est-il obligatoire ?
  TLSRequired off

  # Certificats serveur
  TLSRSACertificateFile    /etc/ssl/certs/serveur.pem
  TLSRSACertificateKeyFile /etc/ssl/private/serveur.key

  # Authentifier les clients utilisant TLS ?
  TLSVerifyClient off

  # Autorise les renégotiations SSL/TLS sans les forcer.
  # Cerains clients ne supportent pas les renégociations et 
  # ferment la connexion data.
  TLSRenegotiate required off
</IfModule>

Il y a malheureusement un petit accroc au tableau. Comme expliqué dans le chapitre consacré à ProFTPD (Section 7.3, « Filtrage »), le protocole FTP fonctionne selon deux modes, actif et passif. Lorsque les communications circulent en clair, aucun problème point de vue filtrage : le module nf_conntrack_ftp scrute la connexion de contrôle et autorise les connexions nécessaires pour le fonctionnement du protocole dans les deux modes.

En revanche, lorsque les communications sont chiffrées ce module n'a aucun moyen de connaitre le numéro de port négocié dans l'application puisqu'elle est chiffrée. Pour le mode actif, on peut résoudre le problème : le port source de la connexion data établie par le serveur vers le client sera 20, et on pourra donc explicitement laisser sortir les connexions ayant ce port source dans notre chaîne TCP_OUT. Mais en mode passif, le serveur va ouvrir un port > 1023 (négocié dynamiquement dans le protocole applicatif FTP) auquel le client tentera de se connecter. Netfilter n'ayant pas la possibilité d'accepter cette connexion entrante comme étant « RELATED », les paquets en provenance du client seront rejetés.

En résumé, on ne pourra faire, en SSL/TLS que des connexions FTP en mode actif. Pour cela, on devra donc autoriser le serveur FTP à se connecter au client dans la chaîne contenant les règles régissant le traffic sortant. On pourra bien sûr là aussi restreindre la liste des adresses avec lesquelles on veut faire du FTP.

#
# ######################################
# TCP sortant
# Cette machine initie des connexions HTTP vers fr.archive.ubuntu.com
# et security.ubuntu.com pour les mises à jour
# ######################################
#
-A TCP_OUT -j STATEFUL
-A TCP_OUT -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -m limit --limit 10/min -j LOG --log-prefix "TCP_OUT:" --log-level 6 
-A TCP_OUT -p tcp -m tcp ! --tcp-flags SYN,RST,ACK SYN -j DROP
#
# Règle pour le ftp actif
#
-A TCP_OUT -p -d adresse_ip_autorisée --sport 20 --dport 1024: -j ACCEPT ❶
# on peut aussi débloquer le ftp actif pour tout le monde
-A TCP_OUT -p --sport 20 --dport 1024: -j ACCEPT ❷
#

Régle autorisant l'établissement de connexion du port 20/tcp (ftp-data) depuis le serveur vers l'adresse adresse_ip_autorisée (qui peut aussi être un subnet). Cette règle peut être répétée autant de fois que nécessaire.

Régle autorisant l'établissement de connexion du port 20/tcp (ftp-data) depuis le serveur vers tout le monde.

10.3.3. MySQL/SSL

Contrairement aux services précédents, MySQL veut systématiquement vérifier le certificat du serveur et s'assurer qu'il a bien été signé par une autorité de certification connue. Il faudra donc que le client possède le certificat de l'autorité de certification ayant signé le certificat serveur. La configuration coté serveur consiste en deux lignes ajoutées dans la section [mysqld] du fichier /etc/mysql/my.cnf.

ssl-cert=/etc/ssl/certs/cert_serveur.pem
ssl-key=/etc/ssl/private/key_serveur.pem

Coté client, on emploiera l'option --ssl-ca pour demande l'utilisation de SSL tout en indiquant le fichier certificat du CA ayant signé le certificat du serveur. On peut aussi employer --ssl-capath pour indiquer l'emplacement d'un répertoire contenant plusieurs certificats CA. Sous mysql, la requète SHOW VARIABLES LIKE 'have_openssl'; permet de savoir si l'on utilise une connexion SSL et SHOW STATUS LIKE 'Ssl_cipher'; donne la chaîne de chiffrement en cours d'utilisation.

alice@linus:~$ mysql -u dbadmin -h serveur --ssl-ca=/tmp/cacert.pem 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.0.38-Ubuntu_0ubuntu1-log Ubuntu 7.04 distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SHOW VARIABLES LIKE 'have_openssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl  | YES   | 
+---------------+-------+
1 row in set (0.00 sec)

mysql> 

L'interêt du chiffrement est évidemment lié à l'accès que l'on désire offrir au serveur : s'il n'est bindé que sur 127.0.0.1 ou que skip-networking est activé, les connexions ne seront que locales et le chiffrement n'a que peu d'intérêt. Comme pour FTP/TLS, le port TCP ne change pas et le chiffrement est négocié au sein de la connexion habituelle. Il n'y a donc pas de modification à effectuer en ce qui concerne le filtrage.

10.3.4. SMTP/TLS

Afin de permettre à Postfix d'utiliser TLS pour sécuriser ses échanges SMTP, nous devrons lui fournir au minimum un certificat et une clef serveur. Le chemin de ces élements est à mettre respectivement dans smtpd_tls_cert_file et smtpd_tls_key_file.

root@ubuntu:~# postconf -e smtpd_tls_cert_file=/etc/ssl/certs/cert_serveur.pem 
root@ubuntu:~# postconf -e smtpd_tls_key_file=/etc/ssl/private/key_serveur.pem
root@ubuntu:~# invoke-rc.d postfix restart
 * Stopping Postfix Mail Transport Agent postfix                                                                                                                                       [ OK ] 
 * Starting Postfix Mail Transport Agent postfix                                                                                                                                       [ OK ] 
root@ubuntu:~# 

Postfix permet d'ajuster beaucoup d'autres paramètres pour TLS, mais la plupart des valeurs quedétaillées dans postconf(5).