MySQL安全性指南
作者:Yudi 文章来源:Web 更新时间:2007-10-21
Select_priv Select_priv Select_priv
Update_priv Update_priv Update_priv
File_priv Grant_priv Grant_priv
Grant_priv
Process_priv
Reload_priv
Shutdown_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
授权表的内容有如下用途:
user表
user表列出可以连接服务器的用户及其口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。例如,如果你启用了DELETE权限,在这里列出的用户可以从任何表中删除记录,所以在你这样做之前要认真考虑。
db表
db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。
host表
host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。
tables_priv表
tables_priv表指定表级权限,在这里指定的一个权限适用于一个表的所有列。
columns_priv表
columns_priv表指定列级权限。这里指定的权限适用于一个表的特定列。
在“不用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表,因为它不提供记录级权限,例如,你不能限制用户于表中包含特定列值的行。如果你确实需要这种能力,你必须用应用编程来提供。如果你想执行建议的记录级锁定,你可用GET_LOCK()函数做到。
授权表包含两种列:决定一个权限何时运用的范围列和决定授予哪种权限的权限列。
2.1.1 授权表范围列
授权表范围列指定表中的权限何时运用。每个授权表条目包含User和Host列来指定权限何时运用于一个给定用户从给定主机的连接。其他表包含附加的范围列,如db表包含一个Db列指出权限运用于哪个数据库。类似地,tables_priv和columns_priv表包含范围字段,缩小范围到一个数据库中的特定表或一个表的特定列。
2.1.2 授权表权限列
授权表还包含权限列,他们指出在范围列中指定的用户拥有何种权限。由MySQL支持的权限如下表所示。该表使用GRANT语句的权限名称。对于绝大多数在user、db和host表中的权限列的名称与GRANT语句中有明显的联系。如Select_priv对应于SELECT权限。
2.1.3 数据库和表权限
下列权限运用于数据库和表上的操作。
ALTER
允许你使用ALTER TABLE语句,这其实是一个简单的第一级权限,你必须由其他权限,这看你想对数据库实施什么操作。
CREATE
允许你创建数据库和表,但不允许创建索引。
DELETE
允许你从表中删除现有记录。
DROP
允许你删除(抛弃)数据库和表,但不允许删除索引。
INDEX
允许你创建并删除索引。
REFERENCES
目前不用。
SELECT
允许你使用SELECT语句从表中检索数据。对不涉及表的SELECT语句就不必要,如SELECT NOW()或SELECT 4/2。
UPDATE
允许你修改表中的已有的记录。
2.1.4 管理权限
下列权限运用于控制服务器或用户授权能力的操作的管理性操作。
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类型表示。)
在tables_priv表中的Table_priv列被定义成:
SET('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter')
在coloums_priv表中的Column_priv列被定义成:
SET('Select','Insert','Update','References')
列权限比表权限少,因为列级较少的权限有意义。例如你能创建一个表,但你不能创建一个孤立的列。
user表包含某些在其他授权表不存在的权限的列:File_priv、Process_priv、Reload_priv和Shutdown_priv。这些权限运用于你让服务器执行的与任何特定数据库或表不相关的操作。如允许一个用户根据当前数据库是什么来关闭数据库是毫无意义的。
2.2 服务器如何控制客户访问
在你使用MySQL时,客户访问控制有两个阶段。第一阶段发生在你试图连接服务器时。服务器查找user表看它是否能找到一个条目匹配你的名字、你正在从那儿连接的主机和你提供的口令。如果没有匹配,你就不能连接。如果有一个匹配,建立连接并继续第二阶段。在这个阶段,对于每一个你发出的查询,服务器检查授权表看你是否有足够的权限执行查询,第二阶段持续到你与服务器对话的结束。
本小节详细介绍MySQL服务器用于将授权表条目匹配到来的连接请求或查询的原则,这包括在授权表范围列中合法的值的类型、结合授权表中的权限信息的方式和表中条目被检查的次序。
2.2.1 范围列内容
一些范围列要求文字值,但它们大多数允许通配符或其他特殊值。
Host
一个Host列值可以是一个主机名或一个IP地址。值localhost意味着本地主机,但它只在你用一个localhost主机名时才匹配,而不是你在使用主机名时。假如你的本地主机名是pit.snake.net并且在user表中有对你的两条记录,一个有一个Host值或localhost,而另一个有pit.snake.net,有localhost的记录将只当你连接localhost时匹配,其他在只在连接pit.snake.net时才匹配。如果你想让客户能以两种方式连接,你需要在user表中有两条记录。
你也可以用通配符指定Host值。可以使用SQL的模式字符“%”和“_”并具有当你在一个查询中使用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表”,该过程在“查询访问验证”中介绍。)
从MySQL 3.23起,你也可以指定带一个表明那些为用于网络地址的网络掩码的IP地址,如192.168.128.0/17指定一个17位网络地址并匹配其IP地址是192.168.128前17位的任何主机。
User
用户名必须是文字的或空白。一个空白值匹配任何用户。%作为一个User值不意味着空白,相反它匹配一个字面上的%名字,这可能不是你想要的。
当一个到来的连接通过user表被验证而匹配的记录包含一个空白的User值,客户被认为是一个匿名用户。
Password
口令值可以是空或非空,不允许用通配符。一个空口令不意味着匹配任何口令,它意味着用户必须不指定口令。
口令以一个加密过的值存储,不是一个字面上的文本。如果你在Password列中存储一个照字面上的口令,用户将不能连接!GRANT语句和mysqladmin password命令为你自动加密口令,但是如果你用诸如INSERT、REPLACE、UPDATE或SET PASSWORD等命令,一定要用PASSWORD("new_password")而不是简单的"new_password"来指定口令。
上一页 [1] [2] [3] [4] 下一页
编辑推荐