日期:2011-05-02 15:21:00 来源:本站整理
MySQL安全性指南 (2)[MSSQL防范]
本文“MySQL安全性指南 (2)[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
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.168128前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权限的用户可以使彼此的权利更强盛. 以上是“MySQL安全性指南 (2)[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论