Як надати користувачеві дозволи на віддалений доступ до сервера 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 з будь-якої іншої машини (в тій же мережі)?


6
Проста зміна localhostна доступ %дозволить отримати кореневий доступ до публічної мережі Не забувайтеflush privileges;

6
Додавання root @% наражає вас на великий ризик, і цього робити не слід. Я знаю, що це старий пост, але це попередження має бути тут. Кореневий обліковий запис - це перший аккаунт, на який спрямовані зловмисники, а root @ '%' означає, що користувач root може підключитися до вашого облікового запису MySQL з будь-якого місця, яке йому подобається. У коментарях є занадто багато, але ви повинні намагатися видалити якомога більше користувачів @ '%', а всі заявлені на це повинні мати дуже обмежені привілеї. Незважаючи ні на що, вам точно не слід додавати root @ '%', і ваші програми не повинні очікувати, що цей обліковий запис також буде присутній.
Деймон


Ей, люди, слід видалити рядок PASSWORD до цієї команди ... це спричиняє помилку ... просто закінчіть ІДЕНТИФІКІРОВАНО, а потім сам пароль.
Mário de Sá Vera

Відповіді:


143

Це надає кореневий доступ з тим самим паролем з будь-якої машини в *.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

3
Я виконував команду в mysql, але SHOW GRANTSвсе одно показує те саме (як у моєму запитанні). Я навіть зробив FLUSH PRIVILGES. Щось мені не вистачає?
Aufwind

@Aufwind я б не вимагав від вас нічого іншого, крім того FLUSH PRIVILEGES. Вийдіть із системи та поверніться до системи, перезапустіть службу mysqld, якщо у вас є доступ. Крім того, переконайтеся, що skip networkingрядок увімкнено у вашому, my.cnfхоча це не враховує, що ваше SHOW GRANTSвсе ще не буде таким.
Майкл Берковський

@Aufwind Якщо цього не вдасться, вам, можливо, доведеться запитати на сервері ServerFault.com.
Майкл Берковський

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
Він зазвичай використовується для введення паролем власника місця, кажучи: "поставте свій хороший прочитаний пароль у це місце".
moshe beeri

2
Ця команда зі звичайним застереженням, що ви хочете використовувати її лише для програм, де безпека не викликає занепокоєння, наприклад, розробник або QA.
einnocent

якщо його не працює на mac, спробуйте змінити 'root' @ '%' на 'root' @ 'localhost' або / etc / hosts імені комп'ютера, якому ви надаєте пільги.
moshe beeri

2
Не забудьте запустити це після:FLUSH PRIVILEGES;
Дейну

44

Вам потрібно зробити кілька кроків, щоб переконатися, що спочатку mysql, а потім користувач root має доступ іззовні:

  1. Відключити skip-networkingв my.cnf(тобто: /etc/mysql/my.cnf)

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

  3. Надати віддалений доступ кореневому користувачеві з будь-якого ip (або вказати свій ip замість %)

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

    sudo service mysql restart

Вам також потрібно відкрити порт mysql 3306 з брандмауера, інакше віддалені клієнти не підключаться
David Okwii

Лише коротке повідомлення про пункт 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.).


4

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

#bind-address = 127.0.0.1

Робота над Ubuntu 19.4
Ngô Văn Thao

3

У моєму випадку я намагався підключитися до віддаленого сервера mysql на ОС OS. Після перегляду багатьох рішень (надання всіх привілеїв, видалення ip-прив’язок, включення в мережу) проблема все ще не вирішувалася.

Як виявилося, переглядаючи різні рішення, я натрапив на iptables, завдяки чому я зрозумів, що порт mysql 3306 не приймає з'єднання.

Ось невеличка примітка про те, як я перевірив і вирішив цю проблему.

  • Перевірка, чи порт приймає з'єднання:
telnet (сервер mysql ip) [portNo]

-Додавання правила таблиці ip, щоб дозволити з'єднання на порту:

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

-Не рекомендував би це для виробничого середовища, але якщо ваші iptables не налаштовані належним чином, додавання правил може все-таки вирішити проблему. У цьому випадку слід зробити наступне:

сервісні iptables зупиняються

Сподіваюся, це допомагає.


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

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


Далі отримуємо "ПОМИЛКА 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, чи правильний синтаксис для використання поруч із пунктом "ІДЕНТИФІКОВАНИЙ" написаний пароль "у рядку 1

це означає, що у вас немає користувача root для% домену. тож спочатку потрібно вставити користувача, а потім надати такі привілеї:

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;

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


0

Це працювало для мене. Але виникла дивна проблема, що навіть я спробував спочатку тих, на які це не вплинуло. Я оновив сторінку phpmyadmin і змусив її якось працювати.

Якщо вам потрібен доступ до local-xampp-mysql. Ви можете перейти до командного рядка xampp-shell ->.

Тоді mysql -uroot -p --port = 3306 або mysql -uroot -p (якщо встановлено пароль). Після цього ви можете надати цей доступ з сторінки оболонки mysql (також можна працювати з localhost / phpmyadmin).

Просто додайте їх, якщо хтось знайде цю тему і має проблеми з початківцями.


0

Ubuntu 18.04

Встановіть та переконайтеся, що mysqld нас працює ..

Перейдіть у базу даних та налаштуйте кореневого користувача:

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 зовсім не допомагає безпеці, вона просто ускладнює і обтяжує, тепер її насправді простіше викрутити, ніж у старі часи, де ви просто використовували дійсно довгий пароль.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.