Jak nadać użytkownikowi uprawnienia dostępu zdalnego do serwera mysql?

118

Jeśli zrobię to SHOW GRANTSw mojej bazie danych mysql, otrzymam

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

Jeśli się nie mylę, root@localhostoznacza to, że użytkownik rootma dostęp do serwera tylko z localhost. Jak powiedzieć MySQL, aby udzielił rootpozwolenia na dostęp do tego serwera mysql z każdej innej maszyny (w tej samej sieci)?

Aufwind
źródło
6
Prosta zmiana localhostna %przyzna uprawnienia roota do sieci publicznej. Nie zapomnijflush privileges;
6
Dodanie root @% naraża Cię na duże ryzyko i nie powinno być wykonywane. Wiem, że to stary post, ale to ostrzeżenie powinno tu być. Konto root jest pierwszym kontem atakowanym przez atakujących, a root @ '%' oznacza, że ​​użytkownik root może połączyć się z Twoim kontem MySQL z dowolnego miejsca. Jest zbyt wiele do omówienia w komentarzach, ale powinieneś spróbować usunąć jak najwięcej użytkowników @ '%', jak to możliwe, a wszyscy zadeklarowani jako tacy powinni mieć bardzo ograniczone uprawnienia. Bez względu na wszystko, zdecydowanie nie powinieneś dodawać root @ '%', a twoje aplikacje nie powinny oczekiwać, że to konto będzie obecne.
Damon
Zobacz także Włącz zdalne połączenie MySQL
użytkownik
Hej ludzie, powinniśmy usunąć ciąg PASSWORD do tego polecenia ... powoduje to błąd ... po prostu zakończ z IDENTIFIED BY, a następnie podaj samo hasło.
Mário de Sá Vera

Odpowiedzi:

143

Zapewnia to dostęp roota z tym samym hasłem z dowolnej maszyny w *.example.com:

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

Jeśli rozpoznawanie nazw nie będzie działać, możesz również przyznać dostęp przez adres IP lub podsieć:

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

Dokumentacja GRANTskładni MySQL .

Michaela Berkowskiego
źródło
15
Zakładam, ...TO 'root'@'%' IDENTIFIED...że zezwoliłbym na dostęp z dowolnego miejsca?
Aufwind
3
Wykonałem polecenie w mysql, ale SHOW GRANTSnadal pokazuje to samo (jak w moim pytaniu). Nawet to zrobiłem FLUSH PRIVILGES. Czy jest coś, za czym tęsknię?
Aufwind
@Aufwind Nie wykluczam, że będziesz potrzebować niczego innego FLUSH PRIVILEGES. Wyloguj się i zaloguj ponownie, uruchom ponownie usługę mysqld, jeśli masz dostęp. Upewnij się również, że skip networkinglinia nie jest włączona w twoim my.cnfmyśleniu, co nie wyjaśniałoby, że SHOW GRANTSnadal nie jesteś taki sam.
Michael Berkowski
@Aufwind W przeciwnym razie możesz zamiast tego zapytać o to na ServerFault.com.
Michael Berkowski
10
Zauważ, że IDENTIFIED BY PASSWORDtowarzyszy mu zaszyfrowana 41-cyfrowa liczba szesnastkowa. Użyj, IDENTIFIED BY 'password'jeśli chcesz bezpośrednio dołączyć hasło.
Rainulf
94

Próbować:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Pa55w0rd' WITH GRANT OPTION;
moshe beeri
źródło
1
umm, co Pa55w0rdwydaje się głupie, nie mów mi, że to hasło, które chcesz stworzyć. Dla każdego, kto próbuje zalogować się do Twojego mysql?
SSpoke
23
Zwykle jest używany do podania miejsca na hasło, mówiąc „umieść swoje dobre hasło do czytania w tym miejscu”.
moshe beeri
2
To polecenie ze zwykłym zastrzeżeniem, że chcesz go używać tylko w aplikacjach, w których bezpieczeństwo nie jest ważne, np. Dev lub QA.
einnocent
jeśli nie działa na komputerze Mac, spróbuj zmienić „root” @ „%” na „root” @ „localhost” lub / etc / hosts, do której przypisujesz uprawnienia.
moshe beeri
2
Nie zapomnij, aby uruchomić to po:FLUSH PRIVILEGES;
dane Nie
44

Musisz podjąć pewne kroki, aby upewnić się, że najpierw mysql, a następnie użytkownik root jest dostępny z zewnątrz:

  1. Wyłącza skip-networkingsię my.cnf(tj /etc/mysql/my.cnf)

  2. Sprawdź wartość bind-addressin my.cnf, jeśli jest ustawiona na 127.0.0.1, możesz ją zmienić, 0.0.0.0aby zezwolić na dostęp ze wszystkich adresów IP lub dowolnego adresu IP, z którego chcesz się połączyć.

  3. Przyznaj zdalny dostęp użytkownikowi root z dowolnego adresu IP (lub podaj swój adres IP zamiast %)

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
        IDENTIFIED BY 'your_root_password'
        WITH GRANT OPTION;
    FLUSH PRIVILEGES;`
    
  4. Zrestartuj usługę mysql:

    sudo service mysql restart
Khashayar
źródło
Musisz także otworzyć port mysql 3306 z zapory, w przeciwnym razie zdalni klienci nie będą się łączyć
David Okwii
Wystarczy krótka informacja w punkcie 2 z @Khashayar: 0.0.0.0 oznacza dowolny adres IPv4. * oznacza DOWOLNY adres, czy to IPv4, czy IPv6.
Gustavo Pinsard
34
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' 
    IDENTIFIED BY 'YOUR_PASS' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;  

*.* = DB.TABLE możesz ograniczyć użytkownika do określonej bazy danych i określonej tabeli.

'root'@'%'możesz zmienić roota dla dowolnego utworzonego użytkownika, a% ma zezwolić na wszystkie IP. Możesz to ograniczyć, zmieniając również% .168.1.1 itd.


Jeśli to nie rozwiąże problemu, zmodyfikuj również my.cnf lub my.ini i skomentuj te wiersze

bind-address = 127.0.0.1do #bind-address = 127.0.0.1
i
skip-networkingdo#skip-networking

  • Uruchom ponownie MySQL i powtórz powyższe kroki ponownie.

Raspberry Pi, znalazłem konfigurację adresu powiązania pod \etc\mysql\mariadb.conf.d\50-server.cnf

Wasim A.
źródło
2
Tylko odpowiedź, która wyjaśnia *.*i 'user'@'address'część. Dzięki! :)
Filip
Przyznanie WSZYSTKIEGO na . zaprasza hakerów do środka.
Rick James
dlatego wyjaśniłem *. *
Wasim A.
8

Te uprawnienia SQL współdzielone przez innych działają. Jeśli nadal nie możesz uzyskać dostępu do bazy danych, możliwe, że masz tylko ograniczenie zapory sieciowej dla portu. To zależy od typu serwera (i routerów pomiędzy nimi), jak nawiązać połączenie. Otwórz przychodzący port TCP 3306 i nadaj mu podobną regułę dostępu dla maszyn zewnętrznych (wszystkie / podsieć / pojedynczy adres IP / itd.).

user171212
źródło
4

Otwórz /etc/mysql/mysql.conf.d/mysqld.cnfplik i skomentuj następujący wiersz:

#bind-address = 127.0.0.1
Vik2696
źródło
Praca nad Ubuntu 19.4
Ngô Văn Thao
3

W moim przypadku próbowałem połączyć się ze zdalnym serwerem mysql na cent OS. Po przejściu przez wiele rozwiązań (przyznanie wszystkich uprawnień, usunięcie powiązań IP, włączenie sieci) problem nadal nie był rozwiązany.

Jak się okazało, patrząc na różne rozwiązania natknąłem się na iptables, co uświadomiło mi, że port mysql 3306 nie akceptuje połączeń.

Oto mała uwaga na temat tego, jak sprawdziłem i rozwiązałem ten problem.

  • Sprawdzanie, czy port akceptuje połączenia:
telnet (adres IP serwera mysql) [nr portu]

-Dodanie reguły tablicy IP, aby zezwolić na połączenia na porcie:

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

-Nie zalecamy tego dla środowiska produkcyjnego, ale jeśli twoje iptables nie są poprawnie skonfigurowane, dodanie reguł może nadal nie rozwiązać problemu. W takim przypadku należy wykonać następujące czynności:

usługa iptables zatrzymuje się

Mam nadzieję że to pomoże.

Kushal
źródło
3

Dwa kroki:

  1. skonfiguruj użytkownika za pomocą symbolu wieloznacznego:
    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
    dodaj następujące informacje:
    bind-address=0.0.0.0

zrestartuj serwer, nie powinieneś mieć problemu z połączeniem się z nim.

studio1057
źródło
Następnie otrzymujemy komunikat „ERROR 1827 (HY000): Skrót hasła nie ma oczekiwanego formatu. Sprawdź, czy z funkcją PASSWORD () jest używany poprawny algorytm hasła”. Czy mógłbyś wyjaśnić, co tu robię?
lampShadesDrifter
2

W mysql 8 i nowszych wersjach nie możesz dodać użytkownika poprzez nadanie mu uprawnień. to znaczy z tym zapytaniem:

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

mysql zwróci ten błąd:

BŁĄD 1064 (42000): Wystąpił błąd w składni SQL; sprawdź podręcznik, który odpowiada Twojej wersji serwera MySQL, aby uzyskać właściwą składnię, której należy użyć w pobliżu `` IDENTIFIED BY '' zapisane hasło '' w linii 1

oznacza to, że nie masz użytkownika root dla domeny%. więc musisz najpierw wstawić użytkownika, a następnie nadać takie uprawnienia:

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;

Nie zapomnij zastąpić haseł określonymi hasłami.

MhDG7
źródło
0

To zadziałało dla mnie. Ale był dziwny problem, na który nawet ja wypróbowałem najpierw te, na które nie miał wpływu. Zaktualizowałem stronę phpmyadmin i jakoś to działa.

Jeśli potrzebujesz dostępu do local-xampp-mysql. Możesz przejść do xampp-shell -> otwierając wiersz polecenia.

Następnie mysql -uroot -p --port = 3306 lub mysql -uroot -p (jeśli jest ustawione hasło). Następnie możesz przyznać te dostęp ze strony powłoki mysql (może również działać z localhost / phpmyadmin).

Po prostu dodaj je, jeśli ktoś znajdzie ten temat i ma początkowe problemy.

icemanzzz
źródło
0

Ubuntu 18.04

Zainstaluj i upewnij się, że mysqld us działa.

Wejdź do bazy danych i skonfiguruj użytkownika 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;

Edytuj uprawnienia mysqld i uruchom ponownie:

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

Z innego komputera, przetestuj .. Port Obvs (3306) na maszynie mysqld musi zezwalać na połączenie z maszyny testowej.

mysql -u root -p -h 123.456.789.666

Wszystkie dodatkowe „zabezpieczenia” MySql w ogóle nie pomagają w zabezpieczeniach, tylko komplikują i zaciemniają, teraz jest łatwiej zepsuć to niż w dawnych czasach, kiedy używałeś naprawdę długiego hasła.

Peter Prographo
źródło