MySQL
SSL-anslutningsinställning
Sök…
Inställning för Debian-baserade system
(Detta förutsätter att MySQL har installerats och att sudo
används.)
Genererar en CA- och SSL-nyckel
Se till att OpenSSL och bibliotek är installerade:
apt-get -y install openssl
apt-get -y install libssl-dev
Skapa och ange sedan en katalog för SSL-filerna:
mkdir /home/ubuntu/mysqlcerts
cd /home/ubuntu/mysqlcerts
För att generera nycklar skapar du en certifikatutfärdare (CA) för att underteckna nycklarna (självsignerad):
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
Värdena som anges vid varje prompt påverkar inte konfigurationen. Skapa sedan en nyckel för servern och signera med CA från tidigare:
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
Skapa sedan en nyckel för en klient:
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
Kontrollera nycklarna för att se till att allt är korrekt inställt:
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
Lägga till nycklarna till MySQL
Öppna konfigurationsfilen för MySQL . Till exempel:
vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
till följande alternativ under avsnittet [mysqld]
:
ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/server-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/server-key.pem
Starta om MySQL. Till exempel:
service mysql restart
Testa SSL-anslutningen
Anslut på samma sätt och mata in de extra alternativen ssl-ca
, ssl-cert
och ssl-key
med den genererade klientnyckeln. Om du till exempel antar 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
Efter inloggning, kontrollera att anslutningen verkligen är säker:
[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 |
+---------------+-----------------------------------------+
Du kan också kontrollera:
[email protected] [None]> STATUS;
...
SSL: Cipher in use is DHE-RSA-AES256-SHA
...
Verkställer SSL
Detta GRANT
via GRANT
, med hjälp av REQUIRE SSL
:
GRANT ALL PRIVILEGES ON *.* TO 'superman'@'127.0.0.1' IDENTIFIED BY 'pass' REQUIRE SSL;
FLUSH PRIVILEGES;
Nu måste superman
ansluta via SSL.
Om du inte vill hantera klientnycklar använder du klientnyckeln från tidigare och använder den automatiskt för alla klienter. Öppna MySQL-konfigurationsfil , till exempel:
vim /etc/mysql/mysql.conf.d/mysqld.cnf
Lägg till följande alternativ under avsnittet [client]
:
ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/client-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/client-key.pem
Nu måste superman
bara skriva följande för att logga in via SSL:
mysql -h 127.0.0.1 -u superman -p
Anslutning från ett annat program, till exempel i Python, kräver vanligtvis bara en extra parameter för anslutningsfunktionen. Ett Python-exempel:
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)
Referenser och vidare läsning:
- 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
Inställning för CentOS7 / RHEL7
Detta exempel antar två servrar:
- dbserver (där vår databas bor)
- appclient (där våra applikationer bor)
FWIW, båda servrarna upprätthåller SELinux.
Logga in först på dbserver
Skapa en tillfällig katalog för att skapa certifikaten.
mkdir /root/certs/mysql/ && cd /root/certs/mysql/
Skapa servercertifikaten
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
Flytta servercertifikat till / etc / pki / tls / certs / mysql /
Katalogväg antar CentOS eller RHEL (justera efter behov för andra distros):
mkdir /etc/pki/tls/certs/mysql/
Var noga med att ställa in behörigheter i mappen och filerna. mysql behöver fullt ägande och tillgång.
chown -R mysql:mysql /etc/pki/tls/certs/mysql
Konfigurera nu 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
Sedan
systemctl restart mariadb
Glöm inte att öppna din brandvägg för att tillåta anslutningar från appclient (med 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.
Starta om brandväggen
service firewalld restart
Logga sedan in på dbservers mysql-server:
mysql -uroot -p
Ge ut följande för att skapa en användare för klienten. Obs KRAV SSL i GRANT-uttalande.
GRANT ALL PRIVILEGES ON *.* TO ‘iamsecure’@’appclient’ IDENTIFIED BY ‘dingdingding’ REQUIRE SSL;
FLUSH PRIVILEGES;
# quit mysql
Du bör fortfarande vara i / root / certs / mysql från första steget. Om inte, cd tillbaka till det för en av kommandona nedan.
Skapa klientcertifikat
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
Obs : Jag använde samma vanliga namn för både server- och klientcertifikat. YMMV.
Se till att du fortfarande är / root / certs / mysql / för det här kommandot
Kombinera CA-certifikat för server och klient i en enda fil:
cat server-cert.pem client-cert.pem > ca.pem
Se till att du ser två certifikat:
cat ca.pem
Slutet på servern SIDA ARBETE NU.
Öppna en annan terminal och
ssh appclient
Som tidigare, skapa ett permanent hem för klientcertifikaten
mkdir /etc/pki/tls/certs/mysql/
Placera nu klientcertifikaten (skapade på dbserver) på appclient. Du kan antingen scp över dem, eller bara kopiera och klistra in filerna en efter en.
scp dbserver
# copy files from dbserver to appclient
# exit scp
Återigen, se till att ställa in behörigheter för mappen och filerna. mysql behöver fullt ägande och tillgång.
chown -R mysql:mysql /etc/pki/tls/certs/mysql
Du bör ha tre filer, vardera som ägs av användaren mysql:
/etc/pki/tls/certs/mysql/ca.pem
/etc/pki/tls/certs/mysql/client-cert.pem
/etc/pki/tls/certs/mysql/client-key.pem
Redigera nu appclients MariaDB / MySQL-konfigurering i avsnittet [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
Starta om klientens mariadb-tjänst:
systemctl restart mariadb
fortfarande på klienten här
Detta bör returnera: ssl SANT
mysql --ssl --help
Logga in på appclients mysql-instans
mysql -uroot -p
Bör se JA för båda variablerna nedan
show variables LIKE '%ssl';
have_openssl YES
have_ssl YES
Till att börja med såg jag
have_openssl NO
En snabb titt på mariadb.log avslöjade:
SSL-fel: Det gick inte att få certifikat från '/etc/pki/tls/certs/mysql/client-cert.pem'
Problemet var att root-ägda client-cert.pem och mappen innehållande. Lösningen var att ställa in ägande till / etc / pki / tls / certs / mysql / till mysql.
chown -R mysql:mysql /etc/pki/tls/certs/mysql
Starta om mariadb om det behövs från steget omedelbart ovan
NU ÄR VI KLARA TESTA SÄKER ANSLUTNING
Vi är fortfarande på appclient här
Försök att ansluta till dbservers mysql-instans med kontot som skapats ovan.
mysql -h dbserver -u iamsecure -p
# enter password dingdingding (hopefully you changed that to something else)
Med lite tur ska du vara inloggad utan fel.
För att bekräfta att du är ansluten till SSL aktiverad, utfärda följande kommando från MariaDB / MySQL-prompten:
\s
Det är en backslash s, alias status
Det visar status för din anslutning, som borde se ut så här:
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
Om du får tillåtna nekade fel på ditt anslutningsförsök, kontrollera ditt GRANT-uttalande ovan för att se till att det inte finns några härliga tecken eller "märken.
Om du har SSL-fel går du igenom den här guiden för att se till att stegen är ordnade.
Detta fungerade på RHEL7 och kommer sannolikt också att fungera på CentOS7. Det går inte att bekräfta om dessa exakta steg fungerar någon annanstans.
Hoppas att detta sparar någon annan lite tid och förvärring.