Ошибка доступа MySQL при подключении через туннель SSH

12

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

Невозможно подключиться к хосту 127.0.0.1, потому что доступ запрещен.

Дважды проверьте свое имя пользователя и пароль и убедитесь, что доступ с вашего текущего местоположения разрешен.

MySQL сказал: доступ запрещен для пользователя 'root' @ 'localhost' (с использованием пароля: ДА)

Я могу войти с терминала, когда подключен напрямую к серверу через SSH, но не через туннель SSH. Проблема не специфична для Sequel Pro или только для меня, я получаю ту же ошибку при подключении через MySQL Workbench, что и другие в офисе. Я сбросил пароль mysqladminтолько ради здравомыслия, это определенно не проблема.

Когда я стал больше разбираться в этом, я заметил, что ошибка сообщала серверу как «localhost», а не «127.0.0.1», который я ввел в Sequel Pro. Друг предположил, что это, вероятно, просто плохая обработка ошибок, но это кажется странным, учитывая значительную разницу между localhost и 127.0.0.1 в MySQL.

В попытке обойти проблему туннелирования я предоставил доступ к root @%, чтобы я мог подключиться напрямую. Это работает по большей части, я могу просматривать данные таблиц, создавать новые базы данных и т. Д. Единственная проблема - когда я прихожу, чтобы создать пользователей, я получаю сообщение об ошибке:

Доступ запрещен для пользователя 'root' @ '%' (с использованием пароля: ДА)

Как ни странно, пользователь действительно создан, я думаю, что это просто проблема с грантом. Опять же, хотя, из терминала я могу делать все что угодно, когда залогинен как root.

Кто-нибудь может помочь пролить свет на то, почему туннельные соединения и (возможно) команды предоставления получают ошибку отказа в доступе?

Для справки: MySQ - версия 5.6.16 с настройками по умолчанию, установленными через Homebrew на компьютере с MAC OS X Server.

Обновить

Вот список хостов, к которым root имеет доступ:

mysql> select host,user from mysql.user where user='root';
+----------------+------+
| host           | user |
+----------------+------+
| %              | root |
| 127.0.0.1      | root |
| ::1            | root |
| localhost      | root |
+----------------+------+
4 rows in set (0.00 sec)

Как я понимаю, первый ряд («%») должен действительно сделать остальные избыточными?

Обновление 2

Исправлена ​​проблема с грантом; пользователю root @% не предоставлены все привилегии с дополнительным with grant optionв конце, поэтому он может делать все, кроме предоставления. Тем не менее, хотелось бы знать, почему SSH-туннелям отказывают.

Адам
источник
Итак, перед тем как создать учетную запись «%», вы создали «127.0.0.1» и «localhost», и оба они не работали, это правильно?
Сверре
localhost работает только в том случае, если вы находитесь на правильном хосте, поэтому теоретически только 127.0.0.1 (эквивалент сети localhost) должен работать через ssh-туннель. в Unix как операционные системы по крайней мере.
Сверре

Ответы:

18

В MySQL localhostключевое слово зарезервировано для подключения через сокет MySQL, и вы должны использовать ip-адрес 127.0.0.1для TCP-подключений к сетевому порту MySQL на 127.0.0.1. Это означает, что и сервер должен предоставлять привилегии пользователям конкретно 127.0.0.1, а клиент должен использовать -h 127.0.0.1для прохождения туннеля вместо подключения к локальному сокету.

Чтобы разрешить вам доступ с использованием переадресации порта SSH, вам нужно что-то вроде:

GRANT SELECT ON *.* TO user@`127.0.0.1`

а потом беги

FLUSH PRIVILEGES;

и, возможно,

FLUSH QUERY CACHE;

Если это все еще не работает, перезапустите процесс сервера.

В сообщениях об ошибках 127.0.0.1 после обратного поиска DNS переводится на localhostзатруднение отладки.

Как описано в руководстве :

В Unix программы MySQL обрабатывают имя хоста localhost специально, что, вероятно, отличается от того, что вы ожидаете по сравнению с другими сетевыми программами. Для подключения к localhost программы MySQL пытаются подключиться к локальному серверу с помощью файла сокета Unix. Это происходит, даже если для указания номера порта указана опция - -portили -P. Чтобы убедиться, что клиент устанавливает соединение TCP / IP с локальным сервером, используйте --hostили, -hчтобы указать значение имени хоста 127.0.0.1, или IP-адрес или имя локального сервера. Вы также можете указать протокол соединения явно, даже для localhost, используя --protocol=TCPопцию. Например:

shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP

--protocolОпция позволяет установить конкретный тип соединения , даже если другие варианты , как правило , по умолчанию какой - либо другой протокол.

HBruijn
источник
2
Ах! Это объясняет, почему я вижу localhost в сообщении об ошибке, когда ожидал увидеть 127.0.0.1. Тем не менее, пользователю root были предоставлены все привилегии @ 127.0.0.1, но я по-прежнему получаю сообщение об ошибке отказа в доступе при подключении через туннель SSH. Точное утверждение я побежал это:grant all on *.* to 'root'@'127.0.0.1' with grant option;
Адам
У меня есть эта проблема, и ясно, что это действительно проблема хоста против сокета. Когда я печатаю ssh -h 127.0.0.1 -u root -pудаленно на сервере, соединение также отклоняется.
fuzzyTew
Я разрешил -h 127.0.0.1сбой соединений на сервере, перезагрузив mysql, но сокет ssh по-прежнему не работает
fuzzyTew
Вот так. 1. Сервер должен предоставить @ 127.0.0.1. Это не заняло у меня, пока я не перезагрузил сервер. 2. Локальное соединение должно быть 127.0.0.1, а не localhost, чтобы вместо локального сокета использовался туннель.
fuzzyTew
1

Я видел в прошлом с ssh-туннелями, что есть разница между Grant all для «localhost» и Предоставить все для «127.0.0.1», поэтому попробуйте предоставить «127.0.0.1» вместо этого или в дополнение к вашему «localhost».

Сверре
источник
или наоборот, в вашем случае это выглядит так
Сверре
Спасибо, я обновил вопрос, чтобы включить список хостов, на которых предоставляется root. Мне показалось странным, что, несмотря на ввод «127.0.0.1» в качестве сервера MySQL в Sequel Pro, ошибка MySQL сообщала о нем как «localhost». Я не думаю, что это проблема, хотя.
Адам
у вас есть пароли для всех разных пользователей? также, когда вы подключаетесь к MySQL через туннель, какой синтаксис вы используете?
Сверре
есть ли какие-либо ограничения на пользователя Root в вашей настройке mysql?
Сверре
Просто повторите grantоператоры с, identified by ..чтобы убедиться, что все корневые пароли одинаковы, но без радости.
Адам
0

Вместо того, чтобы использовать Sequel для создания туннеля, что вы создаете туннель самостоятельно?

ssh -Cc blowfish -Nf -vv -L3306: localhost: 3306 sshuser @ domain

Затем подключитесь с помощью продолжения к 127.0.0.1:3306. Можете ли вы подключиться? Появляется ли что-нибудь на вашем терминале (или логи клиента ssh)?

Флориан Бидабе
источник