深入MySQL的权限系


摘要:本文详细叙述了MySQL权限系统的原理,包括MySQL存取证实的完整过程。另外一个重要的知识是授权表中的user和host字段。了解MySQL服务器用户匹配的顺序以及身份验证的过程,有利于你配置一个安全的系统。

MySQL 有一套先进的但非标准的安全/授权系统,掌握其授权机制是开始操作MySQL数据库必须要走的第一步,对于一个熟悉SQL基本操作的人来说,也是 MySQL所有的知识中比较难以理解的一个部分。本节通过揭开其授权系统的运作机制,希望大家能够可以更好地操作和使用这个优秀的数据库系统。

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

MySQL授权表的结构

通 过网络连接服务器的客户对MySQL数据库的访问由授权表内容来控制。这些表位于mysql数据库中,并在第一次安装MySQL的过程中初始化(运行 mysql_install_db脚本)。授权表共有5个表:user、db、host、tables_priv和columns_priv。

授权表user、db和host的结构和作用

表1  授权表user、db和host的结构

 

授权表的内容有如下用途:

·user表

user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。

·db表

db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。

·host表

host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。

授权表tables_priv和columns_priv的结构和作用

表2  授权表tables_priv和columns_priv的结构

授权表tables_priv

授权表columns_priv

作用域列

Host

Host

Db

Db

User

User

Table_name

Table_name

 

Column_name

权限列

Table_priv

Column_priv

其他列

Timestamp

Timestamp

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 脚本创建它们。

用户的权限

权限信息用user、db、host、tables_priv和columns_priv表被存储在mysql数据库中(即在名为mysql的数据库中)。在MySQL启动时和在7.5权限修改何时生效所说的情况时,服务器读入这些数据库表内容。

数据库和表的权限

下列权限运用于数据库和表上的操作。

·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

目前不用。

MySQL的管理权限

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

·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类型表示。)

授权表列的内容

作用域列内容

一些范围列要求文字值,但它们大多数允许通配符或其他特殊值。

表3  作用域列的类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值