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:

Inställning för CentOS7 / RHEL7

Detta exempel antar två servrar:

  1. dbserver (där vår databas bor)
  2. 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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow