Błąd odmowy dostępu do MySQL podczas łączenia przez tunel SSH

12

Od miesięcy łączę się z instancją MySQL działającą na naszym lokalnym serwerze testowym przez tunel SSH bez żadnych problemów. Nagle jednak, bez żadnych zmian, które mogę wymyślić, serwer zaczął odrzucać próbę logowania z Sequel Pro z błędem:

Nie można połączyć się z hostem 127.0.0.1, ponieważ odmówiono dostępu.

Sprawdź dwukrotnie swoją nazwę użytkownika i hasło oraz upewnij się, że dostęp z bieżącej lokalizacji jest dozwolony.

MySQL powiedział: Odmowa dostępu dla użytkownika „root” @ „localhost” (przy użyciu hasła: TAK)

Jestem w stanie zalogować się z terminala, gdy jestem podłączony bezpośrednio do serwera przez SSH, ale nie przez tunel SSH. Problem nie jest specyficzny ani dla Sequel Pro, ani dla mnie samego, pojawia się ten sam błąd podczas łączenia przez MySQL Workbench, jak inni w biurze. Zresetowałem hasło mysqladmintylko dla zachowania rozsądku, to zdecydowanie nie jest problem.

Kiedy zacząłem bardziej się tym zajmować, zauważyłem, że błąd zgłaszał serwer jako „localhost”, zamiast „127.0.0.1”, który wprowadziłem w Sequel Pro. Przyjaciel zasugerował, że to prawdopodobnie po prostu zła obsługa błędów, ale wydaje się to dziwne, biorąc pod uwagę znaczącą różnicę między localhost a 127.0.0.1 w MySQL.

Próbując obejść problem z tunelowaniem, przyznałem dostęp do root @%, dzięki czemu mogę się połączyć bezpośrednio. Działa to w przeważającej części, mogę wyświetlać dane tabeli, tworzyć nowe bazy danych itp. Jedynym problemem jest to, że kiedy przychodzę tworzyć użytkowników, pojawia się błąd:

Odmowa dostępu dla użytkownika „root” @ „%” (przy użyciu hasła: TAK)

Dziwne, że użytkownik został stworzony, myślę, że to tylko problem z dotacją. Znów jednak z terminala mogę zrobić wszystko, gdy jestem zalogowany jako root.

Czy ktoś może wyjaśnić, dlaczego połączenia tunelowe i (prawdopodobnie) polecenia przyznania otrzymują błąd odmowy dostępu?

Dla porównania MySQ to wersja 5.6.16 z przeważnie domyślnymi ustawieniami, instalowana przez Homebrew na komputerze z systemem Mac OS X Server.

Aktualizacja

Oto lista hostów, do których root ma obecnie dostęp:

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)

Jak rozumiem, pierwszy wiersz („%”) powinien naprawdę sprawić, że pozostałe będą zbędne?

Aktualizacja 2

Naprawiono problem z dotacją; Użytkownik root @% nie otrzymał wszystkich uprawnień z dodatkowymi with grant optionna końcu, więc mógł zrobić wszystko oprócz przyznania. Nadal chciałbym wiedzieć, dlaczego odmawia się tuneli SSH.

Adam
źródło
więc zanim utworzyłeś konto „%”, utworzyłeś „127.0.0.1” i „localhost” i oba nie działały, czy to prawda?
Sverre
localhost działa tylko wtedy, gdy faktycznie znajdujesz się na właściwym hoście, więc teoretycznie tylko 127.0.0.1 (sieciowy odpowiednik localhost) powinien działać w tunelu ssh. przynajmniej w systemach uniksowych.
Sverre

Odpowiedzi:

18

W MySQL localhostsłowo kluczowe jest zarezerwowane do połączenia za pomocą gniazda MySQL i powinieneś używać adresu IP 127.0.0.1do połączeń TCP z portem sieci MySQL na 127.0.0.1. Oznacza to, że zarówno serwer musi nadawać uprawnienia użytkownikom 127.0.0.1, a klient musi -h 127.0.0.1przejść przez tunel zamiast łączyć się z gniazdem lokalnym.

Aby umożliwić dostęp za pomocą przekierowania portów SSH, potrzebujesz czegoś takiego:

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

a następnie biegnij

FLUSH PRIVILEGES;

i ewentualnie

FLUSH QUERY CACHE;

Jeśli nadal nie działa, zrestartuj proces serwera.

W komunikatach o błędach 127.0.0.1 po odwróceniu wyszukiwania DNS zostaje przetłumaczone, localhostco utrudnia debugowanie.

Zgodnie z opisem w instrukcji :

W Uniksie programy MySQL traktują nazwę hosta localhost specjalnie w sposób, który prawdopodobnie różni się od oczekiwanego w porównaniu z innymi programami sieciowymi. W przypadku połączeń z hostem lokalnym programy MySQL próbują połączyć się z serwerem lokalnym przy użyciu pliku gniazda Unix. Dzieje się tak, nawet jeśli podano opcję - -portlub -Popcję określającą numer portu. Aby upewnić się, że klient nawiązuje połączenie TCP / IP z serwerem lokalnym, użyj --hostlub, -haby określić wartość nazwy hosta 127.0.0.1lub adres IP lub nazwę serwera lokalnego. Możesz także jawnie określić protokół połączenia, nawet dla localhost, używając --protocol=TCPopcji. Na przykład:

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

Ta --protocolopcja umożliwia nawiązanie określonego rodzaju połączenia, nawet jeśli inne opcje zwykle byłyby ustawione domyślnie na inny protokół.

HBruijn
źródło
2
Ach! To wyjaśnia, dlaczego widzę localhost w komunikacie o błędzie, gdy spodziewałem się zobaczyć 127.0.0.1. Niemniej jednak użytkownik root otrzymał wszystkie uprawnienia @ 127.0.0.1, ale nadal pojawia się błąd odmowy dostępu podczas łączenia przez tunel SSH. Dokładne stwierdzenie, które prowadziłem to:grant all on *.* to 'root'@'127.0.0.1' with grant option;
Adam
Mam ten problem i jasne jest, że rzeczywiście jest to problem hosta z gniazdem. Kiedy piszę ssh -h 127.0.0.1 -u root -pzdalnie na serwerze, połączenie jest również odrzucane.
fuzzyTew
Rozwiązałem -h 127.0.0.1problemy z połączeniami na serwerze poprzez ponowne uruchomienie mysql, ale gniazdo ssh nadal nie działa
fuzzyTew
No to ruszamy. 1. Serwer musi udzielić @ 127.0.0.1. Nie zajęło mi to, dopóki nie zrestartowałem serwera. 2. Połączenie lokalne musi być do 127.0.0.1, a nie localhost, aby tunel był używany zamiast gniazda lokalnego.
fuzzyTew
1

W przeszłości widziałem w tunelach ssh, że istnieje różnica między Grant all na „localhost” i all na „127.0.0.1”, więc spróbuj nadać „127.0.0.1” zamiast lub oprócz twojego „localhost”.

Sverre
źródło
lub odwrotnie, w twoim przypadku wygląda to
Sverre
Dzięki, zaktualizowałem pytanie, aby zawierało listę hostów, na których udziela się root. Dziwne było to, że pomimo wpisania „127.0.0.1” jako serwera MySQL w Sequel Pro, błąd MySQL zgłaszał go jako „localhost”. Ale nie sądzę, że to jest problem.
Adam
czy masz hasła do różnych użytkowników? także, kiedy łączysz się z mysql przez tunel, jakiej faktycznie używasz składni?
Sverre
czy są jakieś ograniczenia dla użytkownika root w twojej konfiguracji mysql?
Sverre
Wystarczy ponownie uruchomić grantinstrukcje, identified by ..aby upewnić się, że wszystkie hasła roota są takie same, ale bez radości.
Adam
0

Zamiast używać Sequel do tworzenia tunelu, co sam tworzysz tunel?

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

Następnie połącz za pomocą Sequel do 127.0.0.1:3306 Czy możesz się połączyć? Czy coś pojawia się na twoim terminalu (lub logach klienta ssh)?

Florian Bidabe
źródło