Mysql入门系列:安全网络访问mysql数据库服务器

更新时间:2023-10-11 03:30:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Mysql入门系列:安全网络访问mysql数据库服务器

MySQL安全性系统是灵活的。它允许以许多不同的方法设置用户访问权限。通常,可通过GRANT 和REVOKE 语句来进行,这些语句对控制客户机访问的授权表进行修改。但是,您拥有的可能是不支持这些语句的旧版本MySQL(这些语句在MySQL3.22.11以前的版本 中没有使用),或者可能发觉用户的权限好像不是按希望地在工作。对于这样的情况,了解MySQL授权表的结构以及服务器怎样使用它们来决定访问许可权是有帮助的。您了解到这样一个程度,就可以通过直接修改授权表来增加、删除或修改用户的权限,还可以在检查表时

诊断权限的问题。

笔者假定您已经阅读了第11章的“用户账号管理”一节,并理解GRANT 和R E V O K E语句是怎样工作的。GRANT 和REVOKE 提供了建立MySQL账号和相关权限的便利方法,但是,它们只是一个前端。所有真正的操作都发生在MySQL授权表中。 MySQL授权表的结构和内容

在网络上连接到服务器的客户机对MySQL数据库的访问是由授权表内容控制的。这些表定位在mysql数据库中,并在首次安装MySQL的过程中进行初始化(如附录A 所描述的)。表12-1和表12-2 示出列五个授权表,它们是user、db、host、tables_priv 和c o l um n s _ priv。

授权表的内容按下列各项使用:

user user 表列出可连接到服务器和口令的用户,并指定用户拥有哪些全局(超级用户)权限(如果有的话)。任何在user 表项中所允许的权限都是全局权限,并适用于所有的数据库。例如,如果在这里允许DELETE 权限,则在该项中列出的用户可从任何表中删除记录。因此,在进行这项操作之前千万要小心,通常,最好在user 表项中关闭所有的权限,而使用其他的、有更多限制的表来指定权限。对超级用户(如r o o t)则是一个例外,但一般很少有。

db db 表列出数据库以及哪些用户拥有访问这些数据库的权限。这里指定的权限适用于数据库中所有的表。

host host 表与db表结合使用,在更细的级别上控制对特定主机的数据库访问权限。该

表不受GRANT 和REVOKE 语句的影响,因此您会发现根本不会去使用它。

tables_priv tables_priv 表指定表级的权限。在这里所指定的权限适用于表中所有的列。 columns_priv columns_priv 表指定列级的权限。在这里所指定的权限适用于表中特定的列。

在12 . 2 . 4节“不用GRANT 建立用户”中,我们将讨论GRANT 语句怎样修改这些表以及怎样通过直接修改授权表来达到相同的结果。

tables_priv 和columns_priv 表是在MySQL3.22.11中引入的(与GRANT 语句同时)。如果您拥有MySQL的旧版本,则mysql数据库只有user、db 和host 表。如果已经从旧版本升级到3 . 2 2 . 11以上的版本,但仍没有tables_priv 和columns_priv 表的话,可运行mysql_fix_privileges_table 脚本创建它们。

没有rows_priv 表,因为MySQL不提供记录级的权限。例如,不能使用户只局限于某些列中包含某个值的表中的那些行。如果需要这个能力,必须编写应用程序。如果要想执行咨询记录级锁定(advisory record-level locking),可用附录C 中介绍的GET_LOCK() 函数进行。

授权表中包含两种类型的列:作用域列( scope column)和权限列( privilege column),前者决定一个项何时可用,后者决定一个项可授予哪些权限(有些授权表中包含其他各式各样的列,但在这里与我们无关)。

1. 授权表的作用域列

授权表作用域列指定表项何时使用。每个授权表项中都包含User 和Host 列,以指明该项在特定的用户从特定的主机上连接时应用( host 表是一个例外,它被用于一种特定的、我们还未接触过的方法中)。其他表中包含附加的作用域列。例如, db 表中包含一个Db 列以指明该项适用于哪个数据库。同样, tables_priv 和columns_priv 表中包含使该作用域对数据库中特定表或表中的列缩小的作用域字段。 2. 授权表权限列

授权表中还包含权限列。这些列指明了哪些权限被在作用域列中指定的用户所拥有。MySQL支持的权限显示在以下列表中。该列表使用用于GRANT 语句的权限名。对于大部分来说,在user、db 和host 表中权限列的名字与在第11章利用GRANT 语句连接中所讨论的

权限名显然是相同的。例如, Select_priv 列对应于SELECT 权限。 3. 数据库和表的权限

以下权限适用于数据库和表的操作:

ALTER 允许使用ALTER TABLE 语句。这实际上是一个简单的一级权限,您必须根据打算用该表做什么以拥有其他的权限。

CREATE 允许创建数据库和表。这个权限不允许您创建索引。 DELETE 允许从表中删除已有记录。

DROP 允许删除数据库和表。不允许删除索引。 INDEX 允许创建或删除表的索引。 INSERT 允许在表中插入新的记录。 REFERENCES 未使用。

SELECT 允许用SELECT 语句从表中检索数据。该权限对于不含表的SELECT 语句是不必要的,如SELECT NOW() 或SELECT 4/2。 UPDATE允许修改表中的已有记录。 4. 管理权限

下列权限适用于控制服务器操作或用户授权能力的管理操作:

FILE 允许服务器在服务器主机上读写文件。该权限如果没有正当的原因则不应授予,如12 . 2 . 3节“授权表应避免的风险”中所述,它是危险的。服务器采取某些预防措施限定该权限在特定范围内使用。您只可以读世人都可读的文件,因此不需要考虑任何方式的保护。正在进行写操作的文件不允许是已经存在的。这可防止服务器覆盖重要的文件(如/ e t c / pass w d)或属于其他用户的数据库文件。例如,如果不施加该约束,您可能会替换全部mysql数据库中的授权表的内容。

如果您授予FILE 权限,就不能作为UNIX 的root 用户运行服务器,因为root 能在文件系统的任何地方创建新的文件。如果作为未授权用户运行服务器,则服务器只在该用户可访问到的目录中创建文件。

GRANT 允许将您所拥有的权限授予其他用户,其中包括GRANT 权限。

PROCESS 允许通过使用SHOW PROCESSLIST 语句或mysqladmin processlist 命令查询有关正在服务器中运行的线程信息。该权限还允许利用KILL 语句或mysqla d m i n kill 命令取消线程。您始终可以查看或取消自己的线程。PROCESS 权限授予您对任何线程进行这些操作的能力。

RELOAD 允许执行多种服务器管理操作。可发布FLUSH SQL 语句,还可执行mysqladmin 的命令r e l o a d、r e f r e s h、f l us h - host s、f l us h - l o g s、flush-privileges 和f l us h - tables。

通常这不是有危险的权限,尽管它实际上是管理权限。 SHUTDOWN 允许利用mysqladmin shutdown 关闭服务器。

在user、db 和host 表中,每个权限都作为单独的列给出。这些列都是用ENUM (“N”、

“Y”)类型声明的,因此所有权限的缺省值为“N” (o ff)。tables_priv 和columns_priv 表的权限由SET 语句表示,它允许权限以使用单个列的任何组合形式指定。这两个表比其他三个表新,这就是为什么它们使用了更有效的表示方法的原因(user、db 和host 有可能在将来被改造,也通过SET 来表示权限)。 table_priv 表的table_priv 列定义如下:

SET ('Select ','Insert','update','Delete','Create','Drop','Grant','References','Index','alter') columns_priv 表的Column_priv 列定义如下: SET ('Select ','Insert','update','References')

列权限比表权限少得多,因为在列级中有意义的操作很少。例如,您可以创建一个表,但不能创建孤立的列。

user 表中包含对某些权限的列,这些权限不出现在任何其他授权表中,如F i l e _ priv、 P r o c e s s _ priv、Reload_priv 和Shutdown_priv 表。这些权限适用于执行与任何特定数据库或与表无关的服务器的操作。例如,使用户根据当前数据库关闭服务器是无意义的。 服务器如何控制客户机的访问

在使用MySQL时,客户机访问控制有两个阶段。第一阶段发生在连接服务器时。服务器查找user 表看看是否能够找到与您的名字、正在连接的主机以及所提供的口令相匹配的项。如果不匹配,则不能连接。若匹配,则建立连接,然后继续进行第二阶段。在此阶段中,对于您发布的每个查询,服务器都会检查授权表以查看您是否具有充足的权限来执行该查询。第二阶段继续,直到关于该服务器的会话结束为止。

本节详细讨论MySQL用来将授权表项与输入的客户机连接请求和与查询相匹配的规则。这包括在授权表作用域列中合法的值的类型、在授权表中权限信息组合的方法,以及表项检查的次序。 1. 作用域列的内容

某些作用域列需要直接量,但大多数列允许通配符或其他特殊的值。

Host 该列值可以是一个主机名或一个IP 号。localhost 值的含义是本地主机,但仅当您实际使用localhost 主机值而不是使用该主机名连接时才进行匹配。假定本地主机名为p i t - v i per. s n a k e . n e t,且在user 表中有两个项,一个带有Host 值或localhost,而另一个带有p i t - v i per.snake.net 值。带有localhost 值的项仅当您连接到localhost 时才进行匹配。另一个项仅当您连接到p i t - v i per.snake.net 时才匹配。如果想让用户能够以任意一种方式进行连接,在user 表中需要两个项。还可以用通配符指定Host 的值。SQL的模式字符? %?和? _?也可以使用,并与查询中的LIKE 操作符有相同的含义。SQL 模式(不允许REGEX 模式)字符可用于名字和IP 号。例如,%.wise.edu将与wise.edu域中的任何主机相配。同样, 192.168.% 与192.168 类B 子网中的任何主机相配,因而192.168.3.% 与192.168.3 类C 子网中的任何主机相配。

本文来源:https://www.bwwdw.com/article/ukkf.html

Top