
אומרים שהסיסמה הטובה ביותר היא כזו שלא צריך לזכור. במקרה של MySQL, זה אפשרי בזכות תוסף. והגרסאות שלה עבור MariaDB — .
שני התוספים הללו אינם חדשים כלל, הם נדונו רבות באותו בלוג, למשל במאמר על עם זאת, בזמן שבדקתי מה חדש ב-MariaDB 10.4, גיליתי ש-unix_socket מותקן כעת כברירת מחדל והוא אחת משיטות האימות ("אחת מתוך" מכיוון שב-MariaDB 10.4, יותר מתוסף אחד זמין לאימות לכל משתמש, כפי שמוסבר בתיעוד. ).
כמו שאמרתי, זה לא חדשות, וכאשר מתקינים את MySQL באמצעות הצוות הנתמך Debian עבור חבילות .deb, נוצר משתמש root לאימות socket. זה חל גם על MySQL וגם על 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>>עם שקיות Debian עבור MySQL, משתמש הבסיס מאומת באופן הבא:
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. הנה דוגמה: и 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 באמצעות אפשרות ה-socket SO_PEERCRED כדי לאסוף מידע על המשתמש שמפעיל את תוכנית הלקוח. לכן, ניתן להשתמש בתוסף רק במערכות התומכות באפשרות SO_PEERCRED, כגון Linuxאפשרות ה-socket SO_PEERCRED מאפשרת לך לקבוע את ה-UID של התהליך המשויך ל-socket. לאחר מכן התהליך מקבל את שם המשתמש המשויך ל-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 רגיל באמצעות כדי שעדיין תהיה גישה, אבל בלי סיסמאות.
מקור: www.habr.com
