MySQL-г нууц үггүйгээр хэрхэн ашиглах вэ (мөн аюулгүй байдлын эрсдэл)

MySQL-г нууц үггүйгээр хэрхэн ашиглах вэ (мөн аюулгүй байдлын эрсдэл)

Хамгийн сайн нууц үг бол санах шаардлагагүй нууц үг гэж тэд хэлдэг. MySQL-ийн хувьд энэ нь залгаасын ачаар боломжтой юм баталгаажуулах_сокет болон түүний MariaDB-д зориулсан хувилбар - unix_сокет.

Эдгээр залгаасууд хоёулаа огт шинэ зүйл биш бөгөөд энэ блог дээр маш их яригдсан, жишээ нь: auth_socket залгаасыг ашиглан MySQL 5.7 дээр нууц үгээ хэрхэн өөрчлөх вэ. Гэсэн хэдий ч, MariaDB 10.4-ийн шинэлэг зүйлийг судалж байхдаа unix_socket нь одоо анхдагчаар суулгагдсан бөгөөд баталгаажуулалтын аргуудын нэг ("нэг", учир нь MariaDB 10.4-д нэгээс олон залгаасыг нэг хэрэглэгч баталгаажуулах боломжтой" гэдгийг олж мэдсэн. баримт бичигт тайлбарласан болно MariaDB 10.04-ээс "Баталгаажуулалт").

Миний хэлсэнчлэн энэ бол мэдээ биш бөгөөд Debian багийн дэмждэг .deb багцуудыг ашиглан MySQL-г суулгах үед сокет баталгаажуулалтад зориулсан 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>>

MySQL-д зориулсан Debian багцуудын тусламжтайгаар үндсэн хэрэглэгчийг дараах байдлаар баталгаажуулна.

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)

MariaDB-д зориулсан .deb багцын хувьд ч мөн адил:

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)

Албан ёсны Percona репозиторын .deb багцууд нь auth-socket болон Percona Server-д зориулсан root хэрэглэгчийн баталгаажуулалтыг мөн тохируулдаг. -тай жишээ татъя MySQL 8.0.16-7-д зориулсан 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)

Тэгэхээр ид шид нь юу вэ? Энэхүү залгаас нь Линукс хэрэглэгч MySQL хэрэглэгчтэй таарч байгаа эсэхийг SO_PEERCRED сокет сонголтыг ашиглан клиент програмыг ажиллуулж байгаа хэрэглэгчийн талаарх мэдээллийг цуглуулдаг. Тиймээс залгаасыг зөвхөн Линукс гэх мэт SO_PEERCRED сонголтыг дэмждэг системд ашиглах боломжтой. SO_PEERCRED сокет сонголт нь залгууртай холбоотой процессын uid-г олох боломжийг танд олгоно. Тэгээд тэр энэ uid-тай холбоотой хэрэглэгчийн нэрийг аль хэдийн хүлээн авсан.

"Тэнэмэл" хэрэглэгчийн жишээг энд харуулав.

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 бус түгээлтийн талаар яах вэ? CentOS 8 дээр суулгасан MySQL 7-д зориулсан Percona серверийг туршиж үзье:

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

Буммар. Юу дутагдаж байсан бэ? Plugin ачаалагдаагүй байна:

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 нь хэд хэдэн тал дээр нэлээд уян хатан байдаг бөгөөд тэдгээрийн нэг нь баталгаажуулалтын арга юм. Энэ нийтлэлээс харахад OS хэрэглэгчдэд тулгуурлан нууц үггүйгээр нэвтрэх боломжтой. Энэ нь тодорхой хувилбаруудад хэрэг болох ба тэдгээрийн нэг нь RDS/Aurora-аас энгийн MySQL руу шилжих үед юм. IAM мэдээллийн сангийн баталгаажуулалтнэвтрэх эрхтэй хэвээр байгаа боловч нууц үггүйгээр.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх