На компьютере dexwin10 пара user @ host выглядит следующим образом:
root@dexwin10
root@%
root@localhost
Когда люди устанавливают наше программное обеспечение, мы хотим, чтобы они могли получить доступ к базе данных с компьютеров, отличных от их собственных. Это говорит мне, что localhost не следует указывать в качестве имени хоста, но я не уверен, какой из двух других использовать.
Вопросы:
1А.) root@dexwin10
такой же как root@localhost
если имя моего компьютера dexwin10? Или делает root@dexwin10
означает, что я могу войти / получить доступ к базе данных только с машины dexwin10, что имеет смысл, поскольку вы можете входить в систему только на root @ localhost с локального хоста.
Б.) Если я должен использовать root@dexwin10
и нет root@localhost
, это значит root@localhost
можно удалить? Или мне нужен localhost для предотвращения проблем?
2.) Должен ли я указать имя хоста «%» во время установки нашего программного обеспечения, когда оно запрашивает у нас имя хоста, содержащего базу данных, которую мы хотим использовать, или мне следует ввести «dexwin10»? Какие могут быть побочные эффекты от ввода просто "%" в качестве имени хоста?
3. (необязательно), если root@(MachineName)
и root@%
одинаковы, почему установщик MySQL не делает хостом по умолчанию имя вашего компьютера, а не некоторую, казалось бы, случайную строку с именем "localhost"?
Я попытался выяснить, почему было 3 хоста для root (один с именем моего компьютера, один с% и один с localhost), и все ответы говорят о пользователях / хостах mysql по умолчанию. Это не пользователи по умолчанию.
"localhost" - особое имя. name@localhost
подразумевает соединение "сокет". Это можно использовать только от клиента на тем же машина как сервер mysql.
Все остальное предполагает соединение TCP / IP, которое может быть к разные машина.
При проверке пользователя имя и происхождение пользователя используются для поиска строки в GRANT
таблицы (mysql.user
, и т.д). То есть, если вы входите через TCP / IP, нет localhost
запись просматривается. И наоборот.
Адрес TCP / IP для «текущего компьютера»: 127.0.0.1
. Так...
mysql -h localhost -- uses a socket and checks `localhost` entries
mysql -h 127.0.0.1 -P 13306 -- uses TCP/IP on same machine
(and a non-standard Port)
Несколько «безопасный» набор GRANTs
будет включать:
GRANT ... TO root@localhost ...; -- you have to get into the machine to use it
_no_ GRANT ... TO root@hostname ...; -- don't allow access from elsewhere
GRANT ... ON dbname.* TO user@hostname ...; -- allow a user into one database from anywhere
С помощью %
(или другие спецификации подстановочных знаков) для имени хоста подвергают сервер атакам со стороны произвольных серверов. Использование IP-адресов вместо имен хостов немного более безопасно.
Также обратите внимание:
CREATE USAGE ON *.* TO root@'%';
без всяких GRANTs
эффективно позволяет "root" из любого места, но не дает ему никаких прав. Это своего рода знак "держись подальше".
Взгляни на
SELECT * FROM mysql.user;
и имейте в виду, что N
означают "не разрешено". Наверное ты увидишь все Ns для пользователя = корневой хост =%. Для user = root host = localhost вы, вероятно, увидите все Y, включая Grant_priv
, который исходит из WITH GRANT OPTION
.
Пока я бреду, REVOKE
полусырой. Вы можете "отозвать" только именно что было раньше GRANTed
. Вы не можете дать много разрешений, а затем удалить подмножество.