Как предоставить пользователю права удаленного доступа к серверу mysql?

118

Если я сделаю это SHOW GRANTSв своей базе данных mysql, я получу

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' 
    IDENTIFIED BY PASSWORD 'some_characters' 
    WITH GRANT OPTION

Если не ошибаюсь, root@localhostзначит, пользователь rootможет получить доступ к серверу только из localhost. Как мне сказать MySQL предоставить rootразрешение на доступ к этому серверу mysql с любой другой машины (в той же сети)?

Aufwind
источник
6
Простое изменение localhostв %предоставит корневой доступ к публичной сети. Не забудьтеflush privileges;
6
Добавление root @% подвергает вас большому риску, и этого не следует делать. Я знаю, что это старый пост, но это предупреждение должно быть здесь. Учетная запись root - это первая учетная запись, на которую нападают злоумышленники, а root @ '%' означает, что пользователь root может подключиться к вашей учетной записи MySQL из любого места, где пожелает. Слишком много комментариев, но вы должны попытаться удалить как можно больше пользователей @ '%', и все, которые объявлены при этом, должны иметь очень ограниченные права. Несмотря ни на что, вам определенно не следует добавлять root @ '%', и ваши приложения также не должны ожидать наличия этой учетной записи.
Дэймон
Привет, ребята, удалите строку PASSWORD из этой команды ... она вызывает ошибку ... просто закончите с IDENTIFIED BY, а затем с самим паролем.
Марио де Са Вера,

Ответы:

143

Это дает root-доступ с тем же паролем с любой машины в *.example.com:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%.example.com' 
    IDENTIFIED BY 'some_characters' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

Если разрешение имен не работает, вы также можете предоставить доступ по IP-адресу или подсети:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.%'
    IDENTIFIED BY 'some_characters'  
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

GRANTДокументы по синтаксису MySQL .

Майкл Берковски
источник
15
Я полагаю ...TO 'root'@'%' IDENTIFIED..., предоставил бы доступ отовсюду?
Aufwind, 04
3
Я выполнил команду в mysql, но SHOW GRANTSвсе равно показывает то же самое (как в моем вопросе). Я даже это сделал FLUSH PRIVILGES. Я что-то скучаю?
Aufwind 04
@Aufwind Я бы не ожидал, что тебе понадобится что-то еще FLUSH PRIVILEGES. Выйдите из системы и снова войдите, перезапустите службу mysqld, если у вас есть доступ. Кроме того, убедитесь, что skip networkingлиния не включена в вашем, my.cnfхотя это не будет учитывать, что вы SHOW GRANTSвсе еще не то же самое.
Michael Berkowski
@Aufwind В противном случае вам, возможно, придется спросить на ServerFault.com.
Michael Berkowski
10
Обратите внимание, что IDENTIFIED BY PASSWORDон сопровождается хешированным 41-значным шестнадцатеричным числом. Используйте, IDENTIFIED BY 'password'если вы хотите указать пароль напрямую.
Rainulf
94

Пытаться:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Pa55w0rd' WITH GRANT OPTION;
Моше Бири
источник
1
ммм, что это Pa55w0rdкажется глупым, не говори мне, что это пароль, который ты хочешь создать. Для всех, кто пытается войти в ваш mysql?
SSpoke
23
Обычно он используется для указания места для пароля, говоря: «Поместите здесь надежный пароль».
Моше Бери
2
Эта команда с обычным предостережением, что вы хотите использовать ее только для приложений, безопасность которых не имеет значения, например, для разработчиков или QA.
einnocent
если он не работает на Mac, попробуйте изменить 'root' @ '%' на 'root' @ 'localhost' или / etc / hosts имя компьютера, которому вы предоставляете привилегии.
Моше Бери
2
Не забудьте запустить это после:FLUSH PRIVILEGES;
dane
44

Вам нужно предпринять некоторые шаги, чтобы убедиться, что сначала mysql, а затем пользователь root доступен извне:

  1. Отключить skip-networkingв my.cnf(то есть: /etc/mysql/my.cnf)

  2. Проверьте значение bind-addressin my.cnf, если оно установлено 127.0.0.1, вы можете изменить его, 0.0.0.0чтобы разрешить доступ со всех IP-адресов или любого IP-адреса, с которого вы хотите подключиться.

  3. Предоставьте удаленный доступ пользователю root с любого ip (или укажите свой ip вместо %)

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
        IDENTIFIED BY 'your_root_password'
        WITH GRANT OPTION;
    FLUSH PRIVILEGES;`
  4. Перезапустите службу mysql:

    sudo service mysql restart
Khashayar
источник
Вам также необходимо открыть порт 3306 mysql из брандмауэра, иначе удаленные клиенты не будут подключаться,
Дэвид Окви,
Небольшое замечание по пункту 2 от @Khashayar: 0.0.0.0 означает любой IPv4-адрес. * означает ЛЮБОЙ адрес, будь то IPv4 или IPv6.
Густаво Пинсар
34
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' 
    IDENTIFIED BY 'YOUR_PASS' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;  

*.* = DB.TABLE вы можете ограничить пользователя определенной базой данных и конкретной таблицей.

'root'@'%'вы можете изменить root с любым пользователем, которого вы создали, а% - разрешить все IP. Вы можете ограничить его, изменив% .168.1.1 и т. Д.


Если это не помогает, измените также my.cnf или my.ini и прокомментируйте эти строки.

bind-address = 127.0.0.1к #bind-address = 127.0.0.1
и
skip-networkingк#skip-networking

  • Перезапустите MySQL и повторите описанные выше шаги еще раз.

Raspberry Pi, я нашел конфигурацию адреса привязки в \etc\mysql\mariadb.conf.d\50-server.cnf

Васим А.
источник
2
Единственный ответ, который объясняет *.*и 'user'@'address'часть. Спасибо! :)
Филипп
Выдача ВСЁ на . приглашает хакеров.
Рик Джеймс,
вот почему я объяснил *. *
Васим А.
8

Гранты SQL, которыми делятся другие, действительно работают. Если вы все еще не можете получить доступ к базе данных, возможно, у вас есть ограничение брандмауэра для порта. Это зависит от типа вашего сервера (и любых промежуточных маршрутизаторов) относительно того, как открыть соединение. Откройте входящий TCP-порт 3306 и задайте ему аналогичное правило доступа для внешних компьютеров (all / subnet / single IP / etc.).

user171212
источник
4

Откройте /etc/mysql/mysql.conf.d/mysqld.cnfфайл и прокомментируйте следующую строку:

#bind-address = 127.0.0.1
Vik2696
источник
Работа над Ubuntu 19.4
Нго Ван Тхао
3

В моем случае я пытался подключиться к удаленному серверу mysql на центовой ОС. После множества решений (предоставление всех привилегий, удаление привязок ip, включение сети) проблема все еще не решалась.

Как оказалось, при рассмотрении различных решений я наткнулся на iptables, из-за чего я понял, что порт 3306 mysql не принимает соединения.

Вот небольшая заметка о том, как я проверил и решил эту проблему.

  • Проверка, принимает ли порт соединения:
telnet (ip-адрес сервера mysql) [номер порта]

-Добавление правила таблицы IP для разрешения подключений к порту:

iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT

-Не рекомендую это для производственной среды, но если ваши iptables не настроены должным образом, добавление правил может не решить проблему. В этом случае необходимо сделать следующее:

остановка службы iptables

Надеюсь это поможет.

Kushal
источник
3

Два шага:

  1. настроить пользователя с подстановочным знаком:
    create user 'root'@'%' identified by 'some_characters'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD 'some_characters' WITH GRANT OPTION

  2. vim /etc/my.cnf
    добавить следующее:
    bind-address=0.0.0.0

перезапустите сервер, у вас не должно возникнуть проблем с подключением к нему.

studio1057
источник
Затем появляется сообщение «ОШИБКА 1827 (HY000): хэш пароля не имеет ожидаемого формата. Проверьте, используется ли правильный алгоритм пароля с функцией PASSWORD ()». Не могли бы вы объяснить, в чем я здесь ошибаюсь?
lampShadesDrifter
2

В mysql 8 и более поздних версиях вы не можете добавить пользователя путем предоставления привилегий. это означает с этим запросом:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' 
    IDENTIFIED BY 'type-root-password-here' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

mysql вернет эту ошибку:

ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'IDENTIFIED BY' письменный пароль 'в строке 1

это означает, что у вас нет пользователя root для% domain. поэтому вам нужно сначала вставить пользователя, а затем предоставить такие привилегии:

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'your password';
Query OK, 0 rows affected (0.11 sec)

mysql> GRANT ALL ON *.* TO 'root'@'%';
Query OK, 0 rows affected (0.15 sec)

mysql> FLUSH PRIVILEGES;

Не забудьте заменить пароли своими конкретными паролями.

MhDG7
источник
0

Это сработало для меня. Но возникла странная проблема, и даже я сначала попробовал те, на которые она не повлияла. Я обновил страницу phpmyadmin, и она как-то заработала.

Если вам нужен доступ к local-xampp-mysql. Вы можете перейти в xampp-shell -> открыть командную строку.

Затем mysql -uroot -p --port = 3306 или mysql -uroot -p (если установлен пароль). После этого вы можете предоставить доступ со страницы оболочки mysql (также может работать с localhost / phpmyadmin).

Просто добавьте их, если кто-то найдет эту тему и у вас возникнут проблемы с новичком.

icemanzzz
источник
0

Ubuntu 18.04

Установите и убедитесь, что mysqld запущен.

Войдите в базу данных и настройте пользователя root:

sudo mysql -u root
SELECT User,Host FROM mysql.user;
DROP USER 'root'@'localhost';
CREATE USER 'root'@'%' IDENTIFIED BY 'obamathelongleggedmacdaddy';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;

Отредактируйте разрешения mysqld и перезапустите:

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

# edit the line to be this:
bind-address=0.0.0.0

sudo systemctl stop mysql
sudo systemctl start mysql

С другой машины проверьте .. Порт Obvs (3306) на машине mysqld должен разрешать соединение с тестовой машины.

mysql -u root -p -h 123.456.789.666

Вся дополнительная «безопасность» MySql совсем не способствует безопасности, она просто усложняет и запутывает, теперь на самом деле легче облажаться, чем в старые времена, когда вы просто использовали очень длинный пароль.

Питер Прографо
источник