拒绝特定的主机访问特定的数据库在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'@'%' | +------------------------------------------------------------------------------------------------------------+ 

是否有可能阻止访问这些数据库的特定主机? 我们有一台新的服务器上线,将在同一台服务器上使用其他testing数据库。 我不希望新服务器能够在生产数据库上意外执行任何操作。

我知道我可以使用REVOKE访问,但我不确定这是否需要改变现有的GRANTS,以使它们允许的主机更具体。 我不想猜测,因为这里的生产数据库经常被使用,并且意外地阻止访问现场主机将是不好的。

理想情况下,我需要能够只说:

 BLOCK ACCESS ON 'xydb'.* TO 'db_user'@'192.168.1.4' 

我不确定是否可以使用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; 

前两行做了插入DB的繁重工作; 为了清楚起见,最好将IP和主机名放在那里,同时仍然要确保即使反向查找不起作用,IP仍然会被阻塞。 FLUSH PRIVILEGES是必需的,因为MySQL在每次需要知道某些内容时都不会查看表 – 它将信息caching在内存中。 你需要告诉MySQL刷新它的caching。

如果xydb在生产和testing数据库服务器上可能有不同的mysql密码,那么你可以给mysql用户在活动服务器上input一个“错误的”密码

 mysql> SELECT VERSION(); +-------------------------+ | VERSION() | +-------------------------+ | 5.1.73-0ubuntu0.10.04.1 | +-------------------------+ 

重新创build你的情况:

 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; 

这导致用户能够从本地主机login

 $ 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' | +----------------------------------------------------------------------------------------------------------------+ 

然后用户不能再login(除非他给出正确的密码)

 mysql -u db_user -p1234 --host localhost xydb -e 'SHOW DATABASES' ERROR 1045 (28000): Access denied for user 'db_user'@'localhost' (using password: YES)