У нас есть производственный сервер MySQL со следующими грантами:
mysql> show grants for the_db;
+------------------------------------------------------------------------------------------------------------+
| Grants for db_user@% |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'db_user'@'%' IDENTIFIED BY PASSWORD '*A236932DB5549260BDC088C4BC2F0C6DB04424D7' |
| GRANT ALL PRIVILEGES ON `xydb`.* TO 'db_user'@'%' |
| GRANT SELECT ON `xyie-db`.* TO 'db_user'@'%' |
| GRANT SELECT ON `supportdb`.* TO 'db_user'@'%' |
| GRANT SELECT ON `xbs`.* TO 'db_user'@'%' |
+------------------------------------------------------------------------------------------------------------+
Можно ли заблокировать доступ к этим базам для определенного хоста? У нас есть новый сервер, который будет подключаться к сети, который будет использовать другие тестовые базы данных на том же сервере. Я не хочу, чтобы новый сервер мог случайно что-либо сделать с производственными базами данных.
Я понимаю, что могу использовать доступ REVOKE, но я не уверен, требует ли это изменения существующих ГРАНТОВ, чтобы они были более конкретными для хостов, которые они разрешают. Я не хочу гадать, поскольку производственные базы данных здесь используются постоянно, и случайная блокировка доступа для живого хоста была бы плохой.
В идеале мне нужно просто сказать:
BLOCK ACCESS ON 'xydb'.* TO 'db_user'@'192.168.1.4'
Если xydb
может иметь другой пароль mysql на производственном и тестовом серверах БД, тогда вы можете дать пользователю mysql "неправильный" пароль на живом сервере
mysql> SELECT VERSION();
+-------------------------+
| VERSION() |
+-------------------------+
| 5.1.73-0ubuntu0.10.04.1 |
+-------------------------+
Чтобы воссоздать вашу ситуацию:
mysql> SHOW GRANTS FOR db_user@`localhost`;
ERROR 1141 (42000): There is no such grant defined for user 'db_user' on host 'localhost'
mysql> SHOW GRANTS FOR db_user@`%`;
ERROR 1141 (42000): There is no such grant defined for user 'db_user' on host '%'
mysql> CREATE DATABASE xydb;
mysql> GRANT USAGE ON *.* TO 'db_user'@'%' IDENTIFIED BY '1234';
mysql> GRANT ALL PRIVILEGES ON `xydb`.* TO 'db_user'@'%';
mysql> SHOW GRANTS FOR db_user@`%`;
+--------------------------------------------------------------------------------------------------------+
| Grants for db_user@% |
+--------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'db_user'@'%' IDENTIFIED BY PASSWORD '*A4B6157319038724E3560894F7F932C8886EBFCF' |
| GRANT ALL PRIVILEGES ON `xydb`.* TO 'db_user'@'%' |
+--------------------------------------------------------------------------------------------------------+
mysql> FLUSH PRIVILEGES;
Это приводит к тому, что пользователь может войти в систему с localhost.
$ mysql -u db_user -p1234 --host localhost xydb -e 'SHOW DATABASES'
+--------------------+
| Database |
+--------------------+
| information_schema |
| xydb |
+--------------------+
Затем добавляется пользователь специально для хоста, который будет занесен в черный список.
mysql> GRANT USAGE ON *.* TO 'db_user'@'localhost' IDENTIFIED BY 'AAAAAA';
mysql> SHOW GRANTS FOR db_user@`localhost`;
+----------------------------------------------------------------------------------------------------------------+
| Grants for db_user@localhost |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'db_user'@'localhost' IDENTIFIED BY PASSWORD '*4F1779C9918AA4ADD1DDB16A274A8D098DDCC0D0' |
+----------------------------------------------------------------------------------------------------------------+
а затем пользователь больше не может входить в систему (если, конечно, он не дает правильный пароль)
mysql -u db_user -p1234 --host localhost xydb -e 'SHOW DATABASES'
ERROR 1045 (28000): Access denied for user 'db_user'@'localhost' (using password: YES)
Я не уверен, можно ли это сделать с помощью REVOKE
, но вы определенно можете сделать это, вставив запись в соответствующую таблицу в mysql
схема:
INSERT INTO mysql.db (Host,Db) VALUES ('192.0.2.42','xydb');
INSERT INTO mysql.db (Host,Db) VALUES ('host.example.com','xydb');
FLUSH PRIVILEGES;
Первые две строки выполняют тяжелую работу по вставке в БД; Лучше всего указать здесь и IP-адрес, и имя хоста для ясности, но при этом убедиться, что даже если обратный поиск не работает, IP-адрес все равно будет заблокирован. В FLUSH PRIVILEGES
требуется, потому что MySQL не просматривает таблицы каждый раз, когда ему нужно что-то узнать - он кэширует информацию в памяти. Вам нужно сказать MySQL, чтобы он очистил свой кеш.