Запрет доступа для определенного хоста определенной базы данных по mysql

У нас есть производственный сервер 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'@'%'                                                               |
+------------------------------------------------------------------------------------------------------------+

Действительно ли возможно блокировать доступ к этим базам данных для определенного хоста? У нас есть новый сервер, прибывающий онлайн, который будет использовать другие тестовые базы данных по тому же серверу. Я не хочу, чтобы новый сервер смог случайно сделать что-либо на производственных базах данных.

Я понимаю, что могу использовать, ОТКЛОНЯЮТ доступ, но я не уверен, требует ли это, чтобы изменение существующих ПРЕДОСТАВЛЕНИЙ было более характерно для хостов, которые они позволяют. Я не хочу предполагать, как производство dbs вот находится в постоянном употреблении, и случайно блокирование доступа для живого хоста было бы плохо.

Идеально я должен смочь просто сказать:

BLOCK ACCESS ON 'xydb'.* TO 'db_user'@'192.168.1.4'
0
задан 12 August 2015 в 10:39
2 ответа

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

.
1
ответ дан 4 December 2019 в 13:47

Если 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)
1
ответ дан 4 December 2019 в 13:47

Теги

Похожие вопросы