Корневой доступ 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клиент. Теперь я хочу разрешить root-доступ для каждого хоста в Интернете , поэтому я попытался добавить следующую строку (это точная копия первой строки из предыдущего дампа, за исключением 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' @ '%';
Робш

5
Чтобы также разрешить root @% предоставлять разрешения другим пользователям, сразу же после шага (a) выполните: GRANT USAGE ON *. * TO 'root' @ '%' WITH GRANT OPTION;
Калеб

1
Файл конфигурации (сейчас) /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" для ключа "
ПЕРВИЧНЫЙ

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

4
НЕ ПРИБЫЛЬНЫЕ ПРИВИЛЕГИИ; Также необходимо сразу после?
Nom1fan

1
это работает для меня. попробуй это. update mysql.user set host='%' where user='root'
Нур Зазин


7

MYSQL 8.0 - открыть клиент командной строки mysql,
ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ НА *. * TO 'root' @ 'localhost';
используйте mysql
ОБНОВЛЕНИЕ mysql.user SET host = '%' WHERE user = 'root';
Перезапустите службу MySQL


4

MariaDB работает на Raspbian - файл, содержащий bind-адрес, трудно определить. MariaDB имеет немного не очень полезной информации по этому вопросу.

я использовал

# sudo grep -R bind-address /etc 

чтобы найти, где эта чертова вещь.

Я также должен был установить привилегии и хосты в mysql, как все выше указали.

А также весело провел время, открывая порт 3306 для удаленных подключений к моему Raspberry Pi - наконец, использовал iptables-persistent .

Теперь все прекрасно работает.


1

если у вас много сетей, подключенных к вашей ОС, вы должны указать одну из этих сетей в bind-addres из файла my.conf. пример:

[mysqld]
bind-address = 127.100.10.234

этот ip из конфигурации ethX.


1
Пожалуйста, добавьте больше деталей. В каком файле или фреймворке должна происходить эта настройка? Пожалуйста, будьте более конкретны в отношении конфигурации ethX.
BPS

1

В моем случае проблема была связана с настройкой «bind-address». Комментируя эту установку в 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.