Kako koristiti MySQL bez lozinke (i rizika za sigurnost)

Kako koristiti MySQL bez lozinke (i rizika za sigurnost)

Kažu da je najbolja lozinka ona koju ne treba pamtiti. U slučaju MySQL-a, to je moguće zahvaljujući dodatku auth_socket i njegovoj verziji za MariaDB — unix_socket.

Oba ova dodatka nisu novost, o njima se mnogo razgovaralo u ovom blogu, na primjer u članku o tome, kako mijenjati lozinke u MySQL 5.7, koristeći dodatak auth_socket. Međutim, istražujući što je novo u MariaDB 10.4, otkrio sam da se unix_socket sada postavlja kao zadani i predstavlja jednu od metoda autentifikacije ("jednu od", jer u MariaDB 10.4, jednom korisniku dostupno je više od jednog dodatka za autentifikaciju, što se objašnjava u dokumentu "Autentifikacija" od MariaDB 10.04).

Kao što sam već rekao, to nije nova informacija, a kada instalirate MySQL koristeći podržane .deb pakete od strane tima Debian, korisnik s root pravima se stvara za autentifikaciju preko soketa. Ovo važi i za MySQL i za MariaDB.

root@app:~# apt-cache show mysql-server-5.7 | grep -i maintainers
Original-Maintainer: Debian MySQL Održavatelji <pkg-mysql-maint@lists.alioth.debian.org>
Original-Maintainer: Debian MySQL Održavatelji <<a href="mailto:pkg-mysql-maint@lists.alioth.debian.org"&gt;pkg-mysql-maint@lists.alioth.debian.org</a>>

Sa Debian paketima za MySQL, root korisnik se autentificira na sljedeći način:

root@app:~# whoami
root=
root@app:~# mysql
Dobrodošli u MySQL monitor. Komande se završavaju sa ; ili g.
Vaš MySQL ID veze je 4
Verzija servera: 5.7.27-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2019, Oracle i/ili njeni podupiratelji. Sva prava zadržana.
Oracle je registrirani zaštitni znak Oracle Corporation i/ili njenih podupiratelja. Druga imena mogu biti zaštitni znakovi njihovih respektivnih
vlasnika.

Upišite 'help;' ili 'h' za pomoć. Upišite 'c' za brisanje trenutne ulazne izjave.

mysql> select user, host, plugin, authentication_string from mysql.user where user = 'root';
+------+-----------+-------------+-----------------------+
| user | host      | plugin | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket |                     |
+------+-----------+-------------+-----------------------+
1 row in set (0.01 sec)

Isto važi i za .deb paket za MariaDB:

10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04

MariaDB [(none)]> show grants;
+------------------------------------------------------------------------------------------------+
| Grantovi za root@localhost                                                                     |
+------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED VIA unix_socket WITH GRANT OPTION |
| GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION                                   |
+------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

.deb paketi iz službenog Percona repozitorija također postavljaju autentifikaciju korisnika s root pravima na auth-socket i za Percona Server. Uzmimo primjer sa Percona Server for MySQL 8.0.16-7 i Ubuntu 16.04:

root@app:~# whoami
root
root@app:~# mysql
Dobrodošli u MySQL monitor. Komande završavaju s ; ili g.
Vaša MySQL veza ID je 9
Verzija servera: 8.0.16-7 Percona Server (GPL), Izdanje '7', Revizija '613e312'

Autorska prava (c) 2009-2019 Percona LLC i/ili njezine podružnice
Autorska prava (c) 2000, 2019, Oracle i/ili njezine podružnice. Sva prava pridržana.
Oracle je registrovan zaštitni znak Oracle Corporation i/ili njezinih
podružnica. Ostali nazivi mogu biti zaštitni znakovi njihovih
vlasnika.

Upišite 'help;' ili 'h' za pomoć. Upišite 'c' za brisanje trenutne ulazne izjave.

mysql> select user, host, plugin, authentication_string from mysql.user where user ='root';
+------+-----------+-------------+-----------------------+
| user | host      | plugin | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket |                       |
+------+-----------+-------------+-----------------------+
1 red u skupu (0.00 sec)

Pa gdje je tu čarolija? Plugin provjerava da li korisnik Linux odgovara korisniku MySQL, koristeći socket opciju SO_PEERCRED — kako bi prikupio informacije o korisniku koji pokreće klijentski program. Tako se plugin može koristiti samo na sistemima koji podržavaju opciju SO_PEERCRED, poput istog Linuxa. Socket opcija SO_PEERCRED omogućuje da se sazna uid povezan s socketom procesa. A nakon toga dobiva povezano s tim uid ime korisnika.

Evo primjera s korisnikom «vagrant»:

vagrant@mysql1:~$ whoami
vagrant
vagrant@mysql1:~$ mysql
GREŠKA 1698 (28000): Pristup odbijen za korisnika 'vagrant'@'localhost'

Budući da u MySQL nema korisnika «vagrant», pristup nam je odbijen. Kreirajmo tog korisnika i ponovimo pokušaj:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket;
Upit OK, 0 redova pogođeno (0.00 sec)

vagrant@mysql1:~$ mysql
Dobrodošli u MariaDB monitor. Komande završavaju s ; ili g.
Vaša MariaDB veza ID je 45
Verzija servera: 10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04
Autorska prava (c) 2000, 2018, Oracle, MariaDB Corporation Ab i drugi.
Upišite 'help;' ili 'h' za pomoć. Upišite 'c' za brisanje trenutne ulazne izjave.

MariaDB [(none)]> show grants;
+---------------------------------------------------------------------------------+
| Grants for vagrant@localhost                                                     |
+---------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket |
+---------------------------------------------------------------------------------+
1 red u skupu (0.00 sec)

Uspjelo je!

Pa, što je s non-Debian distribucijom, gdje to nije predviđeno po defaultu? Pokušajmo Percona Server for MySQL 8, instaliran na CentOS 7:

mysql> show variables like '%version%comment';
+-----------------+---------------------------------------------------+
| Variable_name   | Value                                             |
+-----------------+---------------------------------------------------+
| version_comment | Percona Server (GPL), Izdanje 7, Revizija 613e312 |
+-----------------+---------------------------------------------------+
1 red u skupu (0.01 sec)

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
GREŠKA 1524 (HY000): Plugin 'auth_socket' nije učitan

Iste. Što je nedostajalo? Plugin nije učitan:

mysql> pager grep socket
PAGER postavljen na 'grep socket'
mysql> show plugins;
47 redaka u skupu (0.00 sek)

Dodajmo plugin u proces:

mysql> nopager
PAGER postavljen na stdout
mysql> INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
Upit OK, 0 redaka pogođeno (0.00 sek)

mysql> pager grep socket; show plugins;
PAGER postavljen na 'grep socket'
| auth_socket                     | AKTIVAN | AUTENTIKACIJA | auth_socket.so | GPL    |
48 redaka u skupu (0.00 sek)

Sada imamo sve što nam treba. Pokušajmo još jednom:

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
Upit OK, 0 redaka pogođeno (0.01 sek)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'percona'@'localhost';
Upit OK, 0 redaka pogođeno (0.01 sek)

Sada se možete prijaviti s korisničkim imenom 'percona'.

[percona@ip-192-168-1-111 ~]$ whoami
percona
[percona@ip-192-168-1-111 ~]$ mysql -upercona
Dobrodošli u MySQL monitor. Komande završavaju sa ; ili g.
Vaš MySQL identifikacijski broj je 19
Verzija servera: 8.0.16-7 Percona Server (GPL), Izdanje 7, Revizija 613e312

Copyright (c) 2009-2019 Percona LLC i/ili njezinih podružnica
Copyright (c) 2000, 2019, Oracle i/ili njezinih podružnica. Sva prava pridržana.

Oracle je registrirani zaštitni znak Oracle Corporation i/ili njegovih
podružnica. Druga imena mogu biti zaštitni znakovi njihovih odgovarajućih
vlasnika.

Upišite 'help;' ili 'h' za pomoć. Upišite 'c' za brisanje trenutne ulazne izjave.

mysql> select user, host, plugin, authentication_string from mysql.user where user ='percona';
+---------+-----------+-------------+-----------------------+
| user    | host      | plugin      | authentication_string |
+---------+-----------+-------------+-----------------------+
| percona | localhost | auth_socket |                       |
+---------+-----------+-------------+-----------------------+
1 redak u skupu (0.00 sek)

I opet je uspjelo!

Pitanje: Hoće li biti moguće prijaviti se s istim korisničkim imenom percona, ali s drugog korisnika?

[percona@ip-192-168-1-111 ~]$ logout
[root@ip-192-168-1-111 ~]# mysql -upercona
GREŠKA 1698 (28000): Pristup odbijen za korisnika 'percona'@'localhost'

Ne, neće biti moguće.

Izvještaj

MySQL je prilično fleksibilna u nekoliko aspekata, jedan od njih je metoda autentifikacije. Kao što se može vidjeti iz ovog postova, pristup se može dobiti bez lozinki, na temelju korisnika operativnog sustava. Ovo može biti korisno u određenim scenarijima, a jedan od njih je kada se migrira s RDS/Aurora na običan MySQL, koristeći autentifikaciju baze podataka IAM, kako bi se i dalje dobio pristup, ali bez lozinki.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster