作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统_第1页
作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统_第2页
作为一个MySQL的系统管理员你有责任维护你的MySQL数据库系统_第3页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、作为一个 MySQL 的系统管理员,你有责任维护你的 MySQL 数据库系统的数据安全性和完 整性。 本文主要主要介绍如何建立一个安全的MySQL 系统,从系统内部和外部网络两个角度,为你提供一个指南。本文主要考虑下列安全性有关的问题: 为什么安全性很重要,你应该防范那些攻击? 服务器面临的风险(内部安全性) ,如何处理? 连接服务器的客户端风险(外部安全性) ,如何处理?MySQL 管理员有责任保证数据库内容的安全性,使得这些数据记录只能被那些正确授权的 用户访问,这涉及到数据库系统的内部安全性和外部安全性。内部安全性关心的是文件系统级的问题,即,防止 务器主机有账号的人 (合法或窃取的)进

2、行攻击。 每个人均能简单地替代对应于那些数据库表的文件, 表设置正确,对此毫无意义。MySQL 数据目录( DATADIR )被在服如果数据目录内容的权限过分授予, 使得那么确保控制客户通过网络访问的授权外部安全性关心的是从外部通过网络连接服务器的客户的问题,即,保护 MySQL 服务器免 受来自通过网络对服务器的连接的攻击。你必须设置 MySQL 授权表( grant table ),使得他 们不允许访问服务器管理的数据库内容,除非提供有效的用户名和口令。下面就详细介绍如何设置文件系统和授权表mysql ,实现 MySQL 的两级安全性。一、内部安全性 -保证数据目录访问的安全MySQL 服

3、务器通过在 MySQL 数据库中的授权表提供了一个灵活的权限系统。你可以设置 这些表的内容, 允许或拒绝客户对数据库的访问, 这提供了你防止未授权的网络访问对你数 据库攻击的安全手段, 然而如果主机上其他用户能直接访问数据目录内容, 建立对通过网络 访问数据库的良好安全性对你毫无帮助, 除非你知道你是登录 MySQL 服务器运行主机的唯 一用户,否则你需要关心在这台机器上的其他用户获得对数据目录的访问的可能性。以下是你应该保护的内容:数据库文件。 很明显, 你要维护服务器管理的数据库的私用性。 数据库拥有者通常并且应该 考虑数据库内容的安全性, 即使他们不想, 也应该考虑时数据库内容公开化,

4、而不是通过糟 糕的数据目录的安全性来暴露这些内容。日志文件。 一般和更新日志必须保证安全, 因为他们包含查询文本。 对日志文件有访问权限 的任何人可以监视数据库进行过的操作。更要重点考虑的日志文件安全性是诸如GRANT 和 SET PASSWORD 等的查询也被记载了,一般和更新日志包含有敏感查询的文本,包括口令( MySQL 使用口令加密,但它在已经完 成设置后才运 用于 以后的 连接建立。 设置一个口 令 的过程设 计象 GRANT 或 SET PASSWORD 等查询,并且这些查询以普通文本形式记载在日志文件中) 。如果一个攻击者 犹如日文件的读权限,只需在日志文件上运行 grep 寻找

5、诸如 GRANT 和 PASSWORD 等词 来发现敏感信息。显然,你不想让服务器主机上的其他用户有数据库目录文件的写权限, 因为他们可以重写你 的状态文件或数据库表文件, 但是读权限也很危险。 如果一个数据库表文件能被读取, 偷取 文件并得到 MySQL 本身,以普通文本显示表的内容也很麻烦, 为什么?因为你要做下列事 情:在服务器主机上安装你自己 “特制 ”的 MySQL 服务器,但是有一个不同于官方服务器版本的 端口、套接字和数据目录。运行 mysql_install_db 初始化你的数据目录, 这赋予你作为 MySQL root 用户访问你的服务器 的权限,所以你有对服务器访问机制的完

6、全控制,它也建立一个 test 数据库。 将对应于你想偷取得表文件拷贝到你服务器的数据库目录下的 test 目录。 启动你的服务器。 你可以随意访问数据库表, SHOW TABLES FROM test 显示你有一个偷来 的表的拷贝, SELECT * 显示它们任何一个的全部内容。如果你确实很恶毒, 将权限公开给你服务器的任何匿名用户, 这样任何人能从任何地方连接 服务器访问你的 test 数据库。你现在将偷来的数据库表公布于众了。在考虑一下, 从相反的角度, 你想让别人对你这样吗?当然不! 你可以通过在数据库录下执 行 ls -l 命令确定你的数据库是否包含不安全的文件和目录。查找有 “组”

7、和 “其他用户 ”权限设置的文件和目录。下面是一个不安全数据目录的一部分列出:% ls -ltotal 10148drwxrwxr-x 11 mysqladm wheel 1024 May 8 12:20 . drwxr-xr-x 22 root wheel 512 May 8 13:31 .drwx 2 mysqladm mysqlgrp 512 Apr 16 15:57 menageriedrwxrwxr-x 2 mysqladm wheel 512 Jan 25 20:40 mysql drwxrwxr-x 7 mysqladm wheel 512 Aug 31 1998 sql-ben

8、ch drwxrwxr-x 2 mysqladm wheel 1536 May 6 06:11 testdrwx 2 mysqladm mysqlgrp 1024 May 8 18:43 tmp正如你看到的, 有些数据库有正确的权限, 而其他不是。 本例的情形是经过一段时间后的结 果。较少限制的权限由在权限设置方面比更新版本更不严格的较早版本服务器设置的 (注意 更具限制的目录 menageria和tmp都有较近日期)。MySQL当前版本确保这些文件只能由运 行服务器的用户读取。让我们来修正这些权限,使得只用服务器用户可访问它们。你的主要保护工具来自于由UNIX 文件系统本身提供的设置文件和目

9、录属主和模式的工具。下面是我们要做的: 进入该目录% cd DATADIR设置所有在数据目录下的文件属主为由用于运行服务器的账号拥有(你必须以root 执行这步)。在本文使用之一改变属主:mysqladm 和 mysqlgrp 作为该账号的用户名和组名。你可以使用下列命令# chown mysqladm.mysqlgrp .# find . -follow -type d -print | xargs chown mysqladm.mysqlgrp设置你的数据目录和数据库目录的模式使得他们只能由 mysqladm 读取,这阻止其他用户访 问你数据库目录的内容。你可以用下列命令之一以 root

10、或 mysqladm 身份运行。% chmod -R go-rwx .% find . -follow -type d -print | xargs chmod go-rwx数据目录内容的属主和模式为 mysqladm 设置。现在你应该保证你总是以 mysqladm 用户运 行服务器,因为现在这是唯一由访问数据库目录权限的用户(除root)。在完成这些设置后,你最终应该得到下面的数据目录权限:% ls -ltotal 10148 drwxrwx- 11 mysqladm mysqlgrp 1024 May 8 12:20 . drwxr-xr-x 22 root wheel 512 May 8

11、 13:31 .drwx 2 mysqladm mysqlgrp 512 Apr 16 15:57 menageriedrwx 2 mysqladm mysqlgrp 512 Jan 25 20:40 mysqldrwx 7 mysqladm mysqlgrp 512 Aug 31 1998 sql-benchdrwx 2 mysqladm mysqlgrp 1536 May 6 06:11 testdrwx 2 mysqladm mysqlgrp 1024 May 8 18:43 tmp二、外部安全性 -保证网络访问的安全MySQL 的安全系统是很灵活的,它允许你以多种不同方式设置用户权限。

12、一般地,你可使 用标准的 SQL 语句 GRANT 和 REVOKE 语句做, 他们为你修改控制客户访问的授权表, 然 而,你可能由一个不支持这些语句的老版本的MySQL (在3.22.11之前这些语句不起作用),或者你发觉用户权限看起来不是以你想要的方式工作。对于这种情况,了解 MySQL 授权表的结构和服务器如何利用它们决定访问权限是有帮助的, 这样的了解允许你通过直接修改授 权表增加、删除或修改用户权限,它也允许你在检查这些表时诊断权限问题。关于如何管理用户账号,见 MySQL 的用户管理 。而对 GRANT 和 REVOKE 语句详细描 述,见 MySQL 参考手册。2.1 MySQL

13、 授权表的结构和内容通过网络连接服务器的客户对 MySQL 数据库的访问由授权表内容来控制。这些表位于 mysql 数据库中,并在第一次安装 MySQL 的过程中初始化(运行 mysql_install_db 脚本)。 授权表共有 5 个表: user、db、host、tables_priv 和 columns_priv 。表 1 user、 db 和 host 授权表结构访问范围列user db hostHost Host HostUser Db DbPassword User数据库 /表权限列Alter_priv Alter_priv Alter_privCreate_priv Creat

14、e_priv Create_privDelete_priv Delete_priv Delete_privDrop_priv Drop_priv Drop_privIndex_priv Index_priv Index_privInsert_priv Insert_priv Insert_privReferences_priv References_priv References_privSelect_priv Select_priv Select_privUpdate_priv Update_priv Update_privFile_priv Grant_priv Grant_privGra

15、nt_privProcess_privReload_privShutdown_priv表 2 tables_priv 和 columns_priv 属权表结构访问范围列tables_priv columns_privHost HostDb DbUser UserTable_name Table_nameColumn_name权限列Table_priv Column_priv授权表的内容有如下用途:user 表user 表列出可以连接服务器的用户及其口令, 并且它指定他们有哪种全局 (超级用户) 权限。 在 user 表启用的任何权限均是全局权限, 并适用于所有数据库。 例如,如果你启用了 DE

16、LETE 权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。db 表db 表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。host 表host 表与 db 表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不 是用它。tables_priv 表tables_priv 表指定表级权限,在这里指定的一个权限适用于一个表的所有列。columns_priv 表columns_priv 表指定列级权限。这里指定的权限适用于一个表的特定列。在“不用

17、 GRANT 设置用户 ”一节里,我们再讨论 GRANT 语句如何对修改这些表起作用,和 你怎样能通过直接修改授权表达到同样的效果。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 脚本 创建它们。MySQL 没有 rows_priv 表,因为它不

18、提供记录级权限,例如,你不能限制用户于表中包含 特定列值的行。 如果你确实需要这种能力, 你必须用应用编程来提供。 如果你想执行建议的 记录级锁定,你可用 GET_LOCK() 函数做到。2.1.1 授权表范围列授权表范围列指定表中的权限何时运用。 时运用于一个给定用户从给定主机的连接。 列指出权限运用于哪个数据库。类似地,授权表包含两种列:决定一个权限何时运用的范围列和决定授予哪种权限的权限列。每个授权表条目包含 User 和 Host 列来指定权限何 其他表包含附加的范围列, 如 db 表包含一个 Db tables_priv 和 columns_priv 表包含范围字段,缩小范围到一个数

19、据库中的特定表或一个表的特定列。2.1.2 授权表权限列授权表还包含权限列,他们指出在范围列中指定的用户拥有何种权限。由 MySQL 支持的权限如下表所示。该表使用 GRANT 语句的权限名称。对于绝大多数在user、 d b 和 host 表中的权限列的名称与 GRANT 语句中有明显的联系。如 Select_priv 对应于 SELECT 权限。2.1.3 数据库和表权限 下列权限运用于数据库和表上的操作。ALTER允许你使用 ALTER TABLE 语句, 这其实是一个简单的第一级权限, 你必须由其他权限, 这 看你想对数据库实施什么操作。CREATE允许你创建数据库和表,但不允许创建索

20、引。DELETE允许你从表中删除现有记录。DROP允许你删除(抛弃)数据库和表,但不允许删除索引。INDEX允许你创建并删除索引。REFERENCES 目前不用。SELECT允许你使用 SELECT 语句从表中检索数据。对不涉及表的 SELECT 语句就不必要,如 SELECT NOW() 或 SELECT 4/2 。UPDATE 允许你修改表中的已有的记录。2.1.4 管理权限 下列权限运用于控制服务器或用户授权能力的操作的管理性操作。FILE 允许你告诉服务器读或写服务器主机上的文件。该权限不应该随便授予,它很危险,见 “回 避授权表风险 ”。服务器确实较谨慎地保持在一定范围内使用该权限。

21、你只能读任何人都能 读的文件。你正在写的文件必须不是现存的文件,这防止你迫使服务器重写重要文件,如 /etc/passwd 或属于别人的数据库的数据目录。如果你授权FILE权限,确保你不以UNIX的root用户运行服务器,因为root可在文件系统 的任何地方创建新文件。 如果你以一个非特权用户运行服务器, 服务器只能在给用户能访问 的目录中创建文件。GRANT 允许你将你自己的权限授予别人,包括 GRANT 。PROCESS允许你通过使用 SHOW PROCESS 语句或 mysqladmin process 命令查看服务器内正在运行的 线程(进程)的信息。这个权限也允许你用 KILL 语句或

22、 mysqladmin kill 命令杀死线程。 你总是能看到或杀死你自己的线程。 PROCESS 权限赋予你对任何线程做这些事情的能力。RELOAD 允许你执行大量的服务器管理操作。你可以发出 FLUSH 语句,你也能指性 mysqladmin 的 reload、refresh、flush-hosts、flush-logs、 flush-privileges 和 flush-tables 等命令。SHUTDOWN允许你用 mysqladmin shutdown 关闭服务器。在 user、db 和 host 表中,每一个权限以一个单独的列指定。这些列全部声明为一个ENUM("N&qu

23、ot;,"Y")类型,所以每个权的缺省值是“ N”在tables_priv和columns_priv中的权限以一个 SET 表示, 它允许权限用一个单个列以任何组合指定。 这两个表比其他三个表更新, 这就是为什么它们使用更有效的表示方式的原因。(有可能在未来,user、db和host表也用一个 SET 类型表示。)在 tables_priv 表中的 Table_priv 列被定义成:SET('Select','Insert','Update','Delete','Create','Dro

24、p','Grant','References','Index','Alter') 在 coloums_priv 表中的 Column_priv 列被定义成:SET('Select','Insert','Update','References') 列权限比表权限少, 因为列级较少的权限有意义。 例如你能创建一个表, 但你不能创建一个 孤立的列。user 表包含某些在其他授权表不存在的权限的列:File_priv 、 Process_priv、 Reload_pr

25、iv 和Shutdown_priv 。这些权限运用于你让服务器执行的与任何特定数据库或表不相关的操作。 如允许一个用户根据当前数据库是什么来关闭数据库是毫无意义的。2.2 服务器如何控制客户访问在你使用 MySQL 时,客户访问控制有两个阶段。第一阶段发生在你试图连接服务器时。服 务器查找 user 表看它是否能找到一个条目匹配你的名字、你正在从那儿连接的主机和你提 供的口令。如果没有匹配,你就不能连接。如果有一个匹配,建立连接并继续第二阶段。在 这个阶段,对于每一个你发出的查询,服务器检查授权表看你是否有足够的权限执行查询, 第二阶段持续到你与服务器对话的结束。本小节详细介绍 MySQL 服

26、务器用于将授权表条目匹配到来的连接请求或查询的原则, 这包 括在授权表范围列中合法的值的类型、 结合授权表中的权限信息的方式和表中条目被检查的 次序。2.2.1 范围列内容 一些范围列要求文字值,但它们大多数允许通配符或其他特殊值。Host一个 Host 列值可以是一个主机名或一个 IP 地址。 值 localhost 意味着本地主机, 但它只在你 用一个 localhost 主机名时才匹配,而不是你在使用主机名时。假如你的本地主机名是 并且在 user 表中有对你的两条记录,一个有一个 Host 值或 localhost ,而另一个 有 ,有 localhost 的记录将只当你连接 loca

27、lhost 时匹配,其他在只在连接 时才匹配。 如果你想让客户能以两种方式连接, 你需要在 user 表中有两条记录。你也可以用通配符指定 Host 值。可以使用 SQL 的模式字符 “%”和 “_并”具有当你在一个查询 中使用 LIKE 算符同样的含义(不允许 regex 算符)。 SQL 模式字符都能用于主机名和 IP 地址。如 % 匹配任何 域内的主机,而 %.edu 匹配任何教育学院的主机。类 似地, 192.168.%匹配任何在 192.168 B 类子网的主机,而 192.168.3.% 匹配任何在 192.168.3 C 类子网的主机。%值匹配所

28、有主机,并可用于允许一个用户从任何地方连接。一个空白的Host 值等同于 %。(例外:在 db 表中,一个空白 Host 值含义是 “进一步检查 host 表 ”,该过程在 “查询访问验 证”中介绍。)从 MySQL 3.23 起,你也可以指定带一个表明那些为用于网络地址的网络掩码的 IP 地址, 如 /17 指定一个 17 位网络地址并匹配其 IP 地址是 192.168128 前 17 位的任何 主机。User 用户名必须是文字的或空白。一个空白值匹配任何用户。%作为一个 User 值不意味着空白,相反它匹配一个字面上的 %名字,这可能不是你想要的。当一个到来的连

29、接通过user表被验证而匹配的记录包含一个空白的 User值,客户被认为是一个匿名用户。Password口令值可以是空或非空, 不允许用通配符。 一个空口令不意味着匹配任何口令, 它意味着用 户必须不指定口令。口令以一个加密过的值存储,不是一个字面上的文本。如果你在Password 列中存储一个照字面上的口令,用户将不能连接! GRANT 语句和 mysqladmin password 命令为你自动加密 口令,但是如果你用诸如 INSERT 、 REPLACE 、 UPDATE 或 SET PASSWORD 等命令,一 定要用 PASSWORD("new_password"

30、) 而不是简单的 "new_password" 来指定口令。Db在 columns_priv 和 tables_priv 表中, Db 值必须是真正的数据库名 (照字面上) ,不允许模式 和空白。在db和host中,Db值可以以字面意义指定或使用 SQL模式字符或'指定一个 通配符。一个 '%'或空白匹配任何数据库。Table_name, Column_name 这些列中的值必须是照字面意思的表或列名,不允许模式和空白。某些范围列被服务器视为大小写敏感的,其余不是。这些原则总结在下表中。特别注意 Table_name 值总是被看作大小写敏感的,即使在

31、查询中的表名的大小写敏感性对待视服务 器运行的主机的文件系统而定( UNIX 下是大小写敏感,而 Windows 不是)。表 3 授权表范围列的大小写敏感性列HostUserPasswordDbTable_nameColumn_name 大小写敏感性NoYesYesYesYesNo2.2.2 查询访问验证每次你发出一个查询,服务器检查你是否有足够的权限执行它,它以user、db、 tables_priv和 columns_priv 的顺序检查,知道它确定你有适当的访问权限或已搜索所有表而一无所获。更具体的说: 服务器检查 user 表匹配你开始连接的记录以查看你有什么全局权限。如果你有并且它们

32、对 查询足够了,服务器则执行它。如果你的全局权限不够,服务器为你在 db 表中寻找并将该记录中的权限加到你的全局权限 中。如果结果对查询足够,服务器执行它。如果你的全局和数据库级组合的权限不够,服务器继续查找,首先在 tables_priv 表,然后 columns_priv 表。如果你在检查了所有表之后仍无权限,服务器拒绝你执行查询的企图。 用布尔运算的术语,授权表中的权限被服务器这样使用:user OR tables_priv OR columns_priv你可能疑惑为什么前面的描述只引用 4个授权表, 而实际上有 5个。实际上服务器是这样检 查访问权限:user OR (db AND h

33、ost) OR tables_priv OR columns_priv第一个较简单的表达式是因为 host 表不受 GRANT 和 REVOKE 语句影响。如果你总是用 GRANT 和 REVOKE 管理用户权限, 你绝不需要考虑 host 表。但是其工作原理你用该知道:当服务器检查数据库级权限时,它对于客户查找 db 表。如果 Host 列是空的,它意味着 “检 查 host 表以找出哪一个主机能访问数据库 ”。服务器在host表中查找有与来自db表的记录相同的 Db列值。如果没有 host记录匹配客户 主机,则没有授予数据库级权限。 如果这些记录的任何一个的确有一个匹配连接的客户主机 的H

34、ost列值,db表记录和host表记录结合产生客户的数据库级权限。然而,权限用一个逻辑 AND (与)结合起来,这意味着除非一个给定的权限在两个表中都 有,否则客户就不具备该权限。以这种方式,你可以在 db 表中授予一个基本的权限集,然 后使用 host 表对特定的主机有选择地禁用它们。如你可以允许从你的域中的所有主机访问 数据库,但关闭了那些在较不安全区域的主机的数据库权限。前面的描述毫无疑问使访问检查听起来一个相当复杂的过程,特别是你以为服务器对你发出的每个查询进行权限检查, 然而此过程是很快的, 因为服务器其实不从授权表对每个查询查 找信息,相反, 它在启动时将表的内容读入内存, 然后验

35、证查询用的是内存中的副本。 这大 大提高了访问检查操作的性能。 但有一个非常明显的副作用。 如果你直接修改授权表的内容, 服务器将不知道权限的改变。例如,如果你用一条 INSERT 语句向 user 表加入一个新记录来增加一个新用户,命名在记 录中的用户将不能连接服务器。这对管理员新手(有时对有经验的老手)是很困惑的事情, 当时解决方法很简单:在你改变了它们之后告诉服务器重载授权表内容,你可以发一条FLUSH PRIVILEGES 或 执 行 mysqladmin flush-privileges ( 或 如 果 你 有 一 个 不 支 持 flush-privileges 的老版本,用 my

36、sqladmin reload。)。2.2.3 范围列匹配顺序MySQL 服务器按一种特定方式排序符授权表中的记录,然后通过按序浏览记录匹配到来的 连接。找到的第一个匹配决定了被使用的记录。理解 MySQL 使用的排序顺序很重要,特别 是对 user 表。当服务器读取user表内容时,它根据在Host和User列中的值排序记录,Host值起决定作用(相同的Host值排在一起,然后再根据User值排序)。然而,排序不是典序(按词排序), 它只是部分是。要牢记的是字面上的词优先于模式。这意味着如果你正从 连接服务器而 Host 有 和 % 两个值,则第一个先选。类似地, % 优先于%.net,然后

37、是%。IP地址的匹配也是这样的。总之一句话,越具体越优先。可以参见本文附录的实例。2.3 避免授权表风险本届介绍一些在你授权时的一些预防措施,以及不明值的选择带来的风险。 一般地, 你要很“吝啬 ”地授予超级用户权限,即不要启用 将用户权限限制于数据库、表、或列。在user 表中条目中的权限,而使用其它授权表,以 user 表中的权限允许于影响到你的服务器操作或能访问任何数据库中的任何表。不要授予对 mysql 数据库的权限。 一个拥有包含授权表数据库权限的用户可能会修改表以获 取对其他任何数据库的权限。 授予允许一个用户修改 mysql 数据库表的权限也实际上给了用 户以一个全局 GRANT

38、 权限。 如果用户能直接修改表, 这也等价于能够发出任何你能想象的 任何 GRANT 语句。FILE 权限尤其危险,不要轻易授权它。以下是一个拥有 FILE 权限的人能干除的事情:CREATE TABLE etc_passwd (pwd_entry TEXT);LOAD DATA INFILE "/etc/passwd" into TABLE etc_passwd;SELECT * FROM etc_passwd;在发出这些语句后, 用户已经拥有了你的口令文件的内容了。 实际上, 服务器上任何公开可 读文件的内容都可被拥有 FILE 权限的用户通过网络访问。FILE 权限也

39、能被利用来危害没有设置足够权限制的文件权限的系统上的数据库。这就是你 为什么应该设置数据目录只能由服务器读取的原因。 如果对应于数据库表的文件可被任何人 读取,不只是用户服务器账号的用户可读,任何有 FILE 权限的用户也可通过网络连接并读 取它们。下面演示这个过程:创建一个有一个 LONGBLOB 列的表:USER test;然后将表内容写入你自己数据库CREATE TABLE tmp (b LONGBLOB);使用该表读取每个对应于你想偷取的数据库表文件的内容,的一个文件中:LOAD DATA INFILE "./other_db/x.frm" INTO TABLE t

40、mpFIELDS ESCAPED BY "" LINES TERMINA TED BY ""SELECT * FROM tmp INTO OUTFILE "y.frm"FIELDS ESCAPED BY "" LINES TERMINA TED BY ""DELETE FROM tmp;LOAD DATA INFILE "./other_db/x.ISD" INTO TABLE tmpFIELDS ESCAPED BY "" LINES TERMINA T

41、ED BY ""SELECT * FROM tmp INTO OUTFILE "y.ISD"FIELDS ESCAPED BY "" LINES TERMINA TED BY ""DELETE FROM tmp;LOAD DATA INFILE "./other_db/x.ISM" INTO TABLE tmpFIELDS ESCAPED BY "" LINES TERMINA TED BY ""SELECT * FROM tmp INTO OUTFILE

42、 "y.ISM"现在你拥有了一个新表 y ,它包含 other_db.x 的内容并且你有全权访问它。 为避免让人以同样的方式攻击, 根据 “第一部分 内部安全性 -保护你的数据目录 ”中的指令设 置你的数据目录上的权限。 你也可以在你启动服务器时使用 -skip-show-database 选项限制用 户对于他们没用访问权限的数据库使用 SHOW DATABASES 和 SHOW TABLES 。这有助于 防止用户找到关于它们不能访问的数据库和表的信息。ALTER 权限能以不希望的方式使用。假定你想让 user1 可以访问 table1 但不能访问 tables2。 一个拥

43、有 ALTER 权限的用户可以通过使用 ALTER TABLE 将 table2 改名为 table1 来偷梁换 柱。当心 GRANT 权限。两个由不同权限但都有 GRANT 权限的用户可以使彼此的权利更强大。2.4 不用 GRANT 设置用户 如果你有一个早于 3.22.11 的 MySQL 版本,你不能使用 GRANT (或 REVOKE )语句设置 用户及其访问权限, 但你可以直接修改授权表的内容。 如果你理解 GRANT 语句如何修改授 权表,这很容易。那么你通过手工发出 INSERT 语句就能自己做同样的事情。当你发出一条 GRANT 语句时, 你指定一个用户名和主机名, 可能还有口

44、令。 对该用户生成 一个 user 表记录,并且这些值记录在 User、 Host 和 Password 列中。如果你在 GRANT 语句 中指定全局权限, 这些权限记录在记录的权限列中。 其中要留神的是 GRANT 语句为你加密 口令,而 INSERT 不是,你需要在 INSERT 中使用 PASSWORD() 函数加密口令。如果你指定数据库级权限,用户名和主机名被记录在 db 表的 User 和 Host 列。你为其授权 的数据库记录在 Db 列中,你授予的权限记录在权限列中。对于表级和列级权限, 效果是类似的。 在 tables_priv 和 columns_priv 表中创建记录以记录

45、用 户名、主机名和数据库,还有相关的表和列。授予的权限记录在权限列中。如果你还记得前面的介绍, 你应该能即使不用 GRANT 语句也能做 GRANT 做的事情。 记住 在你直接修改授权表时, 你将通知服务器重载授权表, 否则他不知道你的改变。 你可以执行 一个 mysqladmin flush-privileges 或 mysqladmin reload 命令强迫一个重载。如果你忘记做这 个,你会疑惑为什么服务器不做你想做的事情。列 GRANT 语句创建一个拥有所有权的超级用户。包括授权给别人的能力:GRANT ALL ON *.* TO anynamelocalhost IDENTIFIED

46、 BY "passwd"WITH GRANT OPTION该语句将在 user 表中为 anynamelocalhost 创建一个记录, 打开所有权限, 因为这里是超级 用户(全局)权限存储的地方,要用 INSERT 语句做同样的事情,语句是:INSERT INTO user V ALUES("localhost","anyname",PASSWORD("passwd"),你可能发现它不工作,这要看你的 MySQL 版本。授权表的结构已经改变而且你在你的 user表可能没有 14 个权限列。用 SHOW COLUM

47、NS 找出你的授权表包含的每个权限列,相应 地调整你的 INSERT 语句。 下列 GRANT 语句也创建一个拥有超级用户身份的用户,但是 只有一个单个的权限:GRANT RELOAD ON *.* TO flushlocalhost IDENTIFIED BY "flushpass"本例的 INSERT 语句比前一个简单, 它很容易列出列名并只指定一个权限列。 所有其它列将 设置为缺省的 "N" :INSERT INTO user (Host,Password,Reload) VALUES("localhost","flu

48、sh",PASSWORD("flushpass"),"Y")数据库级权限用一个 ON db_name.* 子句而不是 ON *.* 进行授权:GRANT ALL ON sample.* TO borislocalhost IDENTIFIED BY "ruby" 这些权限不是全局的,所以它们不存储在 user 表中,我们仍然需要在 user 表中创建一条记 录(使得用户能连接) ,但我们也需要创建一个 db 表记录记录数据库集权限:INSERT INTO user (Host,User,Password) V ALUES(&

49、quot;localhost","boris",PASSWORD("ruby")INSERT INTO db VALUES("localhost","sample_db","boris","Y","Y","Y","Y","Y","Y","N","Y","Y","Y")"N&quo

50、t; 列是为 GRANT 权限;对末尾的一个数据库级具有 WITH GRANT OPTION 的 GRANT 语句,你要设置该列为 "Y" 。要设置表级或列级权限, 你对 tables_priv 或 columns_priv 使用 INSERT 语句。 当然, 如果你 没有 GRANT 语句,你将没有这些表,因为它们在 MySQL 中同时出现。如果你确实有这些 表并且为了某些原因想要手工操作它们,要知道你不能用单独的列启用权限。你设置 tables_priv.Table_priv 或 columns_priv.Column_priv 列来设置包含你想启用的权限值。 例如,要

51、对一个表启用 SELECT 和 INSERT 权限,你要在相关的 tables_priv 的记录中设置 Table_priv 为 "Select,Insert" 。如果你想对一个拥有 MySQL 账号的用户修改权限, 使用 UPDATE 而不是 INSERT ,不管你 增加或撤销权限都是这样。要完全删除一个用户,从用户使用的每个表中删除记录。如果你愿意避免发一个查询来直接修改全权表,你可以看一下 MySQL 自带的 mysqlaccess 和 mysql_setpermissions 脚本。附录 1 小测验在你刚刚新安装了一个 MySQL 服务器,在你增加了一个允许连接 M

52、ySQL 的用户,用下列 语句:GRANT ALL ON samp_db.* TO fred* IDENTIFIED "cocoa"而 fred 碰巧在服务器主机上有个账号,所以他试图连接服务器:%mysql -u fred -pcocoa samp_dbERROR 1045: Access denied for user: 'fredlocalhost' (Using password: YES)为什么?原因是:先考虑一下 mysql_install_db 如何建立初始权限表和服务器如何使用user 表记录匹配客户连接。在你用 mysql_install_db 初始化你的数据库时,它创建类似这样的user 表:Host User localhost localhost root root头两个记录允许 root 指定 localhost 或主机名连接本地服务器,后两个允许匿名用户从本地 连接。当增加 fred 用户后,Host Userlocalho

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论