MariaDB
 sql >> Database >  >> RDS >> MariaDB

MySQL vs MariaDB vs Percona Server:confronto delle caratteristiche di sicurezza

La sicurezza dei dati è fondamentale per qualsiasi organizzazione. È un aspetto importante che può influenzare pesantemente la progettazione dell'ambiente del database. Quando si decide quale versione di MySQL utilizzare, è necessario prendere in considerazione le funzionalità di sicurezza disponibili dai diversi fornitori di server. In questo post del blog, faremo un breve confronto tra le ultime versioni di MySQL Community Edition di Oracle, Percona Server e MariaDB:

mysqld  Ver 5.7.20-19 for Linux on x86_64 (Percona Server (GPL), Release 19, Revision 3c5d3e5d53c)
mysqld  Ver 5.7.21 for Linux on x86_64 (MySQL Community Server (GPL))
mysqld  Ver 10.2.12-MariaDB for Linux on x86_64 (MariaDB Server)

Utilizzeremo Centos 7 come sistema operativo:tieni presente che i risultati che presentiamo qui potrebbero essere leggermente diversi su altre distribuzioni come Debian o Ubuntu. Vorremmo anche concentrarci sulle differenze e non tratteremo i punti in comune:Percona Server e MariaDB sono versioni di MySQL, quindi alcune delle funzionalità di sicurezza (ad esempio, l'aspetto dei privilegi di accesso dei file MySQL) sono condivise tra di loro.

Sicurezza iniziale

Utenti

Sia Percona Server che MySQL Community Server sono dotati di una password temporanea generata casualmente per l'utente root. Devi controllare il contenuto del log degli errori di MySQL per trovarlo:

2018-01-19T13:47:45.532148Z 1 [Note] A temporary password is generated for [email protected]: palwJu7uSL,g

Una volta effettuato l'accesso, ti viene forzata la modifica della password:

[[email protected] ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.21

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select * from mysql.user;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

La password deve essere abbastanza forte, questo è imposto dal plugin validate_password:

mysql> alter user [email protected] identified by 'password123.';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> alter user [email protected] identified by 'password123.A';
Query OK, 0 rows affected (0.00 sec)

MariaDB non genera una password di root casuale e fornisce l'accesso senza password all'account di root da (e solo da) localhost.

[[email protected] ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 10.2.12-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| [email protected] |
+----------------+
1 row in set (0.00 sec)

Questo non è un grosso problema durante la fase di distribuzione iniziale, poiché il DBA dovrebbe configurare e proteggere l'accesso al database in un secondo momento (eseguendo mysql_secure_installation, ad esempio). Il problema più grande qui è che una buona pratica non è applicata da MariaDB. Se non è necessario impostare una password complessa per l'utente root, è possibile che nessuno la modifichi in seguito e l'accesso senza password rimarrà. Allora questo diventerebbe una seria minaccia alla sicurezza.

Un altro aspetto che vorremmo esaminare è l'accesso anonimo e senza password. Gli utenti anonimi consentono a chiunque di entrare, non deve essere un utente predefinito. Se tale accesso è senza password, significa che chiunque può connettersi a MySQL. In genere tale account ha solo il privilegio USAGE ma anche in questo caso è possibile stampare uno stato ('\s') che contiene informazioni come la versione di MySQL, il set di caratteri ecc. Inoltre, se è disponibile lo schema 'test', tale utente ha la possibilità di scrivi in ​​quello schema.

Sia MySQL Community Server che Percona server non hanno utenti anonimi definiti in MySQL:

mysql> select user, host, authentication_string from mysql.user;
+---------------+-----------+-------------------------------------------+
| user          | host      | authentication_string                     |
+---------------+-----------+-------------------------------------------+
| root          | localhost | *EB965412B594F67C8EB611810EF8D406F2CF42BD |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+---------------+-----------+-------------------------------------------+
3 rows in set (0.00 sec)

D'altra parte, MariaDB è aperto per l'accesso anonimo e senza password.

MariaDB [(none)]> select user,host,password from mysql.user;
+------+-----------------------+----------+
| user | host                  | password |
+------+-----------------------+----------+
| root | localhost             |          |
| root | localhost.localdomain |          |
| root | 127.0.0.1             |          |
| root | ::1                   |          |
|      | localhost             |          |
|      | localhost.localdomain |          |
+------+-----------------------+----------+
6 rows in set (0.00 sec)

In aggiunta a ciò, è disponibile lo schema "test", che consente agli utenti anonimi di inviare scritture al database.

[[email protected] ~]# mysql -umyanonymoususer
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 14
Server version: 10.2.12-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use test;
Database changed
MariaDB [test]> CREATE TABLE mytab (a int);
Query OK, 0 rows affected (0.01 sec)

MariaDB [test]> INSERT INTO mytab VALUES (1), (2);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [test]> SELECT * FROM mytab;
+------+
| a    |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

Ciò rappresenta una seria minaccia e deve essere risolto. Altrimenti, può essere facilmente sfruttato per tentare di sovraccaricare il server con scritture.

Dati in transito in sicurezza

MySQL Community Server ed entrambi i suoi fork supportano l'uso di SSL per crittografare i dati in transito. Questo è estremamente importante per le reti geografiche, ma non dovrebbe essere trascurato in una rete locale. SSL può essere utilizzato sia lato client che lato server. Per quanto riguarda la configurazione lato server (per crittografare il traffico dal master agli slave, ad esempio), sembra identica su tutta la linea. C'è una differenza però quando si tratta di crittografia SSL lato client, introdotta in MySQL 5.7. Prima della 5.7, era necessario generare chiavi SSL e CA e definirle nelle configurazioni sia del server che del client. Ecco come appare la configurazione SSL 10.2 di MariaDB. Sia in MySQL Community Server 5.7 che in Percona Server 5.7 (basato su MySQL 5.7), non è necessario pregenerare le chiavi. Tutto avviene automaticamente, in background. Tutto quello che devi fare è abilitare SSL sul tuo client impostando la corretta '--ssl-mode'. Per il client CLI di MySQL, questo non è nemmeno necessario in quanto abilita SSL per impostazione predefinita:

[[email protected] ~]# mysql -p -h127.0.0.1
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.21 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using  EditLine wrapper

Connection id:        6
Current database:
Current user:        [email protected]
SSL:            Cipher in use is DHE-RSA-AES256-SHA
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server version:        5.7.21 MySQL Community Server (GPL)
Protocol version:    10
Connection:        127.0.0.1 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:        3306
Uptime:            2 days 21 hours 51 min 52 sec

Threads: 1  Questions: 15  Slow queries: 0  Opens: 106  Flush tables: 1  Open tables: 99  Queries per second avg: 0.000
--------------

D'altra parte MariaDB richiederebbe una configurazione aggiuntiva poiché SSL è disabilitato per impostazione predefinita:

[[email protected] ~]# mysql -h127.0.0.1
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 18
Server version: 10.2.12-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> \s
--------------
mysql  Ver 15.1 Distrib 10.2.12-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:        18
Current database:
Current user:        [email protected]
SSL:            Not in use
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server:            MariaDB
Server version:        10.2.12-MariaDB MariaDB Server
Protocol version:    10
Connection:        127.0.0.1 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:        3306
Uptime:            2 days 22 hours 26 min 58 sec

Threads: 7  Questions: 45  Slow queries: 0  Opens: 18  Flush tables: 1  Open tables: 12  Queries per second avg: 0.000
--------------

Crittografia dati inattivi

Prima di tutto, i backup:ci sono strumenti di backup disponibili gratuitamente come xtrabackup o MariaDB Backup (che è un fork di xtrabackup). Questi consentono di creare backup crittografati di tutte e tre le versioni di MySQL di cui discutiamo in questo post del blog.

Tutte e tre le versioni supportano la crittografia del database in esecuzione, ma ci sono differenze in quali parti di dati vengono crittografate.

MySQL Community Server supporta solo la crittografia dei tablespace InnoDB. Le chiavi utilizzate per la crittografia sono archiviate in file (che non sono conformi alle normative - le chiavi devono essere archiviate in un deposito - qualcosa che supporta MySQL Enterprise). Percona Server è basato su MySQL Community Server, quindi supporta anche la crittografia dei tablespace InnoDB. Di recente, in Percona Server 5.7.20, è stato aggiunto il supporto per la crittografia dei tablespace generali (rispetto a quelli singoli nelle versioni precedenti e in MySQL Community Edition). È stato inoltre aggiunto il supporto per la crittografia dei registri binari. Percona Server viene fornito con un plug-in keyring_vault, che può essere utilizzato per archiviare le chiavi nel server Hashicorp Vault, rendendo Percona Server 5.7.20 conforme ai requisiti normativi relativi alla crittografia dei dati inattivi.

MariaDB 10.2 ha un supporto più avanzato per la crittografia dei dati inattivi. Oltre alla crittografia del tablespace e del registro binario/relè, supporta la crittografia dei registri di ripristino di InnoDB. Attualmente è la soluzione più completa per quanto riguarda la crittografia dei dati.

Registrazione di controllo

Tutte e tre le versioni di MySQL supportano la registrazione dell'audit. Il loro scopo è praticamente paragonabile:connetti e disconnetti eventi, query eseguite, tabelle a cui si accede. I registri contengono informazioni su quale utente ha partecipato a tale evento, da quale host l'utente ha effettuato l'accesso, l'ora in cui si è verificato e informazioni simili. Tali eventi possono anche essere registrati tramite syslog e archiviati su un server di log esterno per consentire l'analisi e l'analisi dei log.

Mascheramento dati, firewall SQL

Tutte le versioni di MySQL discusse funzionano con una sorta di strumento che consentirebbe di implementare il mascheramento dei dati e sarebbe in grado di bloccare il traffico SQL in base ad alcune regole. Il mascheramento dei dati è un metodo per offuscare alcuni dati al di fuori del database, ma prima che raggiungano il client. Un esempio potrebbero essere i dati della carta di credito che sono memorizzati come testo normale nel database, ma quando uno sviluppatore vuole interrogare tali dati, vedrà "xxxxxxxx..." invece dei numeri. Gli strumenti di cui stiamo parlando qui sono ProxySQL e MaxScale. MaxScale è un prodotto di MariaDB Corporation ed è basato su abbonamento. ProxySQL è un proxy di database gratuito. Entrambi i proxy possono essere utilizzati con qualsiasi versione di MySQL.

Questo è tutto per la gente di oggi. Per ulteriori letture, dai un'occhiata a questi 10 suggerimenti per proteggere i database MySQL e MariaDB.