
Mereka mengatakan bahwa kata sandi terbaik adalah kata sandi yang tidak perlu diingat. Dalam kasus MySQL, ini nyata berkat plugin auth_socket dan versinya untuk MariaDB - unix_socket .
Kedua plugin ini sama sekali tidak baru, mereka banyak dibahas di blog yang sama, misalnya, dalam sebuah artikel tentang cara mengubah kata sandi di MySQL 5.7 menggunakan plugin auth_socket . Namun, menganalisis 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 dalam MariaDB 10.4 lebih dari satu plugin tersedia untuk otentikasi untuk satu pengguna, yang dijelaskan dalam dokumen "Otentikasi" dari MariaDB 10.04 ).
Seperti yang saya katakan, ini bukan berita, dan ketika Anda menginstal MySQL menggunakan paket deb. Yang didukung oleh tim Debian, pengguna dengan hak root dibuat untuk otentikasi melalui soket. Ini berlaku untuk MySQL dan MariaDB.
root@app:~# apt-cache show mysql-server-5.7 | grep -i maintainers Original-Maintainer: Debian MySQL Maintainers <pkg-mysql-maint@lists.alioth.debian.org> Original-Maintainer: Debian MySQL Maintainers <<a href="mailto:pkg-mysql-maint@lists.alioth.debian.org">pkg-mysql-maint@lists.alioth.debian.org</a>>
Dengan paket Debian untuk MySQL, pengguna root mengotentikasi 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)
Sama halnya dengan 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 gudang resmi Percona juga mengkonfigurasi otentikasi root untuk auth-socket dan untuk Percona Server. Berikut ini adalah contoh dengan Percona Server 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 sihirnya? Plugin memverifikasi bahwa pengguna Linux cocok dengan pengguna MySQL menggunakan opsi soket SO_PEERCRED - untuk mengumpulkan informasi tentang pengguna yang menjalankan program klien. Dengan demikian, plugin hanya dapat digunakan pada sistem yang mendukung opsi SO_PEERCRED, seperti Linux. Opsi soket SO_PEERCRED memungkinkan Anda mengenali cairan proses yang terkait dengan soket. Dan setelah itu, dia sudah mendapatkan nama pengguna yang terkait dengan uid ini.
Berikut ini adalah 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, kami ditolak aksesnya. 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)
Ternyata!
Nah, bagaimana dengan distribusi non-Debian di mana ini tidak disediakan 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
Nyebelin. 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)
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 kita coba sekali 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)
Sekarang Anda dapat masuk menggunakan "percona" login.
[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 masuk menggunakan percona login yang sama, tetapi dari 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.
Kesimpulan
MySQL cukup fleksibel dalam beberapa aspek, salah satunya adalah metode otentikasi. Seperti yang dapat dilihat dari posting ini, akses dapat diperoleh tanpa kata sandi, berdasarkan pengguna OS. Ini dapat berguna dalam skenario tertentu, dan salah satunya adalah ketika Anda bermigrasi dari RDS / Aurora ke MySQL biasa, menggunakan otentikasi basis data IAM untuk tetap mengakses, tetapi tanpa kata sandi.