Πώς να χρησιμοποιήσετε τη MySQL χωρίς κωδικό πρόσβασης (και κινδύνους ασφαλείας)

Πώς να χρησιμοποιήσετε τη MySQL χωρίς κωδικό πρόσβασης (και κινδύνους ασφαλείας)

Λένε ότι ο καλύτερος κωδικός πρόσβασης είναι αυτός που δεν χρειάζεται να θυμάστε. Στην περίπτωση της MySQL αυτό είναι δυνατό χάρη στο πρόσθετο auth_socket και η έκδοσή του για MariaDB - unix_socket.

Και οι δύο αυτές προσθήκες δεν είναι καθόλου νέες· έχουν ειπωθεί πολλά για αυτές στο ίδιο ιστολόγιο, για παράδειγμα στο άρθρο σχετικά με πώς να αλλάξετε τους κωδικούς πρόσβασης στο MySQL 5.7 χρησιμοποιώντας την προσθήκη auth_socket. Ωστόσο, εξετάζοντας τι νέο υπάρχει στο MariaDB 10.4, ανακάλυψα ότι το unix_socket είναι πλέον εγκατεστημένο από προεπιλογή και είναι μία από τις μεθόδους ελέγχου ταυτότητας («μία από», επειδή στο MariaDB 10.4 περισσότερες από μία προσθήκες είναι διαθέσιμες σε έναν χρήστη για έλεγχο ταυτότητας, το οποίο εξηγείται στο έγγραφο "Authentication" από MariaDB 10.04).

Όπως είπα, αυτό δεν είναι είδηση ​​και κατά την εγκατάσταση της MySQL χρησιμοποιώντας τα πακέτα .deb που υποστηρίζονται από την ομάδα του Debian, δημιουργείται ένας χρήστης root για έλεγχο ταυτότητας υποδοχής. Αυτό ισχύει τόσο για τη MySQL όσο και για τη 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>>

Με τα πακέτα Debian για MySQL, ο χρήστης root επαληθεύεται ως εξής:

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)

Το ίδιο συμβαίνει και με το πακέτο .deb για το 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)

Τα πακέτα .deb από το επίσημο αποθετήριο Percona διαμορφώνουν επίσης τον έλεγχο ταυτότητας χρήστη root στο auth-socket και για τον Percona Server. Ας δώσουμε ένα παράδειγμα με Διακομιστής Percona για MySQL 8.0.16-7 και 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)

Ποια είναι λοιπόν η μαγεία; Το πρόσθετο ελέγχει ότι ο χρήστης Linux ταιριάζει με τον χρήστη MySQL χρησιμοποιώντας την επιλογή υποδοχής SO_PEERCRED για τη συλλογή πληροφοριών σχετικά με τον χρήστη που εκτελεί το πρόγραμμα-πελάτη. Έτσι, το πρόσθετο μπορεί να χρησιμοποιηθεί μόνο σε συστήματα που υποστηρίζουν την επιλογή SO_PEERCRED, όπως το Linux. Η επιλογή υποδοχής SO_PEERCRED σάς επιτρέπει να μάθετε το uid της διαδικασίας που σχετίζεται με την υποδοχή. Και τότε λαμβάνει ήδη το όνομα χρήστη που σχετίζεται με αυτό το uid.

Ακολουθεί ένα παράδειγμα με τον χρήστη "vagrant":

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

Δεδομένου ότι δεν υπάρχει "αλήτης" χρήστης στη MySQL, μας απαγορεύεται η πρόσβαση. Ας δημιουργήσουμε έναν τέτοιο χρήστη και ας προσπαθήσουμε ξανά:

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)

Συνέβη!

Λοιπόν, τι γίνεται με μια διανομή που δεν είναι Debian όπου αυτό δεν παρέχεται από προεπιλογή; Ας δοκιμάσουμε τον Percona Server για MySQL 8 που είναι εγκατεστημένος στο 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

Μπαμμερ. Τι έλειπε; Η προσθήκη δεν έχει φορτωθεί:

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

Ας προσθέσουμε ένα πρόσθετο στη διαδικασία:

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)

Τώρα έχουμε όλα όσα χρειαζόμαστε. Ας δοκιμάσουμε ξανά:

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)

Τώρα μπορείτε να συνδεθείτε χρησιμοποιώντας το όνομα χρήστη "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)

Και λειτούργησε ξανά!

Ερώτηση: θα είναι δυνατή η είσοδος στο σύστημα με την ίδια σύνδεση percona, αλλά ως διαφορετικός χρήστης;

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

Όχι, δεν θα λειτουργήσει.

Παραγωγή

Η MySQL είναι αρκετά ευέλικτη σε πολλές πτυχές, μία από τις οποίες είναι η μέθοδος ελέγχου ταυτότητας. Όπως μπορείτε να δείτε από αυτήν την ανάρτηση, η πρόσβαση μπορεί να αποκτηθεί χωρίς κωδικούς πρόσβασης, με βάση τους χρήστες του λειτουργικού συστήματος. Αυτό μπορεί να είναι χρήσιμο σε ορισμένα σενάρια, και ένα από αυτά είναι κατά τη μετάβαση από το RDS/Aurora στην κανονική MySQL χρησιμοποιώντας Έλεγχος ταυτότητας βάσης δεδομένων IAMγια να αποκτήσετε ακόμα πρόσβαση, αλλά χωρίς κωδικούς πρόσβασης.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο