当前位置:七道奇文章资讯数据防范MySQL防范
日期:2011-05-02 15:44:00  来源:本站整理

MySQL安全性指南[MySQL防范]

赞助商链接



  本文“MySQL安全性指南[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
作为一个MySQL的系统管理员,你有责任保护你的MySQL数据库系统的数据安全性和完好性.本文主要主要介绍若何成立一个安全的MySQL系统,从系统内部和外部网络两个角度,为你供应一个指南.

本文主要考虑下列安全性有关的问题:

·为什么安全性很重要,你应当防备那些攻击?
·服务器面对的风险(内部安全性),若何处理?
·衔接服务器的客户端风险(外部安全性),若何处理?

MySQL管理员有责任保证数据库内容的安全性,使得这些数据记录只能被那些精确受权的用户拜候,这触及到数据库系统的内部安全性和外部安全性.

内部安全性关心的是文件系统级的问题,即,避免MySQL数据目录(DATADIR)被在服务器主机有账号的人(合理或盗取的)举行攻击.假如数据目录内容的权限过度授与,使得每个人均能简单地替换对应于那些数据库表的文件,那么确保掌握客户通过网络拜候的受权表设置精确,对此毫无意义.

外部安全性关心的是从外部通过网络衔接服务器的客户的问题,即,保护MySQL服务器免受来自通过网络对服务器的衔接的攻击.你必须设置MySQL受权表(grant table),使得他们不答应拜候服务器管理的数据库内容,除非供应有效的用户名和口令.

下面就具体介绍若何设置文件系统和受权表mysql,实现MySQL的两级安全性.

1、内部安全性-保证数据目录拜候的安全
MySQL服务器通过在MySQL数据库中的受权表供应了一个机动的权限系统.你可以设置这些表的内容,答应或回绝客户对数据库的拜候,这供应了你避免未受权的网络拜候对你数据库攻击的安全手段,但是假如主机上其他用户能直接拜候数据目录内容,成立对通过网络拜候数据库的杰出安全性对你毫无帮忙,除非你知道你是登录MySQL服务器运行主机的唯一用户,不然你需求关心在这台机械上的其他用户得到对数据目录的拜候的大概性.

以下是你应当保护的内容:

·数据库文件.很明显,你要保护服务器管理的数据库的私用性.数据库拥有者普通并且应当考虑数据库内容的安全性,即便他们不想,也应当考虑时数据库内容公蛮横,而不是通过糟糕的数据目录的安全性来表露这些内容.
·日记文件.普通和更新日记必须保证安全,因为他们包含查询文本.对日记文件有拜候权限的任何人可以监督数据库举行过的操作.
更要重点考虑的日记文件安全性是诸如GRANT和SET PASSword等的查询也被记录了,普通和更新日记包含有敏感查询的文本,包含口令(MySQL利用口令加密,但它在已经完成设置后才应用于今后的衔接成立.设置一个口令的历程计划象GRANT或SET PASSWORD等查询,并且这些查询以普通文本情势记录在日记文件中).假如一个攻击者犹如日文件的读权限,只需在日记文件上运行grep探求诸如GRANT和PASSWORD等词来发现敏感信息.
明显,你不想让服务器主机上的其他用户有数据库目录文件的写权限,因为他们可以重写你的状况文件或数据库表文件,但是读权限也很危险.假如一个数据库表文件能被读取,盗取文件并得到MySQL本身,以普通文本显示表的内容也很麻烦,为什么?因为你要做下列事情:

·在服务器主机上安装你自己"特制"的MySQL服务器,但是有一个差别于官方服务器版本的端口、套接字和数据目录.
·运行mysql_install_db初始化你的数据目录,这赋予你作为MySQL root用户拜候你的服务器的权限,所以你有对服务器拜候机制的完好掌握,它也成立一个test数据库.
·将对应于你想偷获得表文件拷贝到你服务器的数据库目录下的test目录.
·启动你的服务器.你可以随便拜候数据库表,SHOW TABLES FROM test显示你有一个偷来的表的拷贝,SELECT *显示它们任何一个的全部内容.
·假如你确切很毒辣,将权限公开给你服务器的任何匿名用户,这样任何人能从任何地方衔接服务器拜候你的test数据库.你目前将偷来的数据库表公布于众了.
在考虑一下,从相反的角度,你想让别人对你这样吗?当然不!你可以通过在数据库录下履行ls -l号令肯定你的数据库能否包含不安全的文件和目录.查找有"组"和"其他用户"权限设置的文件和目录.下面是一个不安全数据目录的一部份列出:
 
% ls -l
total 10148
drwxrwxr-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 menagerie
drwxrwxr-x 2 mysqladm wheel 512 Jan 25 20:40 mysql
drwxrwxr-x 7 mysqladm wheel 512 Aug 31 1998 sql-bench
drwxrwxr-x 2 mysqladm wheel 1536 May 6 06:11 test
drwx------ 2 mysqladm mysqlgrp 1024 May 8 18:43 tmp
....

正如你看到的,有些数据库有精确的权限,而其他不是.本例的情形是经过一段时间后的后果.较少限制的权限由在权限设置方面比更新版本更不严峻的较早版本服务器设置的(注意更具限制的目录menageria和tmp都有较近日期).MySQL当前版本确保这些文件只能由运行服务器的用户读取.

让我们来改正这些权限,使得只用服务器用户可拜候它们.你的主要保护工具来自于由Unix文件系统本身供应的设置文件和目录属主和情势的工具.下面是我们要做的:

·进入该目录
% cd DATADIR

·设置全部在数据目录下的文件属主为由用于运行服务器的账号拥有(你必须以root履行这步).在本文利用mysqladm和mysqlgrp作为该账号的用户名和组名.你可以利用下列号令之一改变属主:
# chown mysqladm.mysqlgrp .

# find . -follow -type d -print | xargs chown mysqladm.mysqlgrp

·设置你的数据目录和数据库目录的情势使得他们只能由mysqladm读取,这禁止其他用户拜候你数据库目录的内容.你可以用下列号令之一以root或mysqladm身份运行.
% chmod -R go-rwx .

% find . -follow -type d -print | xargs chmod go-rwx

·数据目录内容的属主和情势为mysqladm设置.目前你应当保证你老是以mysqladm用户运行服务器,因为目前这是唯一由拜候数据库目录权限的用户(除root).
在完成这些设置后,你终究应当得到下面的数据目录权限:

% ls -l
total 10148
drwxrwx--- 11 mysqladm mysqlgrp 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 menagerie
drwx------ 2 mysqladm mysqlgrp 512 Jan 25 20:40 mysql
drwx------ 7 mysqladm mysqlgrp 512 Aug 31 1998 sql-bench
drwx------ 2 mysqladm mysqlgrp 1536 May 6 06:11 test
drwx------ 2 mysqladm mysqlgrp 1024 May 8 18:43 tmp
....


 
2、外部安全性-保证网络拜候的安全
MySQL的安全系统是很机动的,它答应你以多种差别方法设置用户权限.普通地,你可以利用尺度的SQL语句GRANT和REVOKE语句做,他们为你改正掌握客户拜候的受权表,但是,你大概由一个不支持这些语句的老版本的MySQL(在3.22.11之前这些语句不起作用),大概你发觉用户权限看起来不是以你想要的方法工作.关于这种情形,理解MySQL受权表的构造和服务器若何操纵它们决意拜候权限是有帮忙的,这样的理解答应你通过直接改正受权表增添、删除或改正用户权限,它也答应你在查抄这些表时诊断权限问题.

关于若何管理用户账号,见《MySQL的用户管理》.而对GRANT和REVOKE语句具体描写,见《MySQL参考手册》.

2.1 MySQL受权表的构造和内容
通过网络衔接服务器的客户对MySQL数据库的拜候由受权表内容来掌握.这些表位于mysql数据库中,并在第一次安装MySQL的历程中初始化(运行mysql_install_db脚本).受权表共有5个表:user、db、host、tables_priv和columns_priv.

表1 user、db和host受权表构造
拜候范围列

user db host
Host Host Host
User Db Db
Password User
数据库/表权限列
Alter_priv Alter_priv Alter_priv
Create_priv Create_priv Create_priv
Delete_priv Delete_priv Delete_priv
Drop_priv Drop_priv Drop_priv
Index_priv Index_priv Index_priv
Insert_priv Insert_priv Insert_priv
References_priv References_priv References_priv
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"来指定口令.

·Db
在columns_priv和tables_priv表中,Db值必须是真正的数据库名(照字面上),不答应情势和空白.在db和host中,Db值可以以字面意义指定或利用SQL情势字符'%'或'_'指定一个通配符.一个'%'或空白匹配任何数据库.

·Table_name,Column_name
这些列中的值必须是照字面意思的表或列名,不答应情势和空白.
某些范围列被服务器视为大小写敏感的,别的不是.这些原则总结在下表中.分外注意Table_name值老是被看做大小写敏感的,即便在查询中的表名的大小写敏感性对待视服务器运行的主机的文件系统而定(UNIX下是大小写敏感,而Windows不是).

表3 受权表范围列的大小写敏感性

Host
User
Password
Db
Table_name
Column_name
大小写敏感性
No
Yes
Yes
Yes
Yes
No

2.2.2 查询拜候考证
每次你发出一个查询,服务器查抄你能否有充足的权限履行它,它以user、db、tables_priv和columns_priv的次序查抄,知道它肯定你有得当的拜候权限或已搜索全部表而一无所获.更具体的说:

·服务器查抄user表匹配你开始衔接的记录以查看你有什么全局权限.假如你有并且它们对查询充足了,服务器则履行它.
·假如你的全局权限不够,服务器为你在db表中探求并将该记录中的权限加到你的全局权限中.假如后果对查询充足,服务器履行它.
·假如你的全局和数据库级组合的权限不够,服务器持续查找,首先在tables_priv表,然后columns_priv表.
·假如你在查抄了全部表之后仍无权限,服务器回绝你履行查询的计划.
用布尔运算的术语,受权表中的权限被服务器这样利用:

user OR tables_priv OR columns_priv

你大概迷惑为什么前面的描写只引用4个受权表,而实际上有5个.实际上服务器是这样查抄拜候权限:

user OR (db AND host) OR tables_priv OR columns_priv

第一个较简单的表达式是因为host表不受GRANT和REVOKE语句影响.假如你老是用GRANT和REVOKE管理用户权限,你毫不需求考虑host表.但是其工作原理你用该知道:

·当服务器查抄数据库级权限时,它关于客户查找db表.假如Host列是空的,它意味着"查抄host表以找出哪一个主机能拜候数据库".

·服务器在host表中查找有与来自db表的记录像同的Db列值.假如没有host记录匹配客户主机,则没有授与数据库级权限.假如这些记录的任何一个的确有一个匹配衔接的客户主机的Host列值,db表记录和host表记录结合产生客户的数据库级权限.
但是,权限用一个逻辑AND(与)结合起来,这意味着除非一个给定的权限在两个表中都有,不然客户就不具有该权限.以这种方法,你可以在db表中授与一个基本的权限集,然后利用host表对特定的主机有挑选地禁用它们.如你可以答应从你的域中的全部主机拜候数据库,但关闭了那些在较不安全区域的主机的数据库权限.

前面的描写毫无疑问使拜候查抄听起来一个相当复杂的历程,分外是你认为服务器对你发出的每个查询举行权限查抄,但是此历程是很快的,因为服务器其实不从受权表对每个查询查找信息,相反,它在启动时将表的内容读入内存,然后考证查询用的是内存中的副本.这大大提高了拜候查抄操作的性能.但有一个十清楚显的副作用.假如你直接改正受权表内容,服务器将不知道权限的改变.

比方,假如你用一条INSERT语句向user表加入一个新记录来增添一个新用户,命名在记录中的用户将不能衔接服务器.这对管理员新手(有时对有经验的熟行)是很困惑的事情,当时办理办法很简单:在你改变了它们之后奉告服务器重载受权表内容,你可以发一条FLUSH PRIVILEGES或履行mysqladmin flush-privileges(或假如你有一个不支持flush-privileges的老版本,用mysqladmin reload.).

2.2.3 范围列匹配次序
MySQL服务器按一种特定方法排序符受权表中的记录,然后通过顺次浏览记录匹配到来的衔接.找到的第一个匹配决意了被利用的记录.理解MySQL利用的排序次序很重要,分外是对user表.

当服务器读取user表内容时,它按照在Host和User列中的值排序记录,Host值起决意作用(相同的Host值排在一同,然后再按照User值排序).但是,排序不是典序(按词排序),它只是部份是.要紧记的是字面上的词优先于情势.这意味着假如你正从client.your.net衔接服务器而Host有client.your.net和%.your.net两个值,则第一个先选.近似地,%.your.net优先于%.net,然后是%.IP地址的匹配也是这样的.

总之一句话,越具体越优先.可以拜见本文附录的实例.

2.3 避免受权表风险
本届介绍一些在你受权时的一些预防办法,以及不明值的挑选带来的风险.普通地,你要很"鄙吝"地授与超级用户权限,即不要启用user表中条目中的权限,而利用别的受权表,以将用户权限限制于数据库、表、或列.在user表中的权限答应于影响到你的服务器操作或能拜候任何数据库中的任何表.

不要授与对mysql数据库的权限.一个拥有包含受权表数据库权限的用户大概会改正表以获得对其他任何数据库的权限.授与答应一个用户改正mysql数据库表的权限也实际上给了用户以一个全局GRANT权限.假如用户能直接改正表,这也等价于可以发出任何你能想象的任何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权限也能被操纵来危害没有设置充足权限制的文件权限的系统上的数据库.这就是你为什么应当设置数据目录只能由服务器读取的缘由.假如对应于数据库表的文件可被任何人读取,不只是用户服务器账号的用户可读,任何有FILE权限的用户也可通过网络衔接并读取它们.下面演示这个历程:

·成立一个有一个LONGBLOB列的表:
USER test;
CREATE TABLE tmp (b LONGBLOB);

·利用该表读取每个对应于你想盗取的数据库表文件的内容,然后将表内容写入你自己数据库的一个文件中:

LOAD DATA INFILE "./other_db/x.frm" INTO TABLE tmp
FIELDS ESCAPED BY "" LINES TERMINATED BY "";
SELECT * FROM tmp INTO OUTFILE "y.frm"
FIELDS ESCAPED BY "" LINES TERMINATED BY "";
DELETE FROM tmp;
LOAD DATA INFILE "./other_db/x.ISD" INTO TABLE tmp
FIELDS ESCAPED BY "" LINES TERMINATED BY "";
SELECT * FROM tmp INTO OUTFILE "y.ISD"
FIELDS ESCAPED BY "" LINES TERMINATED BY "";
DELETE FROM tmp;
LOAD DATA INFILE "./other_db/x.ISM" INTO TABLE tmp
FIELDS ESCAPED 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权限的用户可以使彼此的权利更强盛.

2.4 不用GRANT设置用户
假如你有一个早于3.22.11的MySQL版本,你不能利用GRANT(或REVOKE)语句设置用户及其拜候权限,但你可以直接改正受权表的内容.假如你理解GRANT语句若何改正受权表,这很简单.那么你通过手工发出INSERT语句就可以自己做一样的事情.

当你发出一条GRANT语句时,你指定一个用户名和主机名,大概还有口令.对该用户生成一个user表记录,并且这些值记录在User、Host和Password列中.假如你在GRANT语句中指定全局权限,这些权限记录在记录的权限列中.此中要留神的是GRANT语句为你加密口令,而INSERT不是,你需求在INSERT中利用PASSWORD()函数加密口令.

假如你指定数据库级权限,用户名和主机名被记录在db表的User和Host列.你为其受权的数据库记录在Db列中,你授与的权限记录在权限列中.

关于表级和列级权限,效果是近似的.在tables_priv和columns_priv表中成立记录以记录用户名、主机名和数据库,还有相关的表和列.授与的权限记录在权限列中.

假如你还记得前面的介绍,你应当能即便不用GRANT语句也能做GRANT做的事情.记着在你直接改正受权表时,你将告诉服务器重载受权表,不然他不知道你的改变.你可以履行一个mysqladmin flush-privileges或mysqladmin reload号令逼迫一个重载.假如你忘掉做这个,你会迷惑为什么服务器不做你想做的事情.

下列GRANT语句成立一个拥有全部权的超级用户.包含受权给别人的本领:

GRANT ALL ON *.* TO anyname@localhost IDENTIFIED BY "passwd"
WITH GRANT OPTION
该语句将在user表中为anyname@localhost成立一个记录,翻开全部权限,因为这里是超级用户(全局)权限存储的地方,要用INSERT语句做一样的事情,语句是:

INSERT INTO user VALUES("localhost","anyname",PASSWORD("passwd"),
"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y")
你大概发现它不工作,这要看你的MySQL版本.受权表的构造已经改变并且你在你的user表大概没有14个权限列.用SHOW COLUMNS找出你的受权表包含的每个权限列,呼应地调整你的INSERT语句. 下列GRANT语句也成立一个拥有超级用户身份的用户,但是只有一个单个的权限:

GRANT RELOAD ON *.* TO flush@localhost IDENTIFIED BY "flushpass"
本例的INSERT语句比前一个简单,它很简单列出列名并只指定一个权限列.全部别的列将设置为缺省的"N":

INSERT INTO user (Host,Password,Reload) VALUES("localhost","flush",PASSWORD("flushpass"),"Y")
数据库级权限用一个ON db_name.*子句而不是ON *.*举行受权:

GRANT ALL ON sample.* TO boris@localhost IDENTIFIED BY "ruby"
这些权限不是全局的,所以它们不存储在user表中,我们仍旧需求在user表中成立一条记录(使得用户能衔接),但我们也需求成立一个db表记录记录数据库集权限:

INSERT INTO user (Host,User,Password) VALUES("localhost","boris",PASSWORD("ruby"))

INSERT INTO db VALUES("localhost","sample_db","boris","Y","Y","Y","Y","Y","Y","N","Y","Y","Y")

"N"列是为GRANT权限;对末尾的一个数据库级具有WITH GRANT OPTION的GRANT语句,你要设置该列为"Y".

要设置表级或列级权限,你对tables_priv或columns_priv利用INSERT语句.当然,假如你没有GRANT语句,你将没有这些表,因为它们在MySQL中同时呈现.假如你确切有这些表并且为了某些缘由想要手工操作它们,要知道你不能用单独的列启用权限.

你设置tables_priv.Table_priv或columns_priv.Column_priv列来设置包含你想启用的权限值.比方,要对一个表启用SELECT和INSERT权限,你要在相关的tables_priv的记录中设置Table_priv为"Select,Insert".

假如你想对一个拥有MySQL账号的用户改正权限,利用UPDATE而不是INSERT,不管你增添或撤消权限都是这样.要完好删除一个用户,从用户利用的每个表中删除记录.

假如你乐意避免发一个查询来直接改正全权表,你可以看一下MySQL自带的mysqlAccess和mysql_setpermissions脚本.

附录1 小查验
在你方才新安装了一个MySQL服务器,在你增添了一个答应衔接MySQL的用户,用下列语句:

GRANT ALL ON samp_db.* TO fred@*.snake.net IDENTIFIED "cocoa"

而fred刚巧在服务器主机上有个账号,所以他试图衔接服务器:

%mysql -u fred -pcocoa samp_db
ERROR 1045: Access denied for user: 'fred@localhost' (Using password: YES)

为什么?

缘由是:

先考虑一下mysql_install_db若何成立初始权限表和服务器若何利用user表记录匹配客户衔接.在你用mysql_install_db初始化你的数据库时,它成立近似这样的user表:

Host User
localhost
pit.snake.net
localhost
pit.snake.net root
root

头两个记录答应root指定localhost或主机名衔接本地服务器,后两个答应匿名用户从本地衔接.当增添fred用户后,

Host User
localhost
pit.snake.net
localhost
pit.snake.net
%.snake.net root
root

fred

在服务器启动时,它读取记录并排序它们(首先按主机,然后按主机上的用户),越具体越排在前面:

Host User
localhost
localhost
pit.snake.net
pit.snake.net
%.snake.net root

root

fred

有localhost的两个记录排在一同,而对root的记录排在第一,因为它比空值更具体.pit.snake.net的记录也近似.全部这些均是没有任何通配符的字面上的Host值,所以它们排在对fred记录的前面,分外是匿名用户排在fred之前.

后果是在fred试图从localhost衔接时,Host列中的一个空用户名的记录在包含%.snake.net的记录前匹配.该记录的口令是空的,因为缺省的匿名用户没有口令.因为在fred衔接时指定了一个口令,由一个错配衔接失利.

这里要记着的是,固然用通配符指定用户可以从其衔接的主机是很便利.但你从本地主机衔接时会有问题,只要你在table表中保存匿名用户记录.

普通地,倡议你删除匿名用户记录:

mysql> DELETE FROM user WHERE User="";

更进一步,同时删除其他受权表中的任何匿名用户,有User列的表有db、tables_priv和columns_priv.

附录2 使一个新的MySQL安装更安全
在你自己安装了一个新的MySQL服务器后,你需求为MySQL的root用户指定一个目录(缺省无口令),不然假如你忘掉这点,你将你的MySQL处于极不安全的状况(至少在一段时间内).

在Unix(Linux)上,在按照手册的指令安装好MySQL后,你必须运行mysql_install_db脚本成立包含受权表的mysql数据库和初始权限.在Windows上,运行分发中的Setup程序初始化数据目录和mysql数据库.假定服务器也在运行.

当你第一次在机械上安装MySQL时,mysql数据库中的受权表是这样初始化的:

·你可以从本地主机(localhost)上以root衔接而不指定口令.root用户拥有全部权限(包含管理权限)并可做任何事情.(趁便阐明,MySQL超级用户与Unix超级用户有相同的名字,他们彼此毫无关系.)
·匿名拜候被授与用户可从本地衔接名为test和任何名字以test_开始的数据库.匿名用户可对数据库做任何事情,但无管理权限.
从本地主机多服务器的衔接是答应的,不管衔接的用户利用一个localhost主机名或真实主机名.如:

% mysql -h localhost test

% mysql -h pit.snake.net test

你以root衔接MySQL乃至不指定口令的事实只是意味着初始安装不安全,所以作为管理员的你首先要做的应当是设置root口令,然后按照你设置口令利用的办法,你也可以奉告服务器重载受权表是它知道这个改变.(在服务器启动时,它重载表到内存中而大概不知道你已经改正了它们.)

对MySQL 3.22和以上版本,你可以用mysqladmin设置口令:

% mysqladmin -u root password yourpassword

关于MySQL的任何版本,你可以用mysql程序并直接改正mysql数据库中的user受权表:

% mysql -u root mysql
mysql>UPDATE user SET password=PASSWORD("yourpassword") WHERE User="root";

假如你有MySQL的老版本,利用mysql和UPDATE.

在你设置完口令后,通过运行下列号令查抄你能否需求奉告服务器重载受权表:

% mysqladmin -u root status

假如服务器仍旧让你以root而不指定口令而衔接服务器,重载受权表:

% mysqladmin -u root reload

在你设置了root的口令后(并且假如需求重载了受权表),你将需求在任什么时刻候以root衔接服务器时指定口令.
  以上是“MySQL安全性指南[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • Windows 搭配 IIS7 PHP MySQL 环境
  • mysql Out of memory (Needed 16777224 bytes)的错误办理
  • mysql提醒[Warning] Invalid (old?) table or database name问题的办理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • MySQL Order By语法介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • mysql数据库插入速度和读取速度的调整记录
  • MySQL Order By索引优化办法
  • MySQL Order By用法分享
  • mysql #1062 –Duplicate entry ''1'' for key ''PRIMARY''
  • MySQL Order By Rand()效率解析
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .