
MySQL从入门到精通-10第七章.doc
28页本章要点: MySQL 权限系统原理 如何授予撤销用户和授权 如何直接修改授权表 授予用户权限的规范和注意事项 作为一个 MySQL 的系统管理员,你有责任维护你的 MySQL 数据库系统的数据 安全性和完整性本文主要主要介绍如何建立一个安全的 MySQL 系统,从系统内部 和外部网络两个角度,为你提供一个指南 本章主要考虑下列安全性有关的问题: 为什么安全性很重要,你应该防范那些攻击? 服务器面临的风险(内部安全性),如何处理? 连接服务器的客户端风险(外部安全性),如何处理? MySQL 管理员有责任保证数据库内容的安全性,使得这些数据记录只能被那些 正确授权的用户访问,这涉及到数据库系统的内部安全性和外部安全性 内部安全性关心的是文件系统级的问题,即,防止 MySQL 数据目录 (DATADIR)被在服务器主机有账号的人(合法或窃取的)进行攻击如果数据目录 内 容的权限过分授予,使得每个人均能简单地替代对应于那些数据库表的 文件,那么确保控 制客户通过网络访问的授权表设置正确,对此毫无意义 外部安全性关心的是从外部通过网络连接服务器的客户的问题,即,保护 MySQL 服务器免受来自通过网络对服务器的连接的攻击。
你必须设置 MySQL 授权表(grant table),使得他们不允许访问服务器管理的数据库内容,除非提供有效的用户名和口令 数数数数数数据据据据据据库库库库库库安安安安安安全全全全全全 第第第第7 7 7章章章章 下面就详细介绍如何设置文件系统和授权表 mysql,实现 MySQL 的两级安全性 7.1 MySQL 的权限系统 MySQL 有一套先进的但非标准的安全/授权系统,掌握其授权机制是开始操作 MySQL 数据库必须要走的第一步,对于一个熟悉 SQL 基本操作的人来说,也是 MySQL 所有的知识中比较难以理解的一个部分本节通过揭开其授权系统的运作机制, 希望大家能够可以更好地操作和使用这个优秀的数据库系统 MySQL 的安全系统是很灵活的,它允许你以多种不同方式设置用户权限一般地, 你可使用标准的 SQL 语句 GRANT 和 REVOKE 语句做,他们为你修改控制客户访问的 授权表,然而,你可能由一个不支持这些语句的老版本的 MySQL(在 3.22.11 之前这些 语句不起作用),或者你发觉用户权限看起来不是以你想要的方式工作对于这种情况, 了解 MySQL 授权表的结构和服务器如何利用它们决定访问权限是有帮助的,这样的了 解允许你通过直接修改授权表增加、删除或修改用户权限,它也允许你在检查这些表时 诊断权限问题。
7.1.1 授权表的结构 通过网络连接服务器的客户对 MySQL 数据库的访问由授权表内容来控制这些表 位于 mysql 数据库中,并在第一次安装 MySQL 的过程中初始化(运行 mysql_install_db 脚本)授权表共有 5 个表:user、db、host、tables_priv 和 columns_priv 7.1.1.1 授权表 user、db 和 host 的结构和作用 表 7-1 授权表 user、db 和 host 的结构 User 表Db 表Host 表 作用域列 HostHostHost DbDb UserUser Password 数据库/表的权限列 Alter_privAlter_privAlter_priv Create_privCreate_privDelete_priv Delete_privDrop_privDrop_priv Index_privIndex_privIndex_priv Insert_privInsert_privReferences_priv References_privSelect_privSelect_priv Update_privUpdate_privUpdate_priv Alter_privAlter_privAlter_priv File_priv Grant_privGrant_privGrant_priv Process_priv Reload_priv Shutdown_priv 授权表的内容有如下用途: user 表 user 表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用 户)权限。
在 user 表启用的任何权限均是全局权限,并适用于所有数据库例如,如果 你启用了 DELETE 权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做 之前要认真考虑 db 表 db 表列出数据库,而用户有权限访问它们在这里指定的权限适用于一个数据库中 的所有表 host 表 host 表与 db 表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这 可能比单独使用 db 好些这个表不受 GRANT 和 REVOKE 语句的影响,所以,你可能 发觉你根本不是用它 7.1.1.2 授权表 tables_priv 和 columns_priv 的结构和作用 表 7-2 授权表 tables_priv 和 columns_priv 的结构 授权表 tables_priv授权表 columns_priv 作用域列 HostHost DbDb UserUser Table_nameTable_name Column_name 权限列 Table_privColumn_priv 其他列 TimestampTimestamp Grantor MySQL 没有 rows_priv 表,因为它不提供记录级权限,例如,你不能限制用户于表中 包含特定列值的行。
如果你确实需要这种能力,你必须用应用编程来提供如果你想执行 建议的记录级锁定,你可用 GET_LOCK()函数做到 授权表的内容有如下用途: tables_priv 表 tables_priv 表指定表级权限,在这里指定的一个权限适用于一个表的所有列 columns_priv 表 columns_priv 表指定列级权限这里指定的权限适用于一个表的特定列 tables_priv 和 columns_priv 表在 MySQL 3.22.11 版引进(与 GRANT 语句同时)如果 你有较早版本的 MySQL,你的 mysql 数据库将只有 user、db 和 host 表如果你从老版本 升级到 3.22.11 或更新,而没有 tables_priv 和 columns_priv 表,运行 mysql_fix_privileges_tables 脚本创建它们 7.1.2 用户的权限 权限信息用 user、db、host、tables_priv 和 columns_priv 表被存储在 mysql 数据库中 (即在名为 mysql 的数据库中)在 MySQL 启动时和在 7.5 权限修改何时生效所说的情况 时,服务器读入这些数据库表内容。
7.1.2.1 数据库和表的权限 下列权限运用于数据库和表上的操作 SELECT 允许你使用 SELECT 语句从表中检索数据SELECT 语句只有在他们真正从一个表 中检索行是才需要 select 权限,你可以执行某个 SELECT 语句,甚至没有任何到服务器 上的数据库里的存取任何东西的许可例如,你可使用 mysql 客户作为一个简单的计算 器: mysql> SELECT 1+1; mysql> SELECT PI()*2; UPDATE 允许你修改表中的已有的记录 INSERT 允许在表中插入记录 DELETE 允许你从表中删除现有记录 ALTER 允许你使用 ALTER TABLE 语句,这其实是一个简单的第一级权限,你必须由其他 权限,这看你想对数据库实施什么操作 CREATE 允许你创建数据库和表,但不允许创建索引 DROP 允许你删除(抛弃)数据库和表,但不允许删除索引 注意:如果你将 mysql 数据库的 drop 权限授予一个用户,该用户能抛弃存储了 MySQL 存取权限的数据库! INDEX 允许你创建并删除索引 REFERENCES 目前不用。
7.1.2.2 管理权限 下列权限运用于控制服务器或用户授权能力的操作的管理性操作 FILE 允许你告诉服务器读或写服务器主机上的文件该权限不应该随便授予,它很危险, 见“回避授权表风险”服务器确实较谨慎地保持在一定范围内使用该权限你只能读 任何人都能读的文件你正在写的文件必须不是现存的文件,这防止你迫使服务器重写 重要文件,如/etc/passwd 或属于别人的数据库的数据目录 如果你授权 FILE 权限,确保你不以 UNIX 的 root 用户运行服务器,因为 root 可在 文件系统的任何地方创建新文件如果你以一个非特权用户运行服务器,服务器只能在 给用户能访问的目录中创建文件 GRANT 允许你将你自己的权限授予别人,包括 GRANT PROCESS 允许你通过使用 SHOW PROCESS 语句或 mysqladmin process 命令查看服务器内正 在运行的线程(进程)的信息这个权限也允许你用 KILL 语句或 mysqladmin kill 命令 杀死线程 你总是能看到或杀死你自己的线程PROCESS 权限赋予你对任何线程做这些事情 的能力 RELOAD 允许你执行大量的服务器管理操作。
你可以发出 FLUSH 语句,你也能指性 mysqladmin 的 reload、refresh、flush-hosts、flush-logs、flush-privileges 和 flush-tables 等 命令 SHUTDOWN 允许你用 mysqladmin shutdown 关闭服务器 在 user、db 和 host 表中,每一个权限以一个单独的列指定这些列全部声明为一 个 ENUM("N","Y")类型,所以每个权的缺省值是“N”在 tables_priv 和 columns_priv 中的权限以一个 SET 表示,它允许权限用一个单个列以任何组合指定这两个表比其他 三个表更新,这就是为什么它们使用更有效的表示方式的原因有可能在未来, user、db 和 host 表也用一个 SET 类型表示 7.1.3 授权表列的内容 7.1.3.1 作用域列内容 一些范围列要求文字值,但它们大多数允许通配符或其他特殊值 表 7-3 作用域列的类型 字段名类型 HostCHAR(60) UserCHAR(16) PasswordCHAR(16) DbCHAR(64) (tables_priv 和 columns_priv 表为 CHAR(60)) Host 一个 Host 列值可以是一个主机名或一个 IP 地址。
值 localhost 意味着本地主机,但 它只在你用一个 localhost 主机名时才匹配,而不是你在使用主机名时假如你的本地主 机名是 并且在 user 表中有对你的两条记录,一个有一个 Host 值或 localhost,而另一个有 ,有 localhost 的记录将只当你连接 localhost 时匹配, 其他在只在连接 时才匹配如果你想让客户能以两种方式连接,你需要在 user 表中有两条记录 你也可以用通配符指定 Host 值可以使用 SQL 的模式字符“%”和“_”并具有当 你在一个查询中使用 LIKE 算符同样的含义(不允许 regex 算符) SQL 模式字符都能 用于主机名和 IP 地址如%wisc.edu 匹配任何 wisc.edu 域内的主机,而%.edu 匹配任何 教育学院的主机类似地,192.168.%匹配任何在 192.168 B 类子网的主机,而 192.168.3.% 匹配任何在 192.168.3 C 类子网。












