Кореневий доступ до MySQL з усіх хостів


152

Я встановив MySQL-сервер на віддаленій машині Ubuntu. rootКористувач визначається в mysql.userтаблиці наступним чином:

mysql> SELECT host, user, password FROM user WHERE user = 'root';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| localhost        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ip-10-48-110-188 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| 127.0.0.1        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ::1              | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

Я можу отримати доступ до користувача rootз одного інтерфейсу командного рядка віддаленої машини за допомогою стандартного mysqlклієнта. Тепер я хочу дозволити кореневий доступ від кожного хоста в Інтернеті , тому я спробував додати наступний рядок (це точний дублікат першого рядка з попереднього дампа, крім hostстовпця):

mysql> SELECT host, user, password FROM user WHERE host = '%';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| %                | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

Але мій клієнт на моєму персональному ПК продовжує говорити мені (я затемнював IP-адресу сервера):

Помилка SQL (2003): не вдається підключитися до сервера MySQL на '46 .xxx '(10061)

Я не можу сказати, чи це помилка аутентифікації чи помилка мережі. На брандмауері сервера я включив порт 3306 / TCP для 0.0.0.0/0 , і для мене це нормально ...


чи можете ви telnet до машини на порт 3306
mihaisimi

3
швидше за все, демон MySQL слухає не 46.xxx, а лише локальний хост. Шукайте bind-addressв my.cnf
Максим Крижановський

1
Отже, у world + dog тепер є хеш вашого пароля root, знання про те, що root доступний з будь-якого хоста в Інтернеті та перший байт вашої IP-адреси. Ви не думаєте, що це лише крихітний клопіт?
eggyal

Відповіді:


362

У цьому процесі є два етапи:

а) Надання пільг. Оскільки користувач root виконує цю заміну 'password'з вашим поточним паролем root:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';

б) прив’язати до всіх адрес:

Найпростіший спосіб - прокоментувати рядок у вашому my.cnfфайлі:

#bind-address = 127.0.0.1 

і перезапустити mysql

service mysql restart

За замовчуванням він пов'язується лише з localhost, але якщо ви коментуєте рядок, він пов'язує всі знайдені інтерфейси. Коментування рядка еквівалентно bind-address=*.

Щоб перевірити, де служба mysql пов'язує виконувати як root:

netstat -tupan | grep mysql

Оновлення для Ubuntu 16:

Налаштування файлу (зараз)

/etc/mysql/mysql.conf.d/mysqld.cnf 

(принаймні на стандартному Ubuntu 16)


5
Гаразд, проблема полягала у прив'язці адреси. Дякую. @Darhazer Дякую також :)
lorenzo-s

2
Для запиту поточних грантів: `SHOW GRANTS FOR 'root' @ '%';
robsch

5
Щоб також дозволити root @% надавати дозволи іншим користувачам, відразу після кроку (а) запустіть: GRANT USAGE ON *. * TO 'root' @ '%' З РЕШИМОЮ ГРАНТИ;
Калеб

1
Файл Config є (зараз) /etc/mysql/mysql.conf.d/mysqld.cnf (принаймні у стандартному Ubuntu 16)
jgp

2
Мені просто потрібно було це зробити, щоб мати можливість віддалено підключитися до сервера віддалено:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Свідерський Дмитро

35

Виконати такий запит:

use mysql;

update user set host='%' where host='localhost'

ПРИМІТКА: Не рекомендується для виробничого використання.


2
Це не ідеальне рішення. Це може спрацювати. Для мене це призвело до помилки: ПОМИЛКА 1062 (23000): Дублікат запису '% -root' для ключа 'PRIMARY'
Scriptlabs

2
@Scriptlabs, швидше за все, у таблиці користувачів є кілька записів із хостом 'localhost'. І більше одного ряду з коренем, включаючи root.localhost, root.127.0.0.1, root.:::. Тож вам краще додати окремого користувача, а не оновлювати, саме тому я підтримую цю відповідь.
Майк Перселл

4
НЕ ПЛАТИМ ПРИВІЛЕГИ; також потрібно відразу після?
Nom1fan

1
це працює для мене. спробуйте це. update mysql.user set host='%' where user='root'
Нур зазін


7

MYSQL 8.0 - відкрити клієнтський командний рядок mysql
ВІДКЛЮЧИТИ ВСІ ПРИВИЛЕГИ НА *. * ДО 'root' @ 'localhost';
використовувати mysql
UPDATE mysql.user SET host = '%' WHERE user = 'root';
Перезавантажте сервіс mysql


4

MariaDB працює на Raspbian - файл, що містить прив’язану адресу, важко визначити. У MariaDB є не дуже корисна інформація з цього приводу.

я використав

# sudo grep -R bind-address /etc 

щоб знайти, де проклята річ.

Я також повинен був встановити привілеї та господарі в mysql, як усі вище вказували.

А також весело провели час відкриття порту 3306 для віддалених підключень до мого Raspberry Pi - нарешті використаних стійких iptables .

Зараз все прекрасно працює.


1

якщо до вас ОС підключено багато мереж, вам слід конкретизувати одну з цієї мережі у файлах bind-addres з файлу my.conf. приклад:

[mysqld]
bind-address = 127.100.10.234

цей ip - з конфігурації ethX.


1
Будь ласка, додайте детальніше. У якому файлі чи рамках має відбутися це налаштування? Будьте докладнішими щодо конфігурації ethX.
BPS

1

У моєму випадку проблема з налаштуванням «прив’язати-адресу» була проблемою. Коментувати це налаштування my.cnfне було допоможе, тому що в моєму випадку MySQL встановити за замовчуванням 127.0.0.1 з якої - то причини.

Щоб перевірити, який параметр MySql використовує, відкрийте командний рядок у вашому локальному вікні:

mysql -h localhost -u myname -pmypass mydb

Прочитайте поточну настройку:

Show variables where variable_name like "bind%"

Тут ви повинні побачити 0.0.0.0, якщо ви хочете дозволити доступ з усіх хостів. Якщо це не так, відредагуйте свою /etc/mysql/my.cnfта встановіть bind-адресу в розділі [mysqld]:

bind-address=0.0.0.0

Нарешті перезапустіть сервер MySql, щоб отримати нове налаштування:

sudo service mysql restart

Спробуйте ще раз і перевірте, чи було вибрано нове налаштування.


-2

mysql_update це те, що вам потрібно.

Я не знаю, чому хтось би дотримувався більш складних способів виправлення цього питання, коли MySql милозвучно створив інструмент, який вже робить це ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.