Juin 11 2007
Encryption du trafic Mysql avec OpenSSL
Freeradius obéit aux caractéristiques du protocole Radius, permettant d’effectuer des actions diverses, notamment l’authentification d’utilisateurs. De nombreuses cavités ont été décelées, non pas sur le software mais sur le protocole lui-même. Joshua Hill du laboratoire Infogard a réalisé une très bonne analyse disponible sur le net à l’adresse http://www.untruth.org/~josh/security/radius/. Le document fait surtout référence aux attaques possibles lors de l’envoi du login et mot de passe pendant l’authentification.
Nous ne nous intéresserons pas aux failles du protocole Radius, mais à celles liées à son utilisation avec un système de bases de données. L’accès à la base Radius doit être bien sûr sécurisé, mais le transport des données depuis le serveur Freeradius aussi. Ceci est d’autant plus vrai lorsque les deux serveurs sont distants, ce qui peut être le cas sur des réseaux de grandes tailles. C’est dans ce cadre que nous proposons de crypter le trafic Mysql à l’aide d’OpenSSL.
Installation d’OpenSSL
OpenSSL est téléchargeable depuis le site officiel. Ce test a été effectué avec la dernière version stable disponible à ce jour, la 0.9.8e. Il peut être installé de la façon suivante:
./config –prefix=/usr/local/openssl shared zlib
make
make test
make install
« zlib » permet d’activer le support pour la compression/décompression et « shared » pour les librairies partagées. Il est à noter que la compilation de Mysql échouera sur une plateforme Linux sans l’option « shared ».
Il faut ensuite inclure les nouvelles librairies dans le path. Ajoutez le chemin /usr/local/openssl/lib (ou celui sous lequel vous avez installé OpenSSL) dans le fichier /etc/ld.so.conf sous Linux. Exécutez la commande ldconfig pour rendre le chemin actif.
Activation d’OpenSSL sur le serveur
Les binaires Mysql sont fournis avec YaSSL en général, en remplacement à OpenSSL limité de par sa lisense. La (re)compilation est donc nécessaire:
./configure –enable-openssl=/usr/local/openssl
make
make install
Pour vérifier que le serveur Mysql supporte SSL après démarrage du service, il faut examiner la valeur de la variable système have_openssl comme ceci:
mysql> SHOW VARIABLES LIKE 'have_openssl'; +---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | +---------------+----------+
Si la valeur est égale à « DISABLED », le serveur supporte les connexions SSL mais n’a pas été démarré avec les options appropriées. Il faut donc créer les clés et certificats nécessaires au cryptage.
cd /usr/local/mysql
mkdir openssl && cd openssl
mkdir certs && cd certs
Création du certificat CA
openssl genrsa -out ca-key.pem 2048
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem
Répondez aux questions par les valeurs adéquates.
Ces commandes openssl génèrent une clé de 2048 bits et un certificat valable pour une durée de 1000 jours.
Création du certificat du serveur
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out server-req.pem
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Création du certificat du client
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out client-req.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Les données relatives aux certificats doivent être passées en paramètre lors du lancement du service. Elles peuvent aussi être spécifiées dans le fichier de configuration Mysql /etc/my.cnf dans la section [mysqld].
ssl-ca=/usr/local/mysql/openssl/certs/cacert.pem
ssl-cert=/usr/local/mysql/openssl/certs/server-cert.pem
ssl-key=/usr/local/mysql/openssl/certs/server-key.pem
Après redémarrage du service, l’encryption SSL doit être disponible:
mysql> SHOW VARIABLES LIKE 'have_openssl'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | have_openssl | YES | +---------------+-------+
Dès lors, le serveur accepte les connexions sécurisées. Il est toujours possible de se connecter en mode « clair » puisque le choix se fait indépendemment pour chaque connexion. Il est possible de forcer un utilisateur donné à se connecter seulement en mode sécurisé. Cette option réside dans les paramètres de cet utilisateur et peut être changée avec la commande GRANT.
Activation d’OpenSSL sur le client
Pour se connecter au serveur en encryptant les données, plusieurs méthodes sont possibles. Les certificats sont soit donnés en option au lancement du client Mysql, soit ils résident dans un fichier de configuration /etc/my.cnf (ou autre car on peut modifier le fichier par défaut comme ceci: mysql –defaults-file=my.cnf). En conséquence, ajoutez ces lignes dans la section [client] du fichier:
ssl-ca=/usr/local/mysql/openssl/certs/cacert.pem
ssl-cert=/usr/local/mysql/openssl/certs/client-cert.pem
ssl-key=/usr/local/mysql/openssl/certs/client-key.pem
Après s’être connecté, il est possible d’afficher le cipher utilisé pour encrypter le trafic:
SHOW STATUS LIKE 'Ssl_cipher'; +---------------+--------------------+ | Variable_name | Value | +---------------+--------------------+ | Ssl_cipher | DHE-RSA-AES256-SHA | +---------------+--------------------+
Dans le cas où Freeradius est le client, le nombre de connexions SSL devrait augmenter du nombre de celles-ci créées dans le pool, comme défini dans le fichier sql.conf.
show status like 'Ssl_accepts'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Ssl_accepts | 52 | +---------------+-------+
Impact sur les performances
L’encryption des données a forcément un impact sur les performance car l’opération est gourmande en ressources CPU et réseau. Voici une visualisation graphique du nombre de transactions traitées par seconde avec et sans cryptage
Ces tests ont été réalisés avec une machine sur laquelle sont exécutés les services Radius et Mysql. Ils permettent néanmoins d’avoir une bonne appréciation de l’impact du cryptage sur les performances qui est de l’ordre de 30%.