《2022年数据库和表权限》由会员分享,可在线阅读,更多相关《2022年数据库和表权限(8页珍藏版)》请在金锄头文库上搜索。
1、MySQL 安全性指南 (2)文章地址: http:/www.ykzj.org/article.php?articleid=10642.1.3 数据库和表权限下列权限运用于数据库和表上的操作。ALTER允许你使用 ALTER TABLE 语句,这其实是一个简单的第一级权限,你必须由其他权限,这看你想对数据库实施什么操作。 CREATE允许你创建数据库和表,但不允许创建索引。 DELETE允许你从表中删除现有记录。 DROP允许你删除(抛弃)数据库和表,但不允许删除索引。 INDEX允许你创建并删除索引。 REFERENCES目前不用。 SELECT允许你使用 SELECT 语句从表中检索数据。
2、对不涉及表的SELECT 语句就不必要,如 SELECT NOW()或SELECT 4/2 。 UPDATE允许你修改表中的已有的记录。 2.1.4 管理权限下列权限运用于控制服务器或用户授权能力的操作的管理性操作。FILE允许你告诉服务器读或写服务器主机上的文件。该权限不应该随便授予,它很危险,见“回避授权表风险”。服务器确实较谨慎地保持在一定范围内使用该权限。你只能读任何人都能读的文件。你正在写的文件必须不是现存的文件,这防止你迫使服务器重写重要文件,如/etc/passwd 或属于别人的数据名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
3、- - - - 名师精心整理 - - - - - - - 第 1 页,共 8 页 - - - - - - - - - 库的数据目录。如果你授权 FILE权限,确保你不以 UNIX 的root 用户运行服务器,因为 root 可在文件系统的任何地方创建新文件。如果你以一个非特权用户运行服务器,服务器只能在给用户能访问的目录中创建文件。GRANT允许你将你自己的权限授予别人,包括GRANT。 PROCESS允许你通过使用 SHOW PROCESS语句或mysqladmin process 命令查看服务器内正在运行的线程(进程)的信息。这个权限也允许你用KILL语句或mysqladmin kill命
4、令杀死线程。你总是能看到或杀死你自己的线程。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和col
5、umns_priv 中的权限以一个 SET 表示,它允许权限用一个单个列以任何组合指定。这两个表比其他三个表更新,这就是为什么它们使用更有效的表示方式的原因。(有可能在未来,user、db和host 表也用一个 SET 类型表示。)在tables_priv表中的Table_priv 列被定义成:SET( Select , Insert , Update , Delete , Create , Drop , Grant , References , Index , Alter )在coloums_priv 表中的Column_priv 列被定义成: SET( Select , Insert ,
6、Update , References )列权限比表权限少,因为列级较少的权限有意义。例如你能创建一个表,但你不能创建一个孤立的列。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 8 页 - - - - - - - - - user表包含某些在其他授权表不存在的权限的列: File_priv 、Process_priv 、Reload_priv 和Shutdown_priv。这些权限运用于你让服务器执行的与任何特定数据库或表不相关的操作。如允许一个用户根据当前数据库是什么
7、来关闭数据库是毫无意义的。2.2 服务器如何控制客户访问在你使用 MySQL 时,客户访问控制有两个阶段。第一阶段发生在你试图连接服务器时。服务器查找user表看它是否能找到一个条目匹配你的名字、你正在从那儿连接的主机和你提供的口令。如果没有匹配,你就不能连接。如果有一个匹配,建立连接并继续第二阶段。在这个阶段,对于每一个你发出的查询,服务器检查授权表看你是否有足够的权限执行查询,第二阶段持续到你与服务器对话的结束。本小节详细介绍 MySQL 服务器用于将授权表条目匹配到来的连接请求或查询的原则,这包括在授权表范围列中合法的值的类型、结合授权表中的权限信息的方式和表中条目被检查的次序。2.2.
8、1 范围列内容一些范围列要求文字值,但它们大多数允许通配符或其他特殊值。Host 一个Host列值可以是一个主机名或一个IP地址。值 localhost意味着本地主机,但它只在你用一个localhost主机名时才匹配,而不是你在使用主机名时。假如你的本地主机名是并且在user表中有对你的两条记录,一个有一个Host值或localhost,而另一个有 ,有localhost的记录将只当你连接 localhost时匹配,其他在只在连接 时才匹配。如果你想让客户能以两种方式连接,你需要在 user表中有两条记录。你也可以用通配符指定 Host值。可以使用 SQL 的模式字符“ % ”和“_”并具有当
9、你在一个查询中使用LIKE算符同样的含义(不允许 regex算符)。 SQL 模式字符都能用于主机名和IP地址。如 %wisc.edu匹配任何 wisc.edu 域内的主机,而 %.edu匹配任何教育学院的主机。类似地,192.168.%匹配任何在 192.168 B类子网的主机,而 192.168.3.% 匹配任何在 192.168.3 C 类子网的主机。% 值匹配所有主机,并可用于允许一个用户从任何地方连接。一个空白的Host值等同于 % 。(例外:在db表中,一个空白 Host值含义是“进一步检查 host 表”,该过程在“查询访问验证”中介绍。)名师资料总结 - - -精品资料欢迎下载
10、 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 8 页 - - - - - - - - - 从MySQL 3.23起,你也可以指定带一个表明那些为用于网络地址的网络掩码的IP地址,如 192.168.128.0/17 指定一个17位网络地址并匹配其 IP地址是192.168.128 前17位的任何主机。User 用户名必须是文字的或空白。一个空白值匹配任何用户。% 作为一个 User值不意味着空白,相反它匹配一个字面上的 % 名字,这可能不是你想要的。当一个到来的连接通过 user表被验证而匹配的记录包含一个空
11、白的User值,客户被认为是一个匿名用户。 Password 口令值可以是空或非空,不允许用通配符。一个空口令不意味着匹配任何口令,它意味着用户必须不指定口令。口令以一个加密过的值存储,不是一个字面上的文本。如果你在Password列中存储一个照字面上的口令,用户将不能连接! GRANT语句和mysqladmin password命令为你自动加密口令,但是如果你用诸如INSERT 、REPLACE、UPDATE或SET PASSWORD等命令,一定要用 PASSWORD(new_password)而不是简单的 new_password来指定口令。 Db在columns_priv 和tables
12、_priv表中,Db 值必须是真正的数据库名(照字面上),不允许模式和空白。在db和host 中,Db 值可以以字面意义指定或使用SQL 模式字符 % 或 _ 指定一个通配符。一个 % 或空白匹配任何数据库。 Table_name ,Column_name这些列中的值必须是照字面意思的表或列名,不允许模式和空白。某些范围列被服务器视为大小写敏感的,其余不是。这些原则总结在下表中。特别注意Table_name 值总是被看作大小写敏感的,即使在查询中的表名的大小写敏感性对待视服务器运行的主机的文件系统而定(UNIX 下是大小写敏感,而 Windows 不是)。表3 授权表范围列的大小写敏感性 列H
13、ost名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 8 页 - - - - - - - - - UserPasswordDbTable_nameColumn_name大小写敏感性NoYesYesYesYesNo2.2.2 查询访问验证每次你发出一个查询,服务器检查你是否有足够的权限执行它,它以user、db、tables_priv和columns_priv 的顺序检查,知道它确定你有适当的访问权限或已搜索所有表而一无所获。更具体的说:服务器检查 user表匹配你开始连接
14、的记录以查看你有什么全局权限。如果你有并且它们对查询足够了,服务器则执行它。 如果你的全局权限不够,服务器为你在db表中寻找并将该记录中的权限加到你的全局权限中。如果结果对查询足够,服务器执行它。 如果你的全局和数据库级组合的权限不够,服务器继续查找,首先在tables_priv表,然后 columns_priv表。 如果你在检查了所有表之后仍无权限,服务器拒绝你执行查询的企图。 用布尔运算的术语,授权表中的权限被服务器这样使用:user OR tables_priv OR columns_priv你可能疑惑为什么前面的描述只引用4个授权表,而实际上有 5个。实际上服务器是这样检查访问权限:名
15、师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 8 页 - - - - - - - - - user OR (db AND host) OR tables_priv OR columns_priv第一个较简单的表达式是因为host 表不受GRANT和REVOKE语句影响。如果你总是用 GRANT和REVOKE管理用户权限,你绝不需要考虑host 表。但是其工作原理你用该知道:当服务器检查数据库级权限时,它对于客户查找db表。如果 Host列是空的,它意味着“检查host 表
16、以找出哪一个主机能访问数据库”。 服务器在 host 表中查找有与来自 db表的记录相同的 Db 列值。如果没有 host 记录匹配客户主机,则没有授予数据库级权限。如果这些记录的任何一个的确有一个匹配连接的客户主机的Host列值,db表记录和host 表记录结合产生客户的数据库级权限。然而,权限用一个逻辑 AND (与)结合起来,这意味着除非一个给定的权限在两个表中都有,否则客户就不具备该权限。以这种方式,你可以在db表中授予一个基本的权限集,然后使用host 表对特定的主机有选择地禁用它们。如你可以允许从你的域中的所有主机访问数据库,但关闭了那些在较不安全区域的主机的数据库权限。前面的描述
17、毫无疑问使访问检查听起来一个相当复杂的过程,特别是你以为服务器对你发出的每个查询进行权限检查,然而此过程是很快的,因为服务器其实不从授权表对每个查询查找信息,相反,它在启动时将表的内容读入内存,然后验证查询用的是内存中的副本。这大大提高了访问检查操作的性能。但有一个非常明显的副作用。如果你直接修改授权表的内容,服务器将不知道权限的改变。例如,如果你用一条 INSERT 语句向user表加入一个新记录来增加一个新用户,命名在记录中的用户将不能连接服务器。这对管理员新手(有时对有经验的老手)是很困惑的事情,当时解决方法很简单:在你改变了它们之后告诉服务器重载授权表内容,你可以发一条FLUSH PR
18、IVILEGES 或执行mysqladmin flush-privileges(或如果你有一个不支持 flush-privileges的老版本,用 mysqladmin reload 。)。2.2.3 范围列匹配顺序MySQL 服务器按一种特定方式排序符授权表中的记录,然后通过按序浏览记录匹配到来的连接。找到的第一个匹配决定了被使用的记录。理解MySQL 使用的排序顺序很重要,特别是对user表。当服务器读取 user表内容时,它根据在 Host和User列中的值排序记录, Host值起决定作用(相同的 Host值排在一起,然后再根据 User值排序)。然而,排序不是典序(按词排序),它只是部
19、分是。要牢记的是字面上的词优先于模式。这意味着如果你正从连接服务器而 Host有名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 8 页 - - - - - - - - - 和% 两个值,则第一个先选。类似地,% 优先于%.net,然后是% 。IP地址的匹配也是这样的。总之一句话,越具体越优先。可以参见本文附录的实例。2.3 避免授权表风险本届介绍一些在你授权时的一些预防措施,以及不明值的选择带来的风险。一般地,你要很“吝啬”地授予超级用户权限,即不要启用user表中条目中
20、的权限,而使用其它授权表,以将用户权限限制于数据库、表、或列。在 user表中的权限允许于影响到你的服务器操作或能访问任何数据库中的任何表。不要授予对 mysql数据库的权限。一个拥有包含授权表数据库权限的用户可能会修改表以获取对其他任何数据库的权限。授予允许一个用户修改mysql数据库表的权限也实际上给了用户以一个全局GRANT权限。如果用户能直接修改表,这也等价于能够发出任何你能想象的任何GRANT语句。FILE权限尤其危险,不要轻易授权它。以下是一个拥有FILE权限的人能干除的事情:CREATE TABLE etc_passwd (pwd_entry TEXT);LOAD DATA IN
21、FILE /etc/passwd into TABLE etc_passwd;SELECT * FROM etc_passwd;在发出这些语句后,用户已经拥有了你的口令文件的内容了。实际上,服务器上任何公开可读文件的内容都可被拥有 FILE权限的用户通过网络访问。FILE权限也能被利用来危害没有设置足够权限制的文件权限的系统上的数据库。这就是你为什么应该设置数据目录只能由服务器读取的原因。如果对应于数据库表的文件可被任何人读取,不只是用户服务器账号的用户可读,任何有FILE权限的用户也可通过网络连接并读取它们。下面演示这个过程:创建一个有一个 LONGBLOB列的表: USER test;CR
22、EATE TABLE tmp (b LONGBLOB);使用该表读取每个对应于你想偷取的数据库表文件的内容,然后将表内容写入你自己数据库的一个文名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 8 页 - - - - - - - - - 件中:LOAD DATA INFILE ./other_db/x.frm INTO TABLE tmpFIELDS ESCAPED BY LINES TERMINATED BY ;SELECT * FROM tmp INTO OUTFILE
23、 y.frmFIELDS ESCAPED BY LINES TERMINATED BY ;DELETE FROM tmp;LOAD DATA INFILE ./other_db/x.ISD INTO TABLE tmpFIELDS ESCAPED BY LINES TERMINATED BY ;SELECT * FROM tmp INTO OUTFILE y.ISDFIELDS ESCAPED BY LINES TERMINATED BY ;DELETE FROM tmp;LOAD DATA INFILE ./other_db/x.ISM INTO TABLE tmpFIELDS ESCAPE
24、D BY LINES TERMINATED BY ;SELECT * FROM tmp INTO OUTFILE y.ISM现在你拥有了一个新表 y,它包含 other_db.x 的内容并且你有全权访问它。 为避免让人以同样的方式攻击,根据“第一部分 内部安全性 -保护你的数据目录”中的指令设置你的数据目录上的权限。你也可以在你启动服务器时使用-skip-show-database选项限制用户对于他们没用访问权限的数据库使用SHOW DATABASES和SHOW TABLES。这有助于防止用户找到关于它们不能访问的数据库和表的信息。ALTER 权限能以不希望的方式使用。假定你想让user1可以访问 table1 但不能访问 tables2 。一个拥有ALTER 权限的用户可以通过使用 ALTER TABLE 将table2 改名为table1 来偷梁换柱。当心GRANT权限。两个由不同权限但都有GRANT权限的用户可以使彼此的权利更强大。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 8 页 - - - - - - - - -