|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
那时候Sybase已经诞生了6年的时间。至于其他值得关注的开源数据库,PostgreSQL将在2009年达到20岁的生日。虽然MySQL并不是市场上最年轻的数据库,但是却有更多成熟的数据库可供我们选择。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做的事变。记着在你间接修正受权表时,你将关照服务重视载受权表,不然他不晓得你的改动。你能够实行一个mysqladminflush-privileges或mysqladminreload命令强制一个重载。假如你健忘做这个,你会困惑为何服务器不做你想做的事变。
以下GRANT语句创立一个具有一切权的超等用户。包含受权给他人的才能:
GRANTALLON*.*TOanyname@localhostIDENTIFIEDBY"passwd"
WITHGRANTOPTION
该语句将在user表中为anyname@localhost创立一个纪录,翻开一切权限,由于这里是超等用户(全局)权限存储的中央,要用INSERT语句做一样的事变,语句是:
INSERTINTOuserVALUES("localhost","anyname",PASSWORD("passwd"),
"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y")
你大概发明它不事情,这要看你的MySQL版本。受权表的布局已改动并且你在你的user表大概没有14个权限列。用SHOWCOLUMNS找出你的受权表包括的每一个权限列,响应地调剂你的INSERT语句。以下GRANT语句也创立一个具有超等用户身份的用户,可是只要一个单个的权限:
GRANTRELOADON*.*TOflush@localhostIDENTIFIEDBY"flushpass"
本例的INSERT语句比前一个复杂,它很简单列出列名并只指定一个权限列。一切别的列将设置为缺省的"N":
INSERTINTOuser(Host,Password,Reload)VALUES("localhost","flush",PASSWORD("flushpass"),"Y")
数据库级权限用一个ONdb_name.*子句而不是ON*.*举行受权:
GRANTALLONsample.*TOboris@localhostIDENTIFIEDBY"ruby"
这些权限不是全局的,以是它们不存储在user表中,我们仍旧必要在user表中创立一笔记录(使得用户能毗连),但我们也必要创立一个db表纪录纪录数据库集权限:
INSERTINTOuser(Host,User,Password)VALUES("localhost","boris",PASSWORD("ruby"))
INSERTINTOdbVALUES("localhost","sample_db","boris","Y","Y","Y","Y","Y","Y","N","Y","Y","Y")
"N"列是为GRANT权限;对开端的一个数据库级具有WITHGRANTOPTION的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的用户,用以下语句:
GRANTALLONsamp_db.*TOfred@*.snake.netIDENTIFIED"cocoa"
而fred可巧在服务器主机上有个账号,以是他试图毗连服务器:
%mysql-ufred-pcocoasamp_db
ERROR1045:Accessdeniedforuser:fred@localhost(Usingpassword:YES)
为何?
缘故原由是:
先思索一下mysql_install_db怎样创建初始权限表和服务器怎样利用user表纪录婚配客户毗连。在你用mysql_install_db初始化你的数据库时,它创立相似如许的user表:
HostUser
localhost
pit.snake.net
localhost
pit.snake.netroot
root
头两个纪录同意root指定localhost或主机名毗连当地服务器,后两个同意匿名用户从当地毗连。当增添fred用户后,
HostUser
localhost
pit.snake.net
localhost
pit.snake.net
%.snake.netroot
root
fred
在服务器启动时,它读取纪录并排序它们(起首按主机,然后按主机上的用户),越详细越排在后面:
HostUser
localhost
localhost
pit.snake.net
pit.snake.net
%.snake.netroot
root
fred
有localhost的两个纪录排在一同,而对root的纪录排在第一,由于它比空值更详细。pit.snake.net的纪录也相似。一切这些均是没有任何通配符的字面上的Host值,以是它们排在对fred纪录的后面,出格是匿名用户排在fred之前。
了局是在fred试图从localhost毗连时,Host列中的一个空用户名的纪录在包括%.snake.net的纪录前婚配。该纪录的口令是空的,由于缺省的匿名用户没有口令。由于在fred毗连时指定了一个口令,由一个错配且毗连失利。
这里要记着的是,固然用通配符指定用户能够从其毗连的主机是很便利。但你从当地主机毗连时会有成绩,只需你在table表中保存匿名用户纪录。
一样平常地,倡议你删除匿名用户纪录:
mysql>DELETEFROMuserWHEREUser="";
更进一步,同时删除其他受权表中的任何匿名用户,有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-hlocalhosttest
%mysql-hpit.snake.nettest
你以root毗连MySQL乃至不指定口令的现实只是意味着初始安装不平安,以是作为办理员的你起首要做的应当是设置root口令,然后依据你设置口令利用的办法,你也能够告知服务重视载受权表是它晓得这个改动。(在服务器启动时,它重载表到内存中而大概不晓得你已修正了它们。)
对MySQL3.22和以上版本,你能够用mysqladmin设置口令:
%mysqladmin-urootpasswordyourpassword
关于MySQL的任何版本,你能够用mysql程序并间接修正mysql数据库中的user受权表:
%mysql-urootmysql
mysql>UPDATEuserSETpassword=PASSWORD("yourpassword")WHEREUser="root";
假如你有MySQL的老版本,利用mysql和UPDATE。
在你设置完口令后,经由过程运转以下命令反省你是不是必要告知服务重视载受权表:
%mysqladmin-urootstatus
假如服务器仍旧让你以root而不指定口令而毗连服务器,重载受权表:
%mysqladmin-urootreload
在你设置了root的口令后(而且假如必要重载了受权表),你将必要在任什么时候候以root毗连服务器时指定口令。
有的时候,一些缺失的功能可以通过别的办法来实现,例如,在MySQL4.1以前,你可以通过使用join方法来替代子查询的功能。在MySQL5.0中,大多数关系型数据库所要求的功能已经都具备。 |
|