Introduction
Modifier le port de SQL Server installé dans une zone WAN/DMZ n’est pas suffisant d’un point de vue sécurité, cela diminue les attaques potentielles mais n’empêche pas des outils de "snif" de lire les paquets TCP.
En utilisant tcpdump, il est facile de capturer les paquets réseaux TDS puis de lire le contenu de ces paquets (requêtes et réponses) avec WireShark par exemple :
root@vps$ tcpdump -nnXSs 0 'port 35027' -w mssql.pcap
mssql.pcap (lecture avec Wireshark)
SQL Batch (Request) Response TDS
=================== ================
S.E.L.E.C.T. .T. 0.9.1...a.d.v.e.
O.P. .(.1.0.0.0. n.t.u.r.e.-.w.o.
). .[.B.u.s.i.n. r.k.s.\.s.a.m.e.
e.s.s.E.n.t.i.t. e.r.0...........
y.I.D.]..... . . ..z.........8.P.
. . . .,.[.N.a. r.o.d.u.c.t.i.o.
n. .T.e.c.h.n.i.
... c.i.a.n. .-. .W.
...
e.]..... . .F.R.
O.M. .[.A.d.v.e.
n.t.u.r.e.W.o.r.
k.s.]...[.H.u.m.
a.n.R.e.s.o.u.r.
c.e.s.]...[.E.m.
p.l.o.y.e.e.].
Les requêtes, les noms des tables et colonnes, les données envoyées et reçues sont dans un format lisible.
Voyons comment encrypter les paquets avec SSL / TLS 1.2 pour SQL Server sous Linux. L’encryption est initiée et forcée par le serveur SQL Server avec un certificat auto-signé (self-signed certificate) : c’est la méthode la plus simple, il n’y a pas utilité de validation du certificat serveur par une autorité pour les connexions, méthode qui implique alors une configuration à faire sur les clients.
openssl
Vérifier la version d’OpenSSL installée sur le système :
mssql@vps$ which openssl/usr/bin/opensslmssql@vps$ openssl versionOpenSSL 1.1.1 11 Sep 2018
Si pour une raison ou une autre (sécurité, etc.) une version spécifique d’OpenSSL, autre que la version système, doit être utilisée :
dans le répertoire /opt/mssql/lib/ créér les liens symboliques libcrypto.so et libssl.so vers les
librairies de la bonne version d’openssl.
Génération des certificats
En tant que root, avec OpenSSL, générer les certificats dans le répertoire où vous souhaitez les installer :
root@vps$ cd /opt/mssql/dba/srvmssql/ssl
root@vps$ openssl req -x509 -nodes -newkey rsa:2048 -subj '/CN=vps.mydomain.com' \
-keyout mssql.key \
-out mssql.pem \
-days 365
- Le paramètre
CNdoit être le nom complet du serveur hôte (host fully-qualified name - FQN). - Les certificats ont une validité d’1 an ici (
-days 365)
La sortie doit ressembler à ceci :
Generating a RSA private key
........................................................+++++
..........................................................+++++
writing new private key to 'mssql.key'
Si le message d’erreur ci-dessous est affiché :
Can't load /root/.rnd into RNG
140480710107584:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/root/.rnd
Commenter la ligne suivante dans le fichier /etc/ssl/openssl.cnf :
/etc/ssl/openssl.cnf
# RANDFILE = $ENV::HOME/.rnd
Modifier le propriétaire à mssql et appliquer les permissions adéquates pour ces certificats :
root@vps$ chown mssql:mssql mssql.pem mssql.key
root@vps$ chmod 600 mssql.pem mssql.key
Configuration SQL Server avec mssql-conf
Lorsque l’encryption est initiée par le moteur SQL Server, appliquer les paramètres suivants avec l’utilitaire mssql-conf.
mssql@vps$ /opt/mssql/bin/mssql-conf set network.tlscert /opt/mssql/dba/srvmssql/ssl/mssql.pem
mssql@vps$ /opt/mssql/bin/mssql-conf set network.tlskey /opt/mssql/dba/srvmssql/ssl/mssql.key
mssql@vps$ /opt/mssql/bin/mssql-conf set network.tlsprotocols 1.2
mssql@vps$ /opt/mssql/bin/mssql-conf set network.forceencryption 1
Le service mssql-server est redémarré :
mssql@vps$ sudo systemctl restart mssql-server
Dans le fichier de log de SQL Server, si il n’y aucun souci de configuration, les informations ci-dessous sont consignées :
2019-06-01 14:09:35.51 Server Successfully initialized the TLS configuration.
Allowed TLS protocol versions are ['1.2'].
Allowed TLS ciphers are ['ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:!DHE-RSA-AES256-GCM-SHA384:!DHE-RSA-AES128-GCM-SHA256:!DHE-RSA-AES256-SHA:!DHE-RSA-AES128-SHA'].
Vérification des connexions en SSL / TLS 1.2
En utilisant sqlcmd, SQL Server Management Studio 18, ODBC… l’encryption est maintenant forcée par le serveur.
La vue sys.dm_exec_connections confirme l’encryption :
mssql@vps$ sqlcmd -Usa -S vpsselect encrypt_option from sys.dm_exec_connections where session_id=64 goencrypt_option ---------------------------------------- TRUE
Une nouvelle capture des paquets avec tcpdump montre maintenant le protocole TLS 1.2 avec des données encryptées
root@vps$ tcpdump -nnXSs 0 'port 35027' -w mssql.pcap
Conclusion
Les étapes pour implémenter l’encryption SSL/TLS 1.2 pour SQL Server sous Linux sont très simples, on pourrait même dire plus simples que sous Windows.
Le port est modifié, l’encryption SSL/TLS pour les connexions client/serveur est implémentée : maintenant SQL Server / Linux dans la zone WAN/DMZ est bien plus sécurisé.