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