Cách sử dụng MySQL mà không cần mật khẩu (và rủi ro bảo mật)

Cách sử dụng MySQL mà không cần mật khẩu (và rủi ro bảo mật)

Người ta nói mật khẩu tốt nhất là mật khẩu bạn không cần phải nhớ. Trong trường hợp MySQL, điều này có thể thực hiện được nhờ vào plugin auth_socket và phiên bản của nó dành cho MariaDB - unix_socket.

Cả hai plugin này đều không mới chút nào; rất nhiều điều đã được nói về chúng trên cùng blog này, ví dụ như trong bài viết về cách thay đổi mật khẩu trong MySQL 5.7 bằng plugin auth_socket. Tuy nhiên, khi xem xét những tính năng mới trong MariaDB 10.4, tôi phát hiện ra rằng unix_socket hiện được cài đặt theo mặc định và là một trong các phương thức xác thực (“một trong”, vì trong MariaDB 10.4, có nhiều hơn một plugin có sẵn cho một người dùng để xác thực, điều này được giải thích trong tài liệu "Xác thực" từ MariaDB 10.04).

Như tôi đã nói, đây không phải là tin mới và khi cài đặt MySQL bằng gói .deb được nhóm Debian hỗ trợ, một người dùng root sẽ được tạo để xác thực socket. Điều này đúng với cả MySQL và 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>>

Với các gói Debian dành cho MySQL, người dùng root được xác thực như sau:

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)

Điều tương tự cũng xảy ra với gói .deb dành cho 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)

Các gói .deb từ kho lưu trữ Percona chính thức cũng định cấu hình xác thực người dùng root trong auth-socket và cho Percona Server. Hãy đưa ra một ví dụ với Máy chủ Percona cho MySQL 8.0.16-7 và 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)

Vậy phép thuật là gì? Plugin kiểm tra xem người dùng Linux có khớp với người dùng MySQL hay không bằng cách sử dụng tùy chọn ổ cắm SO_PEERCRED để thu thập thông tin về người dùng đang chạy chương trình máy khách. Do đó, plugin chỉ có thể được sử dụng trên các hệ thống hỗ trợ tùy chọn SO_PEERCRED, chẳng hạn như Linux. Tùy chọn ổ cắm SO_PEERCRED cho phép bạn tìm ra uid của quy trình được liên kết với ổ cắm. Và sau đó anh ấy đã nhận được tên người dùng được liên kết với uid này.

Đây là một ví dụ với người dùng "lang thang":

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

Vì không có người dùng "lang thang" trong MySQL nên chúng tôi bị từ chối truy cập. Hãy tạo một người dùng như vậy và thử lại:

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)

Đã xảy ra!

Chà, còn bản phân phối không phải Debian mà bản phân phối này không được cung cấp theo mặc định thì sao? Hãy dùng thử Percona Server cho MySQL 8 được cài đặt trên 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

Quá tệ. Cái gì thiếu? Plugin chưa được tải:

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

Hãy thêm một plugin vào quy trình:

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)

Bây giờ chúng tôi có mọi thứ chúng tôi cần. Hãy thử lại lần nữa:

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)

Bây giờ bạn có thể đăng nhập bằng tên người dùng “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)

Và nó đã hoạt động trở lại!

Câu hỏi: liệu có thể đăng nhập vào hệ thống với cùng một thông tin đăng nhập percona nhưng với tư cách là một người dùng khác không?

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

Không, nó sẽ không hoạt động.

Đầu ra

MySQL khá linh hoạt ở một số khía cạnh, một trong số đó là phương thức xác thực. Như bạn có thể thấy từ bài đăng này, có thể truy cập mà không cần mật khẩu, dựa trên người dùng hệ điều hành. Điều này có thể hữu ích trong một số trường hợp nhất định và một trong số đó là khi di chuyển từ RDS/Aurora sang MySQL thông thường bằng cách sử dụng Xác thực cơ sở dữ liệu IAMđể vẫn có quyền truy cập nhưng không có mật khẩu.

Nguồn: www.habr.com

Thêm một lời nhận xét