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:~#
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]
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 ❷ #
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.
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. |
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.
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).