sql >> Database >  >> RDS >> Mysql

Zijn mijn MySQL-serververbindingen versleuteld en veilig?

Een van de belangrijkste factoren en fundamenten van gegevensbeheer is beveiliging. Het is een goede gewoonte om databasebeveiliging te implementeren wanneer u uw gegevensbeheer gebruikt voor zakelijke of massaconsumptie.

Gegevensbeveiliging is een van de belangrijkste aspecten van het beheer van een database. Het speelt een cruciale rol die elk databasebeheer zou moeten implementeren. Als het correct wordt geïmplementeerd en uitgevoerd, zal het resultaat niet alleen uw gegevensbeveiliging verbeteren, maar ook de systeemstabiliteit beïnvloeden, de ontwikkelingslevenscyclus verbeteren, uw gegevensnaleving verbeteren en het beveiligingsbewustzijn tot op teamniveau vergroten. Iedereen wil niet dat zijn gegevens in verkeerde handen terechtkomen. Als gegevens worden geschonden, brengt dit niet alleen de vertrouwelijkheid en integriteit van uw gegevens in gevaar, maar loopt uw ​​organisatie ook bloot aan aanzienlijke financiële risico's. Zelfs voor een simpele implementatie van databasebeheer, als je erachter komt dat iemand je systeem al heeft binnengedrongen, is het gevoel van onzekerheid en angst over de gevolgen die dit met zich meebrengt, totaal ongemakkelijk.

Bepalen of uw MySQL-serververbinding veilig is, hangt af van hoe veilig MySQL data-in-transit verzendt. Met een niet-versleutelde verbinding tussen de MySQL-client en de server, kan iemand met toegang tot het netwerk al uw verkeer bekijken en de gegevens inspecteren die tussen client en server worden verzonden of ontvangen.

Als je informatie op een veilige manier over een netwerk moet verplaatsen, is een niet-versleutelde verbinding onaanvaardbaar. Gebruik codering om elke vorm van gegevens onleesbaar te maken. Versleutelingsalgoritmen moeten beveiligingselementen bevatten om vele soorten bekende aanvallen te weerstaan, zoals het wijzigen van de volgorde van versleutelde berichten of het tweemaal afspelen van gegevens.

Maar mijn MySQL is veilig, toch?

Geloven dat uw MySQL veilig is zonder de stabiliteits- en kwetsbaarheidscontroles te bepalen, is als een religie. Je hebt de neiging om te geloven, zelfs zonder het te zien, zelfs zonder het aan te raken. Het probleem is dat MySQL een technologie is en het bestaan ​​ervan niet gebaseerd is op abstracte gedachten. Het moet worden getest, het moet worden bewezen, en het vereist veiligheid en volgt best practices die ook door anderen zijn getest.

Bepalen of uw MySQL-serververbindingen, d.w.z. in-transit, veilig zijn of gecodeerd zijn, is afhankelijk van "hoe heeft u uw database ingesteld?" of "wie heeft uw database ingesteld?".

MySQL ondersteunt versleutelde verbindingen tussen clients en de server met behulp van het TLS-protocol (Transport Layer Security). TLS wordt soms SSL (Secure Sockets Layer) genoemd, maar MySQL gebruikt het SSL-protocol niet echt voor versleutelde verbindingen omdat de codering zwak is en SSL al is afgeschaft ten gunste van TLS. TLS gebruikt coderingsalgoritmen om ervoor te zorgen dat gegevens die via een openbaar netwerk worden ontvangen, kunnen worden vertrouwd. Het heeft mechanismen om gegevensverandering, verlies of herhaling te detecteren. TLS bevat ook algoritmen die identiteitsverificatie bieden met behulp van de X.509-standaard. SSL of TLS wordt door elkaar gebruikt, maar voor de context van codering met MySQL wordt TLS gebruikt waarvoor MySQL gecodeerde verbindingen ondersteunt met behulp van de TLSv1-, TLSv1.1-, TLSv1.2- en TLSv1.3-protocollen.

X.509 maakt het mogelijk om iemand op internet te identificeren. In basistermen zou er een entiteit moeten zijn die een "Certificaatautoriteit" (of CA) wordt genoemd en die elektronische certificaten toewijst aan iedereen die ze nodig heeft. Certificaten zijn afhankelijk van asymmetrische coderingsalgoritmen die twee coderingssleutels hebben (een openbare sleutel en een geheime sleutel). Een certificaathouder kan het certificaat als identiteitsbewijs aan een andere partij overleggen. Een certificaat bestaat uit de openbare sleutel van de eigenaar. Alle gegevens die met deze openbare sleutel zijn versleuteld, kunnen alleen worden ontsleuteld met de bijbehorende geheime sleutel, die in het bezit is van de eigenaar van het certificaat.

Net zoals de Spartanen Scytale gebruikten

Scytale staat bekend als een manier om een ​​bericht te coderen en te decoderen dat rond 400 voor Christus werd gebruikt. door de Spartanen. Ze zouden een bericht schrijven op een vel papyrus (een soort papier) dat om een ​​staf was gewikkeld. De ontvanger kan het bericht alleen ontcijferen als de juiste diameter en maat van het personeel. Het dient als een manier om te coderen en ongeautoriseerde extractie van berichten of gegevens naar de doelbestemming te voorkomen.

Net als bij MySQL is het gebruik van SSL/TLS-protocollen en -coderingen een manier om te voorkomen dat iemand uw gegevens extraheert of uw gegevens kapt terwijl deze over het internet of over het internet worden verzonden.

Standaard proberen MySQL-programma's verbinding te maken met behulp van versleuteling als de server versleutelde verbindingen ondersteunt, en vallen ze terug op een niet-versleutelde verbinding als er geen versleutelde verbinding tot stand kan worden gebracht. Sinds versie MySQL>=5.7 kunnen TLS/SSL- en RSA-bestanden worden aangemaakt of gegenereerd met ondersteuning van variabelen. Voor MySQL-distributies die zijn gecompileerd met OpenSSL, heeft de MySQL-server de mogelijkheid om automatisch ontbrekende SSL- en RSA-bestanden te genereren bij het opstarten. De auto_generate_certs, sha256_password_auto_generate_rsa_keys en caching_sha2_password_auto_generate_rsa_keys (versie>=8.0), systeemvariabelen regelen het automatisch genereren van deze bestanden. Deze variabelen zijn standaard ingeschakeld. Ze kunnen worden ingeschakeld bij het opstarten en worden geïnspecteerd, maar niet worden ingesteld tijdens runtime.

Standaard zijn deze variabelen ingesteld op AAN of ingeschakeld. Anders kunnen gebruikers het hulpprogramma mysql_ssl_rsa_setup handmatig aanroepen. Voor sommige distributietypen, zoals RPM- en DEB-pakketten, vindt het aanroepen van mysql_ssl_rsa_setup plaats tijdens de initialisatie van de gegevensmap. In dit geval hoeft de MySQL-distributie niet gecompileerd te zijn met OpenSSL zolang het openssl-commando beschikbaar is.

Zodra deze bestanden beschikbaar en/of gegenereerd zijn, zal MySQL om de volgende redenen nog steeds geen versleutelingsverbindingen gebruiken. Zoals eerder vermeld, proberen MySQL-clientprogramma's standaard een versleutelde verbinding tot stand te brengen als de server versleutelde verbindingen ondersteunt, met verdere controle beschikbaar via de --ssl-mode (of --ssl <=5.7.11 aangezien dit al verouderd is) optie:

  • Als de MySQL-verbinding niet is gemarkeerd met --ssl-mode, wordt de standaardwaarde standaard ingesteld op --ssl-mode=VOORKEUR. Daarom proberen clients verbinding te maken met behulp van versleuteling en vallen ze terug op een niet-versleutelde verbinding als er geen versleutelde verbinding tot stand kan worden gebracht.

  • Met --ssl-mode=REQUIRED hebben clients een versleutelde verbinding nodig en mislukken ze als er geen verbinding kan worden gemaakt.

  • Met --ssl-mode=DISABLED gebruiken clients een niet-versleutelde verbinding.

  • Met --ssl-mode=VERIFY_CA of --ssl-mode=VERIFY_IDENTITY hebben clients een versleutelde verbinding nodig en voer ook verificatie uit met het CA-certificaat van de server en (met VERIFY_IDENTITY) met de hostnaam van de server in het certificaat.

Met het standaardmechanisme van MySQL om een ​​voorkeursverbinding te gebruiken, zal het waarschijnlijk proberen de versleutelde of beveiligde verbinding te gebruiken, maar dit laat nog wat dingen te doen en te bepalen.

Zoals eerder vermeld, helpen de variabelen auto_generate_certs, sha256_password_auto_generate_rsa_keys en caching_sha2_password_auto_generate_rsa_keys (versie>=8.0) bij het genereren van de vereiste SSL/TLS- en RSA-bestanden, waarbij de normale gebruiker zonder dergelijke vereisten tijdens de verbinding nog steeds onzeker. Laten we bijvoorbeeld een gebruiker maken met de naam dbadmin.

mysql> create user 'dbadmin'@'192.168.40.%' identified by '[email protected]';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'dbadmin'@'192.168.40.%';
Query OK, 0 rows affected (0.01 sec)

Controleer vervolgens of de variabelen correct zijn ingesteld, die standaard moeten worden ingeschakeld:

mysql> show global variables where variable_name in ('auto_generate_certs','sha256_password_auto_generate_rsa_keys','caching_sha2_password_auto_generate_rsa_keys');
+----------------------------------------------+-------+
| Variable_name                                | Value |
+----------------------------------------------+-------+
| auto_generate_certs                          | ON    |
| caching_sha2_password_auto_generate_rsa_keys | ON    |
| sha256_password_auto_generate_rsa_keys       | ON    |
+----------------------------------------------+-------+
3 rows in set (0.00 sec)

Controleren of de bestanden dienovereenkomstig zijn gegenereerd in pad /var/lib/mysql/ (of het pad van datadir voor deze MySQL):

$ find /var/lib/mysql -name "*.pem"
/var/lib/mysql/ca-key.pem
/var/lib/mysql/ca.pem
/var/lib/mysql/server-key.pem
/var/lib/mysql/server-cert.pem
/var/lib/mysql/client-key.pem
/var/lib/mysql/client-cert.pem
/var/lib/mysql/private_key.pem
/var/lib/mysql/public_key.pem

Controleer vervolgens of SSL-bestanden correct zijn geladen:

mysql> show global variables like 'ssl%';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| ssl_ca        | ca.pem          |
| ssl_capath    |                 |
| ssl_cert      | server-cert.pem |
| ssl_cipher    |                 |
| ssl_crl       |                 |
| ssl_crlpath   |                 |
| ssl_fips_mode | OFF             |
| ssl_key       | server-key.pem  |
+---------------+-----------------+
8 rows in set (0.00 sec)

Bepaal de beveiliging van uw verbinding

Dit ziet er goed uit. Het betekent ook dat MySQL klaar is om versleutelde verbindingen te accepteren. Maar verbinding maken met MySQL zoals het is, zoals vermeld, zal standaard --ssl-mode=PREFFERED gebruiken, of als --ssl-mode niet is gespecificeerd, zal het nog steeds een niet-versleutelde verbinding gebruiken. Zie hieronder:

$ mysql [email protected] -h 192.168.40.110 -udbadmin -e "status;"|grep ssl -i

SSL:                    Niet in gebruik

Dit onthult dat het geen beveiligde verbinding gebruikt. Als u de statusvariabelen van de SSL-sessie controleert of er cijfers worden gebruikt, ziet u leeg:

mysql> show global status like 'ssl%';
+--------------------------------+--------------------------+
| Variable_name                  | Value                    |
+--------------------------------+--------------------------+
| Ssl_accept_renegotiates        | 0                        |
| Ssl_accepts                    | 2                        |
| Ssl_callback_cache_hits        | 0                        |
| Ssl_cipher                     |                          |
| Ssl_cipher_list                |                          |
| Ssl_client_connects            | 0                        |
| Ssl_connect_renegotiates       | 0                        |
| Ssl_ctx_verify_depth           | 18446744073709551615     |
| Ssl_ctx_verify_mode            | 5                        |
| Ssl_default_timeout            | 0                        |
| Ssl_finished_accepts           | 2                        |
| Ssl_finished_connects          | 0                        |
| Ssl_server_not_after           | Aug 28 12:48:46 2031 GMT |
| Ssl_server_not_before          | Aug 30 12:48:46 2021 GMT |
| Ssl_session_cache_hits         | 0                        |
| Ssl_session_cache_misses       | 0                        |
| Ssl_session_cache_mode         | SERVER                   |
| Ssl_session_cache_overflows    | 0                        |
| Ssl_session_cache_size         | 128                      |
| Ssl_session_cache_timeouts     | 0                        |
| Ssl_sessions_reused            | 0                        |
| Ssl_used_session_cache_entries | 0                        |
| Ssl_verify_depth               | 0                        |
| Ssl_verify_mode                | 0                        |
| Ssl_version                    |                          |
+--------------------------------+--------------------------+
25 rows in set (0.002 sec)

Een beveiligde verbinding afdwingen 

Aangezien het onthult dat de verbinding nog steeds niet beveiligd is, introduceert MySQL de variabele required_secure_transport die vereist dat alle te maken verbindingen versleuteld en beveiligd moeten zijn. Alle pogingen om verbinding te maken voor een onbeveiligde verbinding mislukken. Bijvoorbeeld inschakelen op de server:

mysql> set global require_secure_transport=1;
Query OK, 0 rows affected (0.00 sec)

Als u als client verbinding probeert te maken met een niet-versleutelde verbinding, mislukt dit:

$ mysql [email protected] -h 192.168.40.110 -udbadmin
ERROR 3159 (HY000): Connections using insecure transport are prohibited while --require_secure_transport=ON.

Om succesvol en veilig verbinding te maken, moet je de ssl-ca, ssl-cert, ssl-key variabelen specificeren. Zie hieronder:

$ mysql [email protected] -h 192.168.40.110 -udbadmin --ssl-ca=/tmp/pem/ca.pem --ssl-cert=/tmp/pem/server-cert.pem --ssl-key=/tmp/pem/server-key.pem -e "show global status like 'ssl%'\G"
*************************** 1. row ***************************
Variable_name: Ssl_accept_renegotiates
        Value: 0
*************************** 2. row ***************************
Variable_name: Ssl_accepts
        Value: 16
*************************** 3. row ***************************
Variable_name: Ssl_callback_cache_hits
        Value: 0
*************************** 4. row ***************************
Variable_name: Ssl_cipher
        Value: TLS_AES_256_GCM_SHA384
*************************** 5. row ***************************
Variable_name: Ssl_cipher_list
        Value: TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-DSS-AES128-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES256-SHA:CAMELLIA256-SHA:CAMELLIA128-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA
*************************** 6. row ***************************
Variable_name: Ssl_client_connects
        Value: 0
*************************** 7. row ***************************
Variable_name: Ssl_connect_renegotiates
        Value: 0
*************************** 8. row ***************************
Variable_name: Ssl_ctx_verify_depth
        Value: 18446744073709551615
*************************** 9. row ***************************
Variable_name: Ssl_ctx_verify_mode
        Value: 5
*************************** 10. row ***************************
Variable_name: Ssl_default_timeout
        Value: 7200
*************************** 11. row ***************************
Variable_name: Ssl_finished_accepts
        Value: 11
*************************** 12. row ***************************
Variable_name: Ssl_finished_connects
        Value: 0
*************************** 13. row ***************************
Variable_name: Ssl_server_not_after
        Value: Aug 28 12:48:46 2031 GMT
*************************** 14. row ***************************
Variable_name: Ssl_server_not_before
        Value: Aug 30 12:48:46 2021 GMT
*************************** 15. row ***************************
Variable_name: Ssl_session_cache_hits
        Value: 0
*************************** 16. row ***************************
Variable_name: Ssl_session_cache_misses
        Value: 0
*************************** 17. row ***************************
Variable_name: Ssl_session_cache_mode
        Value: SERVER
*************************** 18. row ***************************
Variable_name: Ssl_session_cache_overflows
        Value: 0
*************************** 19. row ***************************
Variable_name: Ssl_session_cache_size
        Value: 128
*************************** 20. row ***************************
Variable_name: Ssl_session_cache_timeouts
        Value: 0
*************************** 21. row ***************************
Variable_name: Ssl_sessions_reused
        Value: 0
*************************** 22. row ***************************
Variable_name: Ssl_used_session_cache_entries
        Value: 0
*************************** 23. row ***************************
Variable_name: Ssl_verify_depth
        Value: 18446744073709551615
*************************** 24. row ***************************
Variable_name: Ssl_verify_mode
        Value: 5
*************************** 25. row ***************************
Variable_name: Ssl_version
        Value: TLSv1.3

Als alternatief, als een gebruiker is aangemaakt met REQUIRED SSL, zou die u ook moeten verbinden via SSL, ongeacht dat required_secure_transport is uitgeschakeld, wat de standaardwaarde is. Houd er rekening mee dat, als required_secure_transport is ingeschakeld, de mogelijkheid een aanvulling vormt op de SSL-vereisten per account, die voorrang hebben. Daarom, als een account is gedefinieerd met REQUIRE SSL, maakt het inschakelen van required_secure_transport het niet mogelijk om het account te gebruiken om verbinding te maken met een Unix-socketbestand.

Ervoor zorgen dat MySQL-serverimplementaties versleuteld en veilig zijn

Problemen is waar we altijd naar uitkijken, zodat we ons geen zorgen hoeven te maken over andere problemen en zorgen. ClusterControl implementeert MySQL-databases met behulp van versleutelde verbindingen en genereert de SSL- en RSA-certificaten voor u. Een screenshot hieronder toont u bijvoorbeeld de taakactiviteit van een opdracht Cluster maken van ClusterControl.

Het stelt de SSL- en RSA-bestanden in en plaatst ze in /etc/ mysql/certs/ pad zoals hieronder:

mysql> show global variables like 'ssl%';
+---------------+--------------------------------+
| Variable_name | Value                          |
+---------------+--------------------------------+
| ssl_ca        | /etc/mysql/certs/server_ca.crt |
| ssl_capath    |                                |
| ssl_cert      | /etc/mysql/certs/server.crt    |
| ssl_cipher    |                                |
| ssl_crl       |                                |
| ssl_crlpath   |                                |
| ssl_key       | /etc/mysql/certs/server.key    |
+---------------+--------------------------------+
7 rows in set (0.00 sec)

Vervolgens groepeert ClusterControl de gegenereerde SSL- en RSA-bestanden op een gecentraliseerde manier onder het navigatiepaneel Sleutelbeheer, zoals hieronder weergegeven:

Eenmaal geïmplementeerd, hoeft u alleen maar gebruikers met VEREISTE SSL aan te maken of required_secure_transport te hebben als u een versleutelde en beveiligde laag voor uw MySQL-serververbindingen wilt afdwingen.


  1. MariaDB – MySQL – Toon motoren om alle beschikbare en ondersteunde motoren weer te geven

  2. Hoe de BINARY-operator werkt in MariaDB

  3. JDBC-batchbewerkingen begrijpen

  4. docker postgres pgadmin lokale verbinding