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:

Configuration pour CentOS7 / RHEL7

Cet exemple suppose deux serveurs:

  1. dbserver (où réside notre base de données)
  2. 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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow