MySQL:n käyttäminen ilman salasanaa (ja turvallisuusriskejä)

MySQL:n käyttäminen ilman salasanaa (ja turvallisuusriskejä)

Sanotaan, että paras salasana on se, jota sinun ei tarvitse muistaa. MySQL:n tapauksessa tämä on mahdollista laajennuksen ansiosta auth_socket ja sen versio MariaDB:lle - unix_socket.

Molemmat lisäosat eivät ole lainkaan uusia, niistä on puhuttu paljon tässä samassa blogissa, esimerkiksi artikkelissa kuinka vaihtaa salasanoja MySQL 5.7:ssä auth_socket-laajennuksella. Tutkiessani MariaDB 10.4:n uusia ominaisuuksia huomasin kuitenkin, että unix_socket on nyt asennettu oletusarvoisesti ja se on yksi todennusmenetelmistä ("yksi", koska MariaDB 10.4:ssä yhdelle käyttäjälle on saatavana useampi kuin yksi liitännäinen todennusta varten, mikä on selitetty asiakirjassa "Todennus" MariaDB:stä 10.04).

Kuten sanoin, tämä ei ole uutinen, ja kun MySQL asennetaan käyttämällä Debian-tiimin tukemia .deb-paketteja, luodaan pääkäyttäjä socket-todennusta varten. Tämä pätee sekä MySQL:lle että MariaDB:lle.

root@app:~# apt-cache show mysql-server-5.7 | grep -i maintainers
Original-Maintainer: Debian MySQL Maintainers <[email protected]>
Original-Maintainer: Debian MySQL Maintainers <<a href="mailto:[email protected]">[email protected]</a>>

Debianin MySQL-pakettien kanssa pääkäyttäjä todennetaan seuraavasti:

root@app:~# whoami
root=
root@app:~# mysql
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 4
Server version: 5.7.27-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2019, 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 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)

Sama koskee MariaDB:n .deb-pakettia:

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 rows in set (0.00 sec)

Virallisen Percona-varaston .deb-paketit määrittävät myös pääkäyttäjän todennuksen auth-socketin alla ja Percona Serverille. Otetaan esimerkki kanssa Percona Server for MySQL 8.0.16-7 ja Ubuntu 16.04:

root@app:~# whoami
root
root@app:~# mysql
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 9
Server version: 8.0.16-7 Percona Server (GPL), Release '7', Revision '613e312'

Copyright (c) 2009-2019 Percona LLC and/or its affiliates
Copyright (c) 2000, 2019, 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 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)

Joten mikä on taikuutta? Plugin tarkistaa, että Linux-käyttäjä vastaa MySQL-käyttäjää käyttämällä SO_PEERCRED-liitäntävaihtoehtoa kerätäkseen tietoja asiakasohjelmaa käyttävästä käyttäjästä. Näin ollen laajennusta voidaan käyttää vain järjestelmissä, jotka tukevat SO_PEERCRED-vaihtoehtoa, kuten Linux. SO_PEERCRED socket -vaihtoehdon avulla voit selvittää liitäntään liittyvän prosessin uid:n. Ja sitten hän jo saa tähän käyttäjätunnukseen liittyvän käyttäjätunnuksen.

Tässä on esimerkki käyttäjästä "vagrant":

vagrant@mysql1:~$ whoami
vagrant
vagrant@mysql1:~$ mysql
ERROR 1698 (28000): Access denied for user 'vagrant'@'localhost'

Koska MySQL:ssä ei ole "vagrant" käyttäjää, meiltä evätään pääsy. Luodaan tällainen käyttäjä ja yritetään uudelleen:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket;
Query OK, 0 rows affected (0.00 sec)

vagrant@mysql1:~$ mysql
Welcome to the MariaDB monitor.  Commands end with ; or g.
Your MariaDB connection id is 45
Server version: 10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.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)]> show grants;
+---------------------------------------------------------------------------------+
| Grants for vagrant@localhost                                                    |
+---------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket |
+---------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Tapahtui!

No, entä ei-Debian-jakelu, jossa tätä ei ole oletuksena tarjolla? Kokeillaan CentOS 8:ään asennettua Percona Server for MySQL 7:aa:

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

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded

Kumma. Mitä puuttui? Plugin ei ladattu:

mysql> pager grep socket
PAGER set to 'grep socket'
mysql> show plugins;
47 rows in set (0.00 sec)

Lisätään prosessiin laajennus:

mysql> nopager
PAGER set to stdout
mysql> INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
Query OK, 0 rows affected (0.00 sec)

mysql> pager grep socket; show plugins;
PAGER set to 'grep socket'
| auth_socket                     | ACTIVE | AUTHENTICATION | auth_socket.so | GPL     |
48 rows in set (0.00 sec)

Nyt meillä on kaikki mitä tarvitsemme. Yritetään uudestaan:

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'percona'@'localhost';
Query OK, 0 rows affected (0.01 sec)

Voit nyt kirjautua sisään käyttäjätunnuksella "percona".

[percona@ip-192-168-1-111 ~]$ whoami
percona
[percona@ip-192-168-1-111 ~]$ mysql -upercona
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 19
Server version: 8.0.16-7 Percona Server (GPL), Release 7, Revision 613e312

Copyright (c) 2009-2019 Percona LLC and/or its affiliates
Copyright (c) 2000, 2019, 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 user, host, plugin, authentication_string from mysql.user where user ='percona';
+---------+-----------+-------------+-----------------------+
| user    | host   | plugin   | authentication_string |
+---------+-----------+-------------+-----------------------+
| percona | localhost | auth_socket |                       |
+---------+-----------+-------------+-----------------------+
1 row in set (0.00 sec)

Ja taas toimi!

Kysymys: Onko mahdollista kirjautua sisään järjestelmään samalla Percona-tunnuksella, mutta eri käyttäjänä?

[percona@ip-192-168-1-111 ~]$ logout
[root@ip-192-168-1-111 ~]# mysql -upercona
ERROR 1698 (28000): Access denied for user 'percona'@'localhost'

Ei, se ei toimi.

johtopäätös

MySQL on varsin joustava useilta osin, joista yksi on todennusmenetelmä. Kuten tästä viestistä näet, käyttöjärjestelmän käyttäjien perusteella pääsy voidaan saada ilman salasanoja. Tästä voi olla hyötyä tietyissä skenaarioissa, ja yksi niistä on siirryttäessä RDS/Aurorasta tavalliseen MySQL:ään käyttämällä IAM-tietokannan todennuspäästäksesi edelleen sisään, mutta ilman salasanoja.

Lähde: will.com

Lisää kommentti