MySQL
Configuration de la connexion SSL
Recherche…
Configuration pour les systèmes basés sur Debian
(Cela suppose que MySQL a été installé et que sudo
est utilisé.)
Génération d'une clé CA et d'une clé SSL
Assurez-vous que OpenSSL et les bibliothèques sont installés:
apt-get -y install openssl
apt-get -y install libssl-dev
Faites ensuite et entrez un répertoire pour les fichiers SSL:
mkdir /home/ubuntu/mysqlcerts
cd /home/ubuntu/mysqlcerts
Pour générer des clés, créez une autorité de certification (CA) pour signer les clés (auto-signées):
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
Les valeurs entrées à chaque invite n'affecteront pas la configuration. Ensuite, créez une clé pour le serveur et signez avec l’autorité de certification d’avant:
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Créez ensuite une clé pour un client:
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Pour vous assurer que tout a été configuré correctement, vérifiez les clés:
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
Ajouter les clés à MySQL
Ouvrez le fichier de configuration MySQL . Par exemple:
vim /etc/mysql/mysql.conf.d/mysqld.cnf
Sous la section [mysqld]
, ajoutez les options suivantes:
ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/server-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/server-key.pem
Redémarrez MySQL. Par exemple:
service mysql restart
Tester la connexion SSL
Connectez-vous de la même manière en transmettant les options supplémentaires ssl-ca
, ssl-cert
et ssl-key
à l'aide de la clé client générée. Par exemple, en supposant que cd /home/ubuntu/mysqlcerts
:
mysql --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -h 127.0.0.1 -u superman -p
Une fois connecté, vérifiez que la connexion est bien sécurisée:
[email protected] [None]> SHOW VARIABLES LIKE '%ssl%';
+---------------+-----------------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /home/ubuntu/mysqlcerts/ca.pem |
| ssl_capath | |
| ssl_cert | /home/ubuntu/mysqlcerts/server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | /home/ubuntu/mysqlcerts/server-key.pem |
+---------------+-----------------------------------------+
Vous pouvez également vérifier:
[email protected] [None]> STATUS;
...
SSL: Cipher in use is DHE-RSA-AES256-SHA
...
Application du protocole SSL
Ceci est via GRANT
, en utilisant REQUIRE SSL
:
GRANT ALL PRIVILEGES ON *.* TO 'superman'@'127.0.0.1' IDENTIFIED BY 'pass' REQUIRE SSL;
FLUSH PRIVILEGES;
Maintenant, superman
doit se connecter via SSL.
Si vous ne souhaitez pas gérer les clés client, utilisez la clé client plus tôt et utilisez-la automatiquement pour tous les clients. Ouvrez le fichier de configuration MySQL , par exemple:
vim /etc/mysql/mysql.conf.d/mysqld.cnf
Sous la section [client]
, ajoutez les options suivantes:
ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/client-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/client-key.pem
Maintenant, superman
doit seulement saisir ce qui suit pour se connecter via SSL:
mysql -h 127.0.0.1 -u superman -p
La connexion à partir d'un autre programme, par exemple en Python, ne nécessite généralement qu'un paramètre supplémentaire pour la fonction de connexion. Un exemple Python:
import MySQLdb
ssl = {'cert': '/home/ubuntu/mysqlcerts/client-cert.pem', 'key': '/home/ubuntu/mysqlcerts/client-key.pem'}
conn = MySQLdb.connect(host='127.0.0.1', user='superman', passwd='imsoawesome', ssl=ssl)
Références et lectures complémentaires:
- https://www.percona.com/blog/2013/06/22/setting-up-mysql-ssl-and-secure-connections/
- https://lowendbox.com/blog/getting-started-with-mysql-over-ssl/
- http://xmodulo.com/enable-ssl-mysql-server-client.html
- https://ubuntuforums.org/showthread.php?t=1121458
Configuration pour CentOS7 / RHEL7
Cet exemple suppose deux serveurs:
- dbserver (où réside notre base de données)
- appclient (où nos applications vivent)
FWIW, les deux serveurs sont forcés par SELinux.
Tout d'abord, connectez-vous à dbserver
Créez un répertoire temporaire pour créer les certificats.
mkdir /root/certs/mysql/ && cd /root/certs/mysql/
Créer les certificats du serveur
openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
Déplacer les certificats de serveur vers / etc / pki / tls / certs / mysql /
Le chemin de répertoire suppose CentOS ou RHEL (ajustez au besoin pour les autres distributions):
mkdir /etc/pki/tls/certs/mysql/
Veillez à définir des autorisations sur le dossier et les fichiers. mysql a besoin de la pleine propriété et de l'accès.
chown -R mysql:mysql /etc/pki/tls/certs/mysql
Configurez maintenant MySQL / MariaDB
# vi /etc/my.cnf
# i
[mysqld]
bind-address=*
ssl-ca=/etc/pki/tls/certs/ca-cert.pem
ssl-cert=/etc/pki/tls/certs/server-cert.pem
ssl-key=/etc/pki/tls/certs/server-key.pem
# :wq
alors
systemctl restart mariadb
N'oubliez pas d'ouvrir votre pare-feu pour autoriser les connexions depuis appclient (en utilisant IP 1.2.3.4)
firewall-cmd --zone=drop --permanent --add-rich-rule 'rule family="ipv4" source address="1.2.3.4" service name="mysql" accept'
# I force everything to the drop zone. Season the above command to taste.
Maintenant, redémarrez firewalld
service firewalld restart
Ensuite, connectez-vous au serveur mysql de dbserver:
mysql -uroot -p
Émettez ce qui suit pour créer un utilisateur pour le client. notez SSL OBLIGATOIRE dans l'instruction GRANT.
GRANT ALL PRIVILEGES ON *.* TO ‘iamsecure’@’appclient’ IDENTIFIED BY ‘dingdingding’ REQUIRE SSL;
FLUSH PRIVILEGES;
# quit mysql
Vous devriez toujours être dans / root / certs / mysql dès la première étape. Si non, cd y revenir pour une des commandes ci-dessous.
Créer les certificats clients
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
Remarque : j'ai utilisé le même nom commun pour les certificats serveur et client. YMMV.
Assurez-vous que vous êtes toujours / root / certs / mysql / pour cette prochaine commande
Combinez un certificat de CA serveur et client dans un seul fichier:
cat server-cert.pem client-cert.pem > ca.pem
Assurez-vous de voir deux certificats:
cat ca.pem
FIN DU SERVEUR CÔTÉ TRAVAIL POUR MAINTENANT.
Ouvrez un autre terminal et
ssh appclient
Comme auparavant, créer un domicile permanent pour les certificats clients
mkdir /etc/pki/tls/certs/mysql/
Maintenant, placez les certificats clients (créés sur dbserver) sur appclient. Vous pouvez soit les parcourir, soit copier et coller les fichiers un par un.
scp dbserver
# copy files from dbserver to appclient
# exit scp
Encore une fois, veillez à définir des autorisations sur le dossier et les fichiers. mysql a besoin de la pleine propriété et de l'accès.
chown -R mysql:mysql /etc/pki/tls/certs/mysql
Vous devriez avoir trois fichiers, chacun appartenant à l'utilisateur mysql:
/etc/pki/tls/certs/mysql/ca.pem
/etc/pki/tls/certs/mysql/client-cert.pem
/etc/pki/tls/certs/mysql/client-key.pem
Maintenant, éditez la configuration MariaDB / MySQL de l'appclient dans la section [client]
.
vi /etc/my.cnf
# i
[client]
ssl-ca=/etc/pki/tls/certs/mysql/ca.pem
ssl-cert=/etc/pki/tls/certs/mysql/client-cert.pem
ssl-key=/etc/pki/tls/certs/mysql/client-key.pem
# :wq
Redémarrez le service mariadb de l'appclient:
systemctl restart mariadb
toujours sur le client ici
Cela devrait retourner: ssl TRUE
mysql --ssl --help
Connectez-vous maintenant à l'instance mysql de l'appclient
mysql -uroot -p
Devrait voir OUI aux deux variables ci-dessous
show variables LIKE '%ssl';
have_openssl YES
have_ssl YES
Au départ, j'ai vu
have_openssl NO
Un rapide coup d’œil sur mariadb.log a révélé:
Erreur SSL: impossible d'obtenir le certificat à partir de /etc/pki/tls/certs/mysql/client-cert.pem
Le problème était que la racine possédait client-cert.pem et le dossier contenant. La solution consistait à définir la propriété de / etc / pki / tls / certs / mysql / sur mysql.
chown -R mysql:mysql /etc/pki/tls/certs/mysql
Redémarrez mariadb si nécessaire à partir de l'étape ci-dessus
MAINTENANT, NOUS SOMMES PRÊTS À TESTER LA CONNEXION SÉCURISÉE
Nous sommes toujours sur appclient ici
Essayez de vous connecter à l'instance mysql de dbserver en utilisant le compte créé ci-dessus.
mysql -h dbserver -u iamsecure -p
# enter password dingdingding (hopefully you changed that to something else)
Avec un peu de chance, vous devriez être connecté sans erreur.
Pour confirmer que vous êtes connecté avec SSL activé, lancez la commande suivante à partir de l'invite MariaDB / MySQL:
\s
C'est un backslash, alias statut
Cela montrera le statut de votre connexion, qui devrait ressembler à ceci:
Connection id: 4
Current database:
Current user: iamsecure@appclient
SSL: Cipher in use is DHE-RSA-AES256-GCM-SHA384
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 5.X.X-MariaDB MariaDB Server
Protocol version: 10
Connection: dbserver via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 42 min 13 sec
Si vous obtenez une autorisation refusée pour des erreurs sur votre tentative de connexion, vérifiez votre instruction GRANT ci-dessus pour vous assurer qu'il n'y a pas de caractères ou de marques parasites.
Si vous avez des erreurs SSL, consultez ce guide pour vous assurer que les étapes sont correctes.
Cela a fonctionné sur RHEL7 et fonctionnera probablement aussi sur CentOS7. Impossible de confirmer si ces étapes exactes fonctionneront ailleurs.
J'espère que cela sauve quelqu'un d'autre un peu de temps et d'aggravation.