第 64.1 节:最佳实践
限制 root(以及任何具有 SUPER 特权的用户)只能从本地连接:
GRANT ... TO root@localhost ...
这样可以防止从其他服务器访问。SUPER 权限应只授予极少数人,并且他们应了解其责任。应用程序不应拥有 SUPER 权限。
将应用程序登录限制到它使用的唯一数据库:
GRANT ... ON dbname.* ...
这样,即使有人攻破了应用程序代码,也无法越过 dbname。还可以进一步细化:
GRANT SELECT ON dbname.* ... -- "只读"
GRANT ... ON dbname.tblname ... -- "仅单表"
只读权限可能还需要一些“安全”的操作,例如:
GRANT SELECT, CREATE TEMPORARY TABLE ON dbname.* ... -- "只读"
如前所述,没有绝对的安全。我的观点是你可以做一些事情来延缓黑客的攻击(同样也适用于犯错的好心人)。
在极少数情况下,应用程序可能需要执行只有 root 才能做的操作。这可以通过一个带有 SECURITY DEFINER(由 root 定义)的“存储过程”来实现。这样只会暴露存储过程所做的事情,例如可能是对某个特定表的某个特定操作。
第 64.2 节:主机(user@host 中的 host)
“主机”可以是主机名或 IP 地址。也可以包含通配符。
GRANT SELECT ON db.* TO 'same*'@'my.domain.com' IDENTIFIED BY 'foo';
示例:(通常需要用引号括起来)
localhost—— 与 MySQL 同一台机器'my.domain.com'—— 特定域名,涉及解析'11.22.33.44'—— 特定 IP 地址'192.168.1.%'—— IP 地址尾部的通配符。(192.168.%、10.%和11.%是“内部”IP 地址。)
使用 localhost 依赖于服务器的安全性。最佳实践是,root 只应允许通过 localhost 进入。在某些情况下,以下地址含义相同:0.0.0.1 和 ::1。