На компьютере «dexwin10» пара user @ host выглядит следующим образом:
root@dexwin10
root@%
root@localhost
Когда люди устанавливают наше программное обеспечение, мы хотим, чтобы они имели доступ к базе данных с компьютеров, отличных от своих. Это говорит мне, что localhost не следует указывать в качестве имени хоста, но я не уверен, какой из двух других использовать.
Вопросы:
1A.) root @ dexwin10
то же самое, что и root @ localhost
, если имя моего компьютера - dexwin10? Или root @ dexwin10
означает, что я могу войти / получить доступ к базе данных только с машины dexwin10, что имеет смысл, поскольку вы можете войти в root @ localhost только с локального хоста.
B.) Если я Я должен использовать 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)
В некотором смысле «безопасный» набор GRANT
будет включать:
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@'%';
без каких-либо GRANT
эффективно позволяет «root» из любого места, но не дает ему никаких разрешений. Это что-то вроде знака «Не допускать».
Взгляните на
SELECT * FROM mysql.user;
и имейте в виду, что N
означает «запрещено». Вероятно, вы увидите все N для user = root host =%. Для user = root host = localhost вы, вероятно, увидите все Y, включая Grant_priv
, который поступает из WITH GRANT OPTION
.
Пока я продолжаю, REVOKE
полусырые. Вы можете «отозвать» только точно то, что было ранее GRANTED
. Вы не можете дать много разрешений, а затем удалить подмножество.