Cara Menggunakan MySQL Tanpa Kata Sandi (dan Resiko Keamanan)

Cara Menggunakan MySQL Tanpa Kata Sandi (dan Resiko Keamanan)

Mereka mengatakan kata sandi terbaik adalah kata sandi yang tidak perlu Anda ingat. Dalam kasus MySQL, hal ini dimungkinkan berkat plugin auth_socket dan versinya untuk MariaDB - unix_socket.

Kedua plugin ini bukanlah hal baru sama sekali; banyak yang telah dibicarakan tentang keduanya di blog yang sama, misalnya di artikel tentang cara mengubah kata sandi di MySQL 5.7 menggunakan plugin auth_socket. Namun, ketika melihat apa yang baru di MariaDB 10.4, saya menemukan bahwa unix_socket sekarang diinstal secara default dan merupakan salah satu metode otentikasi (β€œsalah satu”, karena di MariaDB 10.4 lebih dari satu plugin tersedia untuk satu pengguna untuk otentikasi, yang mana dijelaskan dalam dokumen "Otentikasi" dari MariaDB 10.04).

Seperti yang saya katakan, ini bukan berita baru, dan ketika menginstal MySQL menggunakan paket .deb yang didukung oleh tim Debian, pengguna root dibuat untuk otentikasi soket. Hal ini berlaku 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 paket Debian untuk MySQL, pengguna root diautentikasi sebagai 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)

Hal yang sama berlaku pada paket .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)

Paket .deb dari repositori resmi Percona juga mengonfigurasi otentikasi pengguna root di bawah auth-socket dan untuk Server Percona. Mari kita beri contoh dengan Server 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? Plugin memeriksa apakah pengguna Linux cocok dengan pengguna MySQL menggunakan opsi soket SO_PEERCRED untuk mengumpulkan informasi tentang pengguna yang menjalankan program klien. Oleh karena itu, plugin hanya dapat digunakan pada sistem yang mendukung opsi SO_PEERCRED, seperti Linux. Opsi soket SO_PEERCRED memungkinkan Anda mengetahui ID proses yang terkait dengan soket. Dan kemudian dia sudah menerima nama pengguna yang terkait dengan uid ini.

Berikut ini contoh dengan pengguna "gelandangan":

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

Karena tidak ada pengguna "gelandangan" di MySQL, akses kami ditolak. Mari buat pengguna seperti itu dan coba 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)

Telah terjadi!

Lalu bagaimana dengan distribusi non-Debian yang tidak menyediakannya secara default? Mari kita coba Percona Server untuk MySQL 8 yang diinstal 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

Kekecewaan. Apa yang hilang? Plugin tidak dimuat:

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

Mari tambahkan plugin ke 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 memiliki semua yang kami butuhkan. Mari coba 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 sekarang dapat 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 itu berhasil lagi!

Pertanyaan: apakah mungkin untuk masuk ke sistem dengan login percona yang sama, tetapi sebagai pengguna yang berbeda?

[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, itu tidak akan berhasil.

Keluaran

MySQL cukup fleksibel dalam beberapa aspek, salah satunya adalah metode autentikasi. Seperti yang Anda lihat dari postingan ini, akses dapat diperoleh tanpa kata sandi, berdasarkan pengguna OS. Ini dapat berguna dalam skenario tertentu, dan salah satunya adalah ketika bermigrasi dari RDS/Aurora ke MySQL biasa menggunakan Otentikasi basis data IAMuntuk tetap mendapatkan akses, tetapi tanpa kata sandi.

Sumber: www.habr.com

Tambah komentar