Як надати користувачеві дозволи на віддалений доступ до сервера 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.