Section author: Vedran Miletić

Konfiguracija sustava za upravljanje bazom podataka MariaDB

MariaDB (Wikipedia) je sustav za upravljanje relacijskom bazom podataka, razvijan od strane zajednice i komercijalno podržan. Razvoj MariaDB-a započet je odvajanjem od MySQL-a izvedenim od strane nekolicine izvornih programera MySQL-a zbog zabrinutosti oko njegove budućnosti povodom akvizicije Suna od strane Oraclea. Prvenstveni cilj stvaranja projekta neovisnog o Oracleu je želja da softvera ostane slobodan i otvorenog koda pod licencom GNU General Public License.

MariaDB zadržava visok nivo kompatibilnosti s MySQL-om, ali proširuje njegovu funkcionalnost tako da nudi i značajke koje MySQL nema. Kao i MySQL, MariaDB je ponuđena i u obliku usluge u oblaku (drugim riječima, sustava koji netko drugi održava) pod imenom SkySQL.

Ime MariaDB dao je autor MySQL-a Michael “Monty” Widenius prema svojoj mlađoj kćeri koja se zove Maria. Slično tome, ime MySQL dao je prema imenu starije kćeri koja se zove My.

Konfiguracija poslužitelja MariaDB

Note

Kako MariaDB zadržava što je moguće veću razinu kompatibilnosti s MySQL-om, uočit ćemo kako se u naredbama ljuske, konfiguracijskim naredbama i nazivima datoteka na mnogo mjesta koristi naziv MySQL umjesto MariaDB. Primjerice, klijent sučelja naredbenog retka dostupan je naredbom mysql, a poslužitelj naredbom mysqld (MySQL daemon).

Nakon instalacije sva konfiguracija poslužitelja MariaDB nalazi se u /etc/mysql. Nama će u nastavku biti zanimljive samo datoteka /etc/mysql/mariadb.cnf i datoteke u direktorijima /etc/mysql/mariadb.conf.d i /etc/mysql/mariadb.conf.d. Razmotrimo za početak sadržaj datoteke /etc/mysql/mariadb.cnf:

# The MariaDB configuration file
#
# The MariaDB/MySQL tools read configuration files in the following order:
# 1. "/etc/mysql/mariadb.cnf" (this file) to set global defaults,
# 2. "/etc/mysql/conf.d/*.cnf" to set global options.
# 3. "/etc/mysql/mariadb.conf.d/*.cnf" to set MariaDB-only options.
# 4. "~/.my.cnf" to set user-specific options.
#
# If the same option is defined multiple times, the last one will apply.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.

#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]

# Import all .cnf files from configuration directory
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/

Uočimo kako gotovo čitav sadržaj datoteke čine komentari i prazni retci, osim odjeljka [client-server] i dvije naredbe !includedir kojima se uključuju konfiguracijske datoteke iz dva već ranije spomenuta direktorija.

U direktoriju /etc/mysql/conf.d/ datoteka mysql.cnf sadrži samo oznaku odjeljka, a datoteka mysqldump.cnf tiče se konfiguracije naredbe mysqldump koja omogućuje pohranjivanje baza u tekstualnom zapisu kao niz SQL upita i koja nam u nastavku neće trebati.

U direktoriju /etc/mysql/mariadb.conf.d/ nalazimo konfiguraciju klijenta (50-client.cnf), svih aplikacija za pristup poslužitelju (50-mysql-clients.cnf), konfiguraciju za sigurno pokretanje u slučaju problema (50-mysqld_safe.cnf) i konfiguraciju poslužitelja (50-server.cnf). Razmtorimo sadržaj posljednje datoteke:

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#
user                    = mysql
pid-file                = /run/mysqld/mysqld.pid
socket                  = /run/mysqld/mysqld.sock
#port                   = 3306
basedir                 = /usr
datadir                 = /var/lib/mysql
tmpdir                  = /tmp
lc-messages-dir         = /usr/share/mysql
#skip-external-locking

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 127.0.0.1

# ...

Uočimo kako su u odjeljku [mysqld] koji se odnosi na poslužitelj MariaDB navedene brojne konfiguracijske naredbe, primjerice:

  • user, kojom se postavlja ime korisnika koji pokreće poslužitelj,

  • pid, kojom se postavlja putanja do datoteke u kojoj je naveden PID procesa poslužitelja,

  • datadir, kojom se navodi putanja do podatkovnog direktorija u kojem se spremaju baze podataka i logovi

  • tmpdir, kojom se navodi putanja do direktorija s privremenim datotekama i

  • lc-messages-dir, kojom se navodi putanja do direktorija s lokalizacijskim datotekama (prijevodima na različite jezike).

Povežimo se klijentom na poslužitelj:

$ sudo mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 52
Server version: 10.3.25-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04

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

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

MariaDB [(none)]>

U ljusci klijenta MariaDB dostupne su nam naredbe jezika SQL i brojne druge specifične za MariaDB. Naredbe jezika SQL su slične među različitim sustavima za upravljanje bazama podataka i njih ćemo koristiti nešto kasnije. Jedna od naredbi specifičnih za MariaDB je SHOW (dokumentacija) koja može prikazati popis autora MariaDB korištenjem parametra AUTHORS (dokumentacija):

SHOW AUTHORS;
+--------------------------------+---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
| Name                           | Location                              | Comment                                                                                                                                 |
+--------------------------------+---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+
| Michael (Monty) Widenius       | Tusby, Finland                        | Lead developer and main author                                                                                                          |
| Sergei Golubchik               | Kerpen, Germany                       | Architect, Full-text search, precision math, plugin framework, merges etc                                                               |
| Igor Babaev                    | Bellevue, USA                         | Optimizer, keycache, core work                                                                                                          |
| Sergey Petrunia                | St. Petersburg, Russia                | Optimizer                                                                                                                               |
| Oleksandr Byelkin              | Lugansk, Ukraine                      | Query Cache (4.0), Subqueries (4.1), Views (5.0)                                                                                        |
(...)
+--------------------------------+---------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------+

Primjenom parametra DATABASES (dokumentacija) prikazat će popis baza podataka koje postoje na poslužitelju:

SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

Naposlijetku, moguće je prikazati globalne varijable ili varijable trenutne sesije parametrom VARIABLES (dokumentacija). U slučaju da želimo prikazati globalnu varijablu, dodajemo i parametar GLOBAL, a kod navođenja imena varijable u obliku znakovnog niza koristimo standardni SQL operator LIKE (dokumentacija). MariaDB podržava jednostruke i dvostruke navodnike kod navođenja znakovnih nizova. Varijabla koja nas zanima je have_ssl pa je naredba oblika:

SHOW GLOBAL VARIABLES LIKE 'have_ssl';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_ssl      | DISABLED |
+---------------+----------+

Uočimo kako MariaDB trenutno ne koristi SSL/TLS za šifriranje komunikacije klijenta i poslužitelja, što ćemo promijeniti u nastavku.

Sigurnosne značajke

MariaDB podržava šifriranje:

  • podataka u prijenosu (engl. data in transit), odnosno upita poslanih od klijenta do poslužitelja i njihovih rezultata poslanih od poslužitelja do klijenta te

  • podataka na odmoru (engl. data at rest), odnosno spremljenih sadržaja baza podataka i binarnih logova poslužitelja.

Šifriranje podataka u prijenosu

Postupak stvaranja ključeva i X.509 certifikata koje će MariaDB koristiti istovjetan je ranije opisanom.

Nakon stvaranja privatnog ključa i X.509 certifikata uključit ćemo njihovo korištenje konfiguracijskim naredbama:

  • ssl_cert (dokumentacija), kojom ćemo navesti X.509 certifikat u formatu PEM

  • ssl_key (dokumentacija), kojom ćemo navesti privatni ključ u formatu PEM

  • ssl_ca (dokumentacija), kojom ćemo, u slučaju korištenja samopotpisanih certifikata, navesti i certifikat autoriteta certifikata koji ga je potpisao

Više informacija o ovim konfiguracijskim naredbama može se naći u službenoj dokumentaciji.

MariaDB ne preporuča modificiranje postojećih konfiguracijskih datoteka, već dodavanje novih. U direktoriju /etc/mysql/conf.d/ korištenjem uređivača teksta GNU nano ili bilo kojeg drugog stvorimo datoteku 99-ssl.conf:

$ sudo nano /etc/mysql/conf.d/99-ssl.conf

U njoj postavimo željene postavke:

[mariadb]

ssl_cert = /certs/server-cert.pem
ssl_key = /certs/server-key.pem
ssl_ca = /certs/ca-cert.pem

Umjesto odjeljka [mariadb] također smo konfiguracijske naredbe mogli staviti i u odjeljak [server] ili [mysqld] koje poslužitelj čita kod pokretanja (detaljnije objašnjenje pojedinih odjeljaka moguće je naći u dijelu službene dokumentacije Configuring MariaDB with Option Files).

Pokrenimo ponovno poslužitelj kako bi učitao nove postavke:

$ sudo systemctl restart mariadb

Kako bismo se uvjerili da je TLS uključen, povežimo se klijentom (naredba mariadb) kao i ranije pa iskoristimo naredbu SHOW na način:

SHOW GLOBAL VARIABLES LIKE 'have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl      | YES   |
+---------------+-------+

Slično kao kod drugih softvera koji koriste TLS, možemo navesti dodatne postavke šifriranja. Neke od korisnih naredbi su:

  • require_secure_transport (dokumentacija), postavljanjem koje na on ćemo tražiti da se svako povezivanje klijenta sa poslužiteljem događa uz korištenje TLS-a (zadana vrijednost je off)

  • ssl_cipher (dokumentacija), kojom navodimo popis šifrarnika koji će se koristiti

  • ssl_capath (dokumentacija), kojom navodimo putanju do direktorija s certifikatima autoriteta certifikata

  • tls_version (dokumentacija), kojom navodimo verziju TLS-a koji će se koristiti

Note

Za generiranje adekvatnih sigurnosnih postavki možemo ponovno iskoristiti Mozillin generator SSL konfiguracije i kao poslužiteljski softver odabrati MySQL.

Šifriranje podataka na odmoru

Privilegije korisnika