第 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。