MariaDB
 sql >> Baza danych >  >> RDS >> MariaDB

Podstawy szyfrowania bazy danych serwera MariaDB

Szyfrowanie to jedna z najważniejszych funkcji bezpieczeństwa, która zapewnia maksymalne bezpieczeństwo danych. W zależności od danych, z którymi się stykasz, nie zawsze jest to konieczne, ale powinieneś przynajmniej rozważyć to jako ulepszenie bezpieczeństwa w Twojej organizacji i tak naprawdę zaleca się unikanie kradzieży danych lub nieautoryzowanego dostępu.

W tym blogu opiszemy dwa podstawowe typy szyfrowania i sposób ich konfiguracji na serwerze MariaDB.

Co to jest szyfrowanie danych?

Istnieją dwa podstawowe typy szyfrowania danych:w spoczynku i podczas przesyłania. Zobaczmy, co mają na myśli.

Szyfrowanie danych w spoczynku

Dane przechowywane w systemie są znane jako dane w spoczynku. Szyfrowanie tych danych polega na użyciu algorytmu konwertującego tekst lub kod na nieczytelny. Aby zdekodować zaszyfrowane dane, musisz mieć klucz szyfrowania.

Szyfrowanie całej bazy danych należy wykonywać ostrożnie, ponieważ może to mieć poważny wpływ na wydajność. Dlatego mądrze jest szyfrować tylko pojedyncze pola lub tabele.

Szyfrowanie danych w spoczynku chroni dane przed fizyczną kradzieżą dysków twardych lub nieautoryzowanym dostępem do przechowywania plików. Szyfrowanie to jest również zgodne z przepisami dotyczącymi bezpieczeństwa danych, zwłaszcza jeśli w systemie plików znajdują się dane finansowe lub zdrowotne.

Szyfrowanie danych podczas przesyłania

Dane przesyłane lub przemieszczane między transakcjami są określane jako dane w drodze. Dobrym przykładem tego typu danych są dane przemieszczające się między serwerem a klientem podczas przeglądania stron internetowych.

Ponieważ jest zawsze w ruchu, musi być chroniony odpowiednim szyfrowaniem, aby uniknąć kradzieży lub zmiany danych, zanim dotrą do miejsca przeznaczenia.

Idealną sytuacją do ochrony przesyłanych danych jest zaszyfrowanie danych przed ich przeniesieniem i odszyfrowanie dopiero po dotarciu do miejsca docelowego.

Szyfrowanie danych w spoczynku MariaDB

Szyfrowanie tabel i obszarów tabel zostało dodane w MariaDB od wersji 10.1 i obsługuje szyfrowanie silników pamięci masowej XtraDB, InnoDB i Aria, a także dzienników binarnych.

Możesz wybrać różne sposoby szyfrowania:

  • Wszystkie tabele
  • Poszczególne tabele
  • Wszystko oprócz pojedynczych tabel

Zgodnie z dokumentacją stosowanie szyfrowania wiąże się z obciążeniem wynoszącym około 3-5%, dlatego ważne jest, aby mieć środowisko testowe, aby je podkreślić i zobaczyć, jak reaguje, aby uniknąć problemów w produkcji.

Jak skonfigurować szyfrowanie danych w spoczynku w MariaDB

Sprawdźmy istniejącą tabelę „miasto” w bazie danych MariaDB:

$ strings city.ibd |head

infimum

supremum

infimum

supremum

3ABW

3KHM

infimum

supremum

Kabul                              AFGKabol

Qandahar                           AFGQandahar

Jak widać, możesz bez problemu odczytać stamtąd dane, używając na przykład polecenia strings Linux. Zobaczmy teraz, jak to zaszyfrować.

Wygeneruj klucze szyfrowania za pomocą polecenia openssl rand:

$ mkdir -p /etc/mysql/encryption

$ for i in {1..4}; do openssl rand -hex 32 >> /etc/mysql/encryption/keyfile;  done;

Edytuj wygenerowany plik /etc/mysql/encryption/keyfile i dodaj identyfikatory kluczy, do których będzie się odwoływać podczas tworzenia zaszyfrowanych tabel. Format powinien wyglądać następująco:

<encryption_key_id1>;<hex-encoded_encryption_key1>

<encryption_key_id2>;<hex-encoded_encryption_key2>

Możesz go edytować za pomocą polecenia sed linux w ten sposób:

$ for i in {1..4}; do sed -i -e "$i s/^/$i;/" keyfile; done

Plik powinien wyglądać mniej więcej tak:

$ cat /etc/mysql/encryption/keyfile

1;f237fe72e16206c0b0f6f43c3b3f4accc242564d77f5fe17bb621de388c193af

2;0c0819a10fb366a5ea657a71759ee6a950ae8f25a5ba7400a91f59b63683edc5

3;ac9ea3a839596dbf52492d9ab6b180bf11a35f44995b2ed752c370d920a10169

4;72afc936e16a8df05cf994c7902e588de0d11ca7301f9715d00930aa7d5ff8ab

Teraz wygeneruj losowe hasło za pomocą podobnego polecenia openssl, które widziałeś wcześniej:

$ openssl rand -hex 128 > /etc/mysql/encryption/keyfile.key

Przed przejściem do następnego kroku ważne jest, aby poznać następujące szczegóły dotyczące szyfrowania pliku klucza:

  • Jedynym algorytmem, który MariaDB obecnie obsługuje do szyfrowania pliku klucza, jest tryb szyfrowania bloków (CBC) Advanced Encryption Standard (AES).
  • Rozmiar klucza szyfrowania może wynosić 128-bitów, 192-bitów lub 256-bitów.
  • Klucz szyfrowania jest tworzony na podstawie skrótu SHA-1 hasła szyfrowania.
  • Hasło szyfrowania ma maksymalną długość 256 znaków.

Teraz, aby zaszyfrować plik klucza za pomocą polecenia openssl enc, uruchom następujące polecenie:

$ openssl enc -aes-256-cbc -md sha1 -pass file:/etc/mysql/encryption/keyfile.key -in /etc/mysql/encryption/keyfile -out /etc/mysql/encryption/keyfile.enc

Na koniec musisz dodać następujące parametry do pliku konfiguracyjnego my.cnf (znajdującego się w /etc/ w systemie operacyjnym opartym na RedHat lub /etc/mysql/ w systemie operacyjnym opartym na Debianie):

[mysqld]

…

#################### DATABASE ENCRYPTION ####################

plugin_load_add = file_key_management

file_key_management_filename = /etc/mysql/encryption/keyfile.enc

file_key_management_filekey = FILE:/etc/mysql/encryption/keyfile.key

file_key_management_encryption_algorithm = aes_cbc

encrypt_binlog = 1



innodb_encrypt_tables = ON

innodb_encrypt_log = ON

innodb_encryption_threads = 4

innodb_encryption_rotate_key_age = 0 

…

I ponownie uruchom usługę MariaDB, aby wprowadzić zmiany:

$ systemctl restart mariadb

W tym momencie wszystko jest gotowe do użycia funkcji szyfrowania. Zaszyfrujmy tę samą tabelę, którą pokazaliśmy wcześniej, „miasto”. W tym celu należy użyć instrukcji ALTER TABLE ustawiając parametr ENCRYPTED na TAK:

MariaDB [world]> ALTER TABLE city ENCRYPTED=YES;

Query OK, 0 rows affected (0.483 sec)

Records: 0  Duplicates: 0  Warnings: 0

Teraz, jeśli spróbujesz uzyskać dostęp do tabeli bezpośrednio z systemu plików, zobaczysz coś takiego:

$ strings city.ibd |head

PU%O

!ybN)b

9,{9WB4

T3uG:

?oiN

,35sz

8g)Q

o(o

q_A1

k=-w

Jak widać, tabela jest nieczytelna. Możesz również określić identyfikator klucza szyfrowania, dodając parametr ENCRYPTION_KEY_ID = w poleceniu MySQL, gdzie jest numerem ID z pliku klucza utworzonego wcześniej.

Nowe tabele będą domyślnie szyfrowane, ponieważ ustawimy parametr innodb_encrypt_tables na ON w pliku konfiguracyjnym my.cnf.

Szyfrowanie przesyłanych danych MariaDB

MariaDB umożliwia szyfrowanie przesyłanych danych między serwerem a klientami przy użyciu protokołu Transport Layer Security (TLS), znanego wcześniej jako Secure Socket Layer lub SSL.

Przede wszystkim musisz upewnić się, że serwer MariaDB został skompilowany z obsługą TLS. Możesz to sprawdzić, uruchamiając następującą instrukcję SHOW GLOBAL VARIABLES:

MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'version_ssl_library';

+---------------------+----------------------------+

| Variable_name       | Value                      |

+---------------------+----------------------------+

| version_ssl_library | OpenSSL 1.1.1  11 Sep 2018 |

+---------------------+----------------------------+

1 row in set (0.001 sec)

I sprawdź, czy nie jest obecnie używany, używając instrukcji SHOW VARIABLES:

MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';

+---------------------+----------------------------+

| Variable_name       | Value                      |

+---------------------+----------------------------+

| have_openssl        | YES                        |

| have_ssl            | DISABLED                   |

| ssl_ca              |                            |

| ssl_capath          |                            |

| ssl_cert            |                            |

| ssl_cipher          |                            |

| ssl_crl             |                            |

| ssl_crlpath         |                            |

| ssl_key             |                            |

| version_ssl_library | OpenSSL 1.1.1  11 Sep 2018 |

+---------------------+----------------------------+

10 rows in set (0.001 sec)

Możesz również zweryfikować status SSL za pomocą polecenia status MariaDB:

MariaDB [(none)]> status

--------------

mysql  Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Connection id: 22

Current database:

Current user: [email protected]

SSL: Not in use

Current pager: stdout

Using outfile: ''

Using delimiter: ;

Server: MariaDB

Server version: 10.4.13-MariaDB-1:10.4.13+maria~bionic-log mariadb.org binary distribution

Protocol version: 10

Connection: Localhost via UNIX socket

Server characterset: latin1

Db     characterset: latin1

Client characterset: utf8

Conn.  characterset: utf8

UNIX socket: /var/lib/mysql/mysql.sock

Uptime: 4 hours 28 min 25 sec

Threads: 11  Questions: 111668  Slow queries: 0  Opens: 92  Flush tables: 1  Open tables: 85  Queries per second avg: 6.933

--------------

Jak skonfigurować szyfrowanie danych podczas przesyłania w MariaDB

Stwórzmy katalog certs do przechowywania wszystkich certyfikatów:

$ mkdir -p /etc/mysql/certs

Teraz wygenerujmy certyfikaty CA, które zostaną skonfigurowane do szyfrowania połączenia:

$ openssl genrsa 2048 > ca-key.pem

$ openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem

To ostatnie polecenie poprosi o uzupełnienie następujących informacji:

Country Name (2 letter code) [AU]:

State or Province Name (full name) [Some-State]:

Locality Name (eg, city) []:

Organization Name (eg, company) [Internet Widgits Pty Ltd]:

Organizational Unit Name (eg, section) []:

Common Name (e.g. server FQDN or YOUR name) []:

Email Address []:

Teraz musisz wygenerować certyfikaty serwera:

$ openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem

To polecenie poprosi Cię o wypełnienie tych samych informacji, co poprzednio, oraz opcjonalne hasło certyfikatu.

$ openssl rsa -in server-key.pem -out server-key.pem

$ openssl x509 -req -in server-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

I na koniec musisz wygenerować certyfikaty klienta:

$ openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -out client-req.pem

Poprosi Cię to również o uzupełnienie informacji i opcjonalne hasło certyfikatu.

$ openssl rsa -in client-key.pem -out client-key.pem

$ openssl x509 -req -in client-req.pem -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

Upewnij się, że używasz innej nazwy pospolitej na każdym certyfikacie, w przeciwnym razie nie zadziała i otrzymasz wiadomość typu:

ERROR 2026 (HY000): SSL connection error: self signed certificate

W tej chwili będziesz mieć coś takiego:

$ ls /etc/mysql/certs/

ca-cert.pem  ca-key.pem  client-cert.pem  client-key.pem  client-req.pem  server-cert.pem  server-key.pem  server-req.pem

I możesz zweryfikować certyfikaty za pomocą następującego polecenia:

$ openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem

server-cert.pem: OK

client-cert.pem: OK

Więc teraz skonfigurujmy go w pliku konfiguracyjnym my.cnf (znajdującym się w /etc/ w systemie operacyjnym opartym na RedHat lub /etc/mysql/ w systemie operacyjnym opartym na Debianie):

[mysqld]

ssl_ca=/etc/mysql/certs/ca-cert.pem

ssl_cert=/etc/mysql/certs/server-cert.pem

ssl_key=/etc/mysql/certs/server-key.pem



[client-mariadb]

ssl_ca =/etc/mysql/certs/ca-cert.pem

ssl_cert=/etc/mysql/certs/client-cert.pem

ssl_key=/etc/mysql/certs/client-key.pem

Upewnij się, że dodajesz go w odpowiedniej sekcji (mysqld i client-mariadb).

Zmień właściciela certyfikatu i uruchom ponownie usługę bazy danych:

$ chown mysql.mysql /etc/mysql/certs/

$ systemctl restart mariadb

Po tym, jeśli spojrzysz na wyjście POKAŻ ZMIENNE, powinieneś mieć to:

MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';

+---------------------+----------------------------------+

| Variable_name       | Value                            |

+---------------------+----------------------------------+

| have_openssl        | YES                              |

| have_ssl            | YES                              |

| ssl_ca              | /etc/mysql/certs/ca-cert.pem     |

| ssl_capath          |                                  |

| ssl_cert            | /etc/mysql/certs/server-cert.pem |

| ssl_cipher          |                                  |

| ssl_crl             |                                  |

| ssl_crlpath         |                                  |

| ssl_key             | /etc/mysql/certs/server-key.pem  |

| version_ssl_library | OpenSSL 1.1.1  11 Sep 2018       |

+---------------------+----------------------------------+

10 rows in set (0.001 sec)

Teraz utwórzmy użytkownika z parametrem REQUIRE SSL, aby go używać:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 's9s'@'%' IDENTIFIED BY 'root123' REQUIRE SSL;

Query OK, 0 rows affected (0.005 sec)

Jeśli używasz tego użytkownika, aby uzyskać dostęp do bazy danych i sprawdzisz polecenie statusu, zobaczysz używany SSL:

MariaDB [(none)]> status

--------------

mysql  Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Connection id: 15

Current database:

Current user: [email protected]

SSL: Cipher in use is TLS_AES_256_GCM_SHA384

Current pager: stdout

Using outfile: ''

Using delimiter: ;

Server: MariaDB

Server version: 10.4.13-MariaDB-1:10.4.13+maria~bionic-log mariadb.org binary distribution

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: 16 sec

Threads: 11  Questions: 136  Slow queries: 0  Opens: 17  Flush tables: 1  Open tables: 11  Queries per second avg: 8.500

--------------

Jak włączyć szyfrowanie SSL za pomocą ClusterControl

Innym, a nawet prostszym sposobem włączenia SSL w bazie danych MariaDB jest użycie ClusterControl. Założymy, że masz zainstalowany program ClusterControl i zarządzasz za jego pomocą swoją bazą danych MariaDB, więc przejdź do ClusterControl -> Wybierz swój klaster MariaDB -> Bezpieczeństwo -> Szyfrowanie SSL -> Włącz.

I to wszystko, będziesz mieć włączone szyfrowanie SSL w bazie danych MariaDB bez żadnego ręcznego zadania.

Ograniczenia szyfrowania w spoczynku w MariaDB

Istnieją pewne ograniczenia związane z szyfrowaniem spoczynkowym MariaDB, które należy wziąć pod uwagę:

  • Metadane (na przykład pliki .frm) i dane wysyłane do klienta nie są szyfrowane.
  • Tylko serwer MariaDB wie, jak odszyfrować dane, w szczególności
    • mysqlbinlog może odczytywać zaszyfrowane logi binarne tylko wtedy, gdy używane jest --read-from-remote-server.
    • Percona XtraBackup nie może tworzyć kopii zapasowych instancji korzystających z zaszyfrowanej bazy danych InnoDB. Jednak Mariabackup może tworzyć kopie zapasowe zaszyfrowanych instancji.
  • Dyskowa pamięć podręczna Galera nie jest szyfrowana w społecznościowej wersji MariaDB Server, jednak ten plik jest zaszyfrowany w MariaDB Enterprise Server 10.4.
  • Wtyczka Audit nie może tworzyć zaszyfrowanych danych wyjściowych. Wyślij go do syslog i zamiast tego skonfiguruj ochronę.
  • Ogólny dziennik zapytań oparty na plikach i dziennik powolnych zapytań nie mogą być szyfrowane.
  • Dziennik Aria nie jest zaszyfrowany. Dotyczy to tylko nietymczasowych tabel Aria.
  • Dziennik błędów MariaDB nie jest zaszyfrowany. Dziennik błędów może w niektórych przypadkach zawierać tekst zapytania i dane, w tym awarie, niepowodzenia asercji i przypadki, w których dane wyjściowe monitora InnoDB/XtraDB zapisują się w dzienniku, aby pomóc w debugowaniu. W razie potrzeby można go również wysłać do sysloga.

Wnioski

Ochrona danych w drodze jest tak samo ważna, jak ochrona danych w spoczynku, i nawet jeśli nie jest to konieczne w Twojej organizacji, powinieneś rozważyć jej zastosowanie, ponieważ może pomóc Ci uniknąć danych kradzież lub nieautoryzowany dostęp.

MariaDB ma dość łatwy sposób na zaimplementowanie go, wykonując czynności wymienione wcześniej, ale na pewno jeszcze łatwiej jest korzystać z ClusterControl.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie silnika pamięci masowej Aria z serwerem MariaDB

  2. ClusterControl:wprowadzenie do nowego monitora zapytań

  3. Porównanie rozwiązań przełączania awaryjnego DBaaS z ręcznymi konfiguracjami odzyskiwania

  4. Jak osiągnąć zgodność z PCI dla MySQL i MariaDB za pomocą ClusterControl — powtórka

  5. Jak działa UPPER() w MariaDB