Sådan bruger du MySQL uden password (og sikkerhedsrisici)

Sådan bruger du MySQL uden password (og sikkerhedsrisici)

Man siger, at det bedste password er det, man ikke behøver at huske. Dette er muligt med MySQL takket være plugin'et auth_socket og dets version til MariaDB — unix_socket.

Begge disse plugins er ikke nye, de er blevet nævnt mange gange i denne blog, for eksempel i artiklen om, hvordan man ændrer passwords i MySQL 5.7 ved hjælp af plugin'et auth_socket. Men da jeg kiggede på, hvad der var nyt i MariaDB 10.4, opdagede jeg, at unix_socket nu er standard og er en af autentifikationsmetoderne ("en af", fordi der i MariaDB 10.4 er mere end én plugin til autentifikation for en bruger, hvilket forklares i dokumentet "Autentifikation" fra MariaDB 10.04).

Som jeg allerede har nævnt, er det ikke nye oplysninger, og når man installerer MySQL ved hjælp af de Debian-støttede .deb pakker, oprettes brugeren med root-rettigheder til autentifikation via socket. Dette gælder både for MySQL og MariaDB.

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

Med Debian-pakkerne til MySQL autentificeres root-brugeren som følger:

root@app:~# whoami
root=
root@app:~# mysql
Velkommen til MySQL-monitoren. Kommandoer afsluttes med ; eller g.
Din MySQL-forbindelses-id er 4
Serverversion: 5.7.27-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2019, Oracle og/eller dets tilknyttede selskaber. Alle rettigheder forbeholdes.
Oracle er et registreret varemærke tilhørende Oracle Corporation og/eller dets
tilknyttede selskaber. Andre navne kan være varemærker for deres respektive
ejere.

Skriv 'help;' eller 'h' for hjælp. Skriv 'c' for at rense den aktuelle indtastede erklæring.

mysql> select user, host, plugin, authentication_string from mysql.user where user = 'root';
+------+-----------+-------------+-----------------------+
| user | host      | plugin | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket |                       |
+------+-----------+-------------+-----------------------+
1 række i resultatsættet (0.01 sek)

Det samme gælder for .deb-pakken til MariaDB:

10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04

MariaDB [(none)]> show grants;
+------------------------------------------------------------------------------------------------+
| Grants for 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 rækker i resultatsættet (0.00 sek)

.deb-pakker fra det officielle Percona-repository konfigurerer også autentifikationen for brugeren med root-rettigheder til auth-socket til Percona Server. Her er et eksempel med Percona Server for MySQL 8.0.16-7 og Ubuntu 16.04:

root@app:~# whoami
root
root@app:~# mysql
Velkommen til MySQL-monitoren. Kommandoer slutter med ; eller g.
Dit MySQL-forbindelses-id er 9
Serverversion: 8.0.16-7 Percona Server (GPL), Udgivelse '7', Revision '613e312'

Copyright (c) 2009-2019 Percona LLC og/eller dets tilknyttede selskaber
Copyright (c) 2000, 2019, Oracle og/eller dets tilknyttede selskaber. Alle rettigheder forbeholdes.
Oracle er et registreret varemærke tilhørende Oracle Corporation og/eller dets
tilknyttede selskaber. Andre navne kan være varemærker tilhørende deres respektive
ejere.

Skriv 'help;' eller 'h' for hjælp. Skriv 'c' for at rydde den aktuelle indtastningssætning.

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.00 sec)

Men hvad er magien? Plugin'et kontrollerer, at Linux-brugeren svarer til MySQL-brugeren ved at bruge socket-optionen SO_PEERCRED — for at indsamle oplysninger om brugeren, der kører klientprogrammet. Dermed kan plugin'et kun bruges på systemer, der understøtter SO_PEERCRED-optionen, som Linux. Socket-optionen SO_PEERCRED gør det muligt at finde uid tilknyttet socket-processen. Herefter får det tilknyttede uid brugernavnet.

Lad os tage et eksempel med brugeren «vagrant»:

vagrant@mysql1:~$ whoami
vagrant
vagrant@mysql1:~$ mysql
FEJL 1698 (28000): Adgang nægtet for bruger 'vagrant'@'localhost'

Da der ikke findes en bruger «vagrant» i MySQL, er adgangen nægtet. Lad os oprette den bruger og prøve igen:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket;
Spørgsmål OK, 0 rækker berørt (0.00 sek)

vagrant@mysql1:~$ mysql
Velkommen til MariaDB-monitoren. Kommandoer slutter med ; eller g.
Dit MariaDB-forbindelses-id er 45
Serverversion: 10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab og andre.
Skriv 'help;' eller 'h' for hjælp. Skriv 'c' for at rydde den aktuelle indtastningssætning.

MariaDB [(none)]> show grants;
+---------------------------------------------------------------------------------+
| Grants for vagrant@localhost                                                    |
+---------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket |
+---------------------------------------------------------------------------------+
1 row in set (0.00 sek)

Det lykkedes!

Hvad så med ikke-Debian distributioner, hvor dette ikke er inkluderet som standard? Lad os prøve Percona Server for MySQL 8, installeret på CentOS 7:

mysql> show variables like '%version%comment';
+-----------------+---------------------------------------------------+
| Variable_name   | Value                                   |
+-----------------+---------------------------------------------------+
| version_comment | Percona Server (GPL), Udgivelse 7, Revision 613e312 |
+-----------------+---------------------------------------------------+
1 row in set (0.01 sek)

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
FEJL 1524 (HY000): Plugin 'auth_socket' er ikke indlæst

Ødelæggelse. Hvad manglede der? Plugin er ikke indlæst:

mysql> pager grep socket
PAGER er sat til 'grep socket'
mysql> show plugins;
47 rækker i sæt (0,00 sek)

Lad os tilføje et plugin til processen:

mysql> nopager
PAGER er sat til stdout
mysql> INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
Spørgsmål OK, 0 rækker påvirket (0,00 sek)

mysql> pager grep socket; show plugins;
PAGER er sat til 'grep socket'
| auth_socket                     | AKTIV | AUTHENTICATION | auth_socket.so | GPL     |
48 rækker i sæt (0,00 sek)

Nu har vi alt hvad vi behøver. Lad os prøve en gang til:

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
Spørgsmål OK, 0 rækker påvirket (0,01 sek)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'percona'@'localhost';
Spørgsmål OK, 0 rækker påvirket (0,01 sek)

Nu kan man logge ind med brugernavnet «percona».

[percona@ip-192-168-1-111 ~]$ whoami
percona
[percona@ip-192-168-1-111 ~]$ mysql -upercona
Velkommen til MySQL monitor. Kommandoer slutter med ; eller g.
Din MySQL forbindelses-id er 19
Server version: 8.0.16-7 Percona Server (GPL), Udgivelse 7, Revision 613e312

Ophavsret (c) 2009-2019 Percona LLC og/eller dets tilknyttede selskaber
Ophavsret (c) 2000, 2019, Oracle og/eller dets tilknyttede selskaber. Alle rettigheder forbeholdes.

Oracle er et registreret varemærke tilhørende Oracle Corporation og/eller dets
tilknyttede selskaber. Andre navne kan være varemærker tilhørende deres respektive
ejere.

Skriv 'help;' eller 'h' for hjælp. Skriv 'c' for at rydde den nuværende inputinstruktion.

mysql> select user, host, plugin, authentication_string from mysql.user where user ='percona';
+---------+-----------+-------------+-----------------------+
| user    | host      | plugin      | authentication_string |
+---------+-----------+-------------+-----------------------+
| percona | localhost | auth_socket |                       |
+---------+-----------+-------------+-----------------------+
1 række i sæt (0,00 sek)

Og det lykkedes igen!

Spørgsmål: Vil det være muligt at logge ind med det samme brugernavn percona, men fra en anden bruger?

[percona@ip-192-168-1-111 ~]$ logout
[root@ip-192-168-1-111 ~]# mysql -upercona
FEJL 1698 (28000): Adgang nægtet for bruger 'percona'@'localhost'

Nej, det vil ikke være muligt.

Output

MySQL er ret fleksibel på flere områder, hvoraf en er autentificeringsmetoden. Som vist i dette indlæg kan man få adgang uden adgangskoder, baseret på OS-brugere. Dette kan være nyttigt i bestemte scenarier, og et af dem er, når man migrerer fra RDS/Aurora til almindelig MySQL ved at bruge IAM-databaseautentifikation, for stadig at få adgang, men uden adgangskoder.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster