Cara Menggunakan MySQL Tanpa Kata Laluan (dan Risiko Keselamatan)

Cara Menggunakan MySQL Tanpa Kata Laluan (dan Risiko Keselamatan)

Mereka mengatakan bahawa kata laluan terbaik adalah kata laluan yang anda tidak perlu ingat. Dalam kes MySQL ini mungkin terima kasih kepada pemalam auth_socket dan versinya untuk MariaDB - unix_socket.

Kedua-dua plugin ini bukanlah baru sama sekali, ia telah banyak dibincangkan dalam blog ini, contohnya dalam artikel tentang bagaimana untuk menukar kata laluan dalam MySQL 5.7 menggunakan pemalam auth_socket. Walau bagaimanapun, semasa melihat perkara baharu dalam MariaDB 10.4, saya mendapati bahawa unix_socket kini dipasang secara lalai dan merupakan salah satu kaedah pengesahan (β€œsalah satu”, kerana dalam MariaDB 10.4 lebih daripada satu pemalam tersedia kepada satu pengguna untuk pengesahan, yang dijelaskan dalam dokumen "Pengesahan" daripada MariaDB 10.04).

Seperti yang saya katakan, ini bukan berita, dan apabila memasang MySQL menggunakan pakej .deb yang disokong oleh pasukan Debian, pengguna root dicipta untuk pengesahan soket. Ini benar untuk MySQL dan MariaDB.

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>>

Dengan pakej Debian untuk MySQL, pengguna root disahkan seperti berikut:

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)

Perkara yang sama berlaku dengan pakej .deb untuk 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 rows in set (0.00 sec)

Pakej .deb daripada repositori Percona rasmi juga mengkonfigurasi pengesahan pengguna akar di bawah soket pengesahan dan untuk Pelayan Percona. Mari kita berikan contoh dengan Pelayan Percona untuk MySQL 8.0.16-7 dan 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)

Jadi apa keajaibannya? Pemalam menyemak bahawa pengguna Linux sepadan dengan pengguna MySQL menggunakan pilihan soket SO_PEERCRED untuk mengumpul maklumat tentang pengguna yang menjalankan program klien. Oleh itu, pemalam hanya boleh digunakan pada sistem yang menyokong pilihan SO_PEERCRED, seperti Linux. Pilihan soket SO_PEERCRED membolehkan anda mengetahui uid proses yang berkaitan dengan soket. Dan kemudian dia sudah menerima nama pengguna yang dikaitkan dengan uid ini.

Berikut ialah contoh dengan pengguna "gelandangan":

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

Oleh kerana tiada pengguna "gelandangan" dalam MySQL, kami dinafikan akses. Mari buat pengguna sedemikian dan cuba lagi:

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)

Terjadi!

Nah, bagaimana pula dengan pengedaran bukan Debian di mana ini tidak disediakan secara lalai? Mari cuba Percona Server untuk MySQL 8 yang dipasang pada CentOS 7:

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

Bummer. Apa yang hilang? Pemalam tidak dimuatkan:

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

Mari tambah pemalam pada proses:

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)

Sekarang kami mempunyai semua yang kami perlukan. Mari cuba lagi:

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)

Anda kini boleh log masuk menggunakan nama pengguna "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)

Dan ia berjaya lagi!

Soalan: adakah mungkin untuk log masuk ke sistem di bawah log masuk percona yang sama, tetapi sebagai pengguna yang berbeza?

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

Tidak, ia tidak akan berfungsi.

Output

MySQL agak fleksibel dalam beberapa aspek, salah satunya ialah kaedah pengesahan. Seperti yang anda lihat dari siaran ini, akses boleh diperoleh tanpa kata laluan, berdasarkan pengguna OS. Ini boleh berguna dalam senario tertentu, dan salah satunya ialah apabila berhijrah dari RDS/Aurora ke MySQL biasa menggunakan pengesahan pangkalan data IAMuntuk masih mendapat akses, tetapi tanpa kata laluan.

Sumber: www.habr.com

Tambah komen