Datasikkerhed er afgørende for enhver organisation. Det er et vigtigt aspekt, der kan have stor indflydelse på designet af databasemiljøet. Når du beslutter dig for, hvilken MySQL-smag du skal bruge, skal du tage højde for de sikkerhedsfunktioner, der er tilgængelige fra de forskellige serverleverandører. I dette blogindlæg kommer vi med en kort sammenligning af de seneste versioner af MySQL Community Edition fra Oracle, Percona Server og 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)
Vi kommer til at bruge Centos 7 som operativsystem - husk venligst, at resultaterne, vi præsenterer her, kan være lidt anderledes på andre distributioner som Debian eller Ubuntu. Vi vil også gerne fokusere på forskellene og vil ikke dække fællestræk - Percona Server og MariaDB er varianter af MySQL, så nogle af sikkerhedsfunktionerne (f.eks. hvordan adgangsrettigheder til MySQL-filer ser ud) er delt mellem dem.
Oprindelig sikkerhed
Brugere
Både Percona Server og MySQL Community Server leveres med en tilfældigt genereret midlertidig adgangskode til root-brugeren. Du skal tjekke indholdet af MySQL's fejllog for at finde den:
2018-01-19T13:47:45.532148Z 1 [Note] A temporary password is generated for [email protected]: palwJu7uSL,g
Når du logger ind, tvinges en adgangskodeændring til dig:
[[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.
Adgangskoden skal være stærk nok, dette håndhæves af plugin'et 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 genererer ikke en tilfældig root-adgangskode, og den giver adgangskodefri adgang til root-kontoen fra (og kun fra) 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)
Dette er ikke et stort problem i den indledende implementeringsfase, da DBA formodes at konfigurere og sikre adgang til databasen senere (ved at køre mysql_secure_installation for eksempel). Det større problem her er, at en god praksis ikke håndhæves af MariaDB. Hvis du ikke skal konfigurere en stærk adgangskode til root-brugeren, kan det være, at ingen ændrer det senere, og adgangskodefri adgang forbliver. Så ville dette blive en alvorlig sikkerhedstrussel.
Et andet aspekt, vi gerne vil se på, er anonym adgang uden adgangskode. Anonyme brugere tillader alle at komme ind, det behøver ikke at være en foruddefineret bruger. Hvis en sådan adgang er uden adgangskode, betyder det, at alle kan oprette forbindelse til MySQL. Typisk har en sådan konto kun BRUG-privilegium, men selv da er det muligt at udskrive en status ("\s"), som indeholder information som MySQL-version, tegnsæt osv. Derudover, hvis et "test"-skema er tilgængeligt, har en sådan bruger mulighed for at skriv til det skema.
Både MySQL Community Server og Percona server har ingen anonyme brugere defineret i 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)
På den anden side er MariaDB åben for anonym adgang uden adgangskode.
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)
Derudover er 'test'-skemaet tilgængeligt - som giver anonyme brugere mulighed for at skrive skrivninger til databasen.
[[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)
Dette udgør en alvorlig trussel og skal løses. Ellers kan det nemt udnyttes til at forsøge at overbelaste serveren med skrivninger.
Data i transitsikkerhed
MySQL Community Server og begge dens gafler understøtter brugen af SSL til at kryptere data i transit. Dette er ekstremt vigtigt for Wide Area Networks, men bør heller ikke overses i et lokalt netværk. SSL kan bruges både på klient- og serversiden. Med hensyn til server-side konfiguration (for at kryptere trafik fra master til slaver, for eksempel), ser det identisk ud over hele linjen. Der er dog en forskel, når det kommer til SSL-kryptering på klientsiden, introduceret i MySQL 5.7. Før 5.7 skulle man generere SSL-nøgler og CA'er og definere dem i konfigurationerne af både server og klient. Sådan ser MariaDBs 10.2 SSL-opsætning ud. I både MySQL Community Server 5.7 og i Percona Server 5.7 (som er baseret på MySQL 5.7) er der ingen grund til at prægenerere nøgler. Det hele foregår automatisk i baggrunden. Alt du skal gøre er at aktivere SSL på din klient ved at indstille den korrekte '--ssl-mode'. For MySQL's CLI-klient er dette ikke engang nødvendigt, da det som standard aktiverer SSL:
[[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
--------------
På den anden side ville MariaDB kræve yderligere konfiguration, da SSL er deaktiveret som standard:
[[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
--------------
Data at Rest-kryptering
Først og fremmest sikkerhedskopier - der er frit tilgængelige sikkerhedskopieringsværktøjer som xtrabackup eller MariaDB Backup (som er en gaffel af xtrabackup). Disse gør det muligt at lave krypterede sikkerhedskopier af alle tre MySQL-varianter, vi diskuterer i dette blogindlæg.
Alle tre varianter understøtter kryptering af den kørende database, men der er forskel på, hvilke stykker data der er krypteret.
MySQL Community Server understøtter kun kryptering af InnoDB tablespaces. Nøgler, der bruges til kryptering, gemmes i filer (hvilket ikke er i overensstemmelse med reglerne - nøgler skal opbevares i en boks - noget som MySQL Enterprise understøtter). Percona Server er baseret på MySQL Community Server, så den understøtter også kryptering af InnoDB tablespaces. For nylig, i Percona Server 5.7.20, blev understøttelse af kryptering af generelle tablespaces (sammenlignet med kun individuelle i tidligere versioner og MySQL Community Edition) tilføjet. Understøttelse af kryptering af binære logfiler blev også tilføjet. Percona Server leveres med et keyring_vault-plugin, som kan bruges til at gemme nøgler i Hashicorp Vault-serveren, hvilket gør Percona Server 5.7.20 kompatibel med regulatoriske krav vedrørende kryptering af data i hvile.
MariaDB 10.2 har mere avanceret data-at-rest kryptering. Ud over tablespace og binær/relælogkryptering har den understøttelse af kryptering af InnoDB-redologs. I øjeblikket er det den mere komplette løsning vedrørende datakryptering.
Revisionslogning
Alle tre MySQL-varianter har understøttelse af revisionslogning. Deres omfang er stort set sammenligneligt:Tilslut og afbryd begivenheder, udførte forespørgsler, tabeller, der er tilgået. Logfilerne indeholder information om, hvilken bruger der deltog i en sådan begivenhed, fra hvilken vært brugeren loggede fra, tidspunktet det skete og lignende oplysninger. Sådanne hændelser kan også logges via syslog og gemmes på en ekstern logserver for at muliggøre loganalyse og parsing.
Datamaskering, SQL Firewall
Alle de diskuterede MySQL-varianter fungerer med en form for værktøj, som ville tillade implementering af datamaskering og ville være i stand til at blokere SQL-trafik baseret på nogle regler. Datamaskering er en metode til at sløre nogle data uden for databasen, men før de når klienten. Et eksempel kunne være kreditkortdata, som er gemt i almindelig tekst i databasen, men når en udvikler ønsker at forespørge på sådanne data, vil hun se 'xxxxxxxx...' i stedet for tal. De værktøjer, vi taler om her, er ProxySQL og MaxScale. MaxScale er et produkt fra MariaDB Corporation og er abonnementsbaseret. ProxySQL er en gratis at bruge databaseproxy. Begge proxyer kan bruges med enhver af MySQL-varianterne.
Det er alt for i dag folkens. For yderligere læsning, tjek disse 10 tips til sikring af dine MySQL- og MariaDB-databaser.