当前位置:七道奇文章资讯数据防范MySQL防范
日期:2011-01-25 22:43:00  来源:本站整理

MySQL数据库用户帐号管理底子知识详解[MySQL防范]

赞助商链接



  本文“MySQL数据库用户帐号管理底子知识详解[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
 

MySQL管理员应当知道怎样通过指定哪些用户可衔接到服务器、从那边举行衔接,以及在衔接时做什么,来设置MySQL用户账号.MySQL3.22.11引入了两个更简单举行这项工作的语句:GRANT 语句成立MySQL用户并指定其权限,REVOKE 语句删除权限.这两个语句充当mysql数据库中的受权表的前端,并供应直接操作这些表内容的可挑选的办法.GRANT 和REVOKE 语句影响以下四个表:

 

受权表 内容

user 可衔接到服务器的用户和他们拥有的任何全局特权

db 数据库级的特权

tables_priv 表级特权

columns_priv 列级特权

还有第五个受权表( host),但它不受GRANT 或REVOKE的影响.

 

当您为某个用户公布GRANT 语句时,应在user表中为该用户成立一个项.假如该语句指定了全部全局特权(管理权限或用于全部数据库的权限),则这些指定也被记录在user表中.假如指定了数据库、表或列的权限,它们将记录在db、tables_priv 和columns_priv表中.

利用GRANT 和REVOKE语句比直接改正受权表更简单.但是,倡议您最好通过阅读第12章来增补本章的内容,第12章中具体谈论了受权表.这些表非常重要,作为一位管理员应当理解这些表是怎样在GRANT 和REVOKE 语句级上工作的.

本节下面的部份将谈论若何设置MySQL用户的账号和受权,还将介绍若何撤消权限以及从受权表中删除全部用户,并且将考虑一个困扰很多新的MySQL管理员的难题.

您还要考虑利用mysqlaccess 和mysql_setpermission 脚本,它们是MySQL分发包的构成部份.这些是Perl 的脚本,它们供应了设置用户账号的GRANT 语句的代用品.mysql_setpermission 需求具有DBI 的支持环境.

 

成立新用户和受权

 

GRANT 语句的语法以下:

 

GRANT privileges (columns) 

ON what 

TO user IDENTIFIEDBY "password" 

WITH GRANT OPTION

要利用该语句,需求填写以下部份:

 

privileges 分配给用户的权限.下表列出了可在GRANT 语句中利用的权限阐明符:

 

权限阐明符权限答应的操作

上表显示的第一组权限阐明符实用于数据库、表和列.第二组阐明符是管理特权.普通,这些权限的授与相当保守,因为它们会影响服务器的操作(比方, SHUTDOWN 特权不是按每天来分发的权限).第三组阐明符是特别的.ALL的意思是“全部的权限”,而USAGE 的意思是“无权限”─即成立用户,但不授与任何的权限.

 

columns 权限实用的列.这是可选的,只来设置列专有的权限.假如命名多于一个列,则用逗号脱离.

 

what 权限利用的级别.权限可以是全局的(实用于全部数据库和全部的表)、数据库专有的(实用于某个数据库中的全部表),或表专有的.可以通过指定一个C O L U M N S子句将权限授与特定的列.

user 利用权限的用户.它由用户名和主机名构成.在MySQL中,不但指定谁举行衔接,还要指定从那边衔接.它答应您拥有两个带有相同名字的、从差别位置衔接的用户.MySQL答应在它们之间举行辨别并彼此独立地分配权限.

 

MySQL的用户名就是您在衔接到服务器时指定的名字.该名字与您的UNIX 注册名或Windows 名的没有必定连络.缺省设置时,客户机程序将利用您注册的名字作为MySQL的用户名(假如您不明确指定一个名字的话),但这只是一个约定.有关将root作为可以操作一切MySQL的超级用户名也是这样,就是一种约定.您也可以在受权表中将此名改正成nobody,然后作为nobody 用户举行衔接,以履行需求超级用户特权的操作.

 

password 分配给该用户的口令.这是可选的.假如您不给新用户指定IDENTIFIEDBY子句,该用户不分配口令(是非安全的).关于已有的用户,任何指定的口令将替换旧口令.假如不指定新口令,用户的旧口令仍旧保持不变.当您确切要利用IDENTIFIEDBY 时,该口令串应当是直接量,GRANT 将对口令举行编码.当用SET PASSWORD语句时,不要利用PASSWORD() 函数.

 

WITH GRANT OPTION 子句是可选的.假如包含该子句,该用户可以将GRANT 语句授与的任何权限授与其他的用户.可以利用该子句将受权的本领授与其他的用户.

 

 

用户名、口令以及数据库和表的名称在受权表项中是辨别大小写的,而主机名和列名则不是.

 

通过查询某些问题,普通可以推断出所需的GRANT 语句的范例:

谁可以举行衔接,从那边衔接?

用户应具有什么级别的权限,这些权限实用于什么?

答应用户管理权限吗?

 

让我们来发问这些问题,同时看一些操纵GRANT 语句设置MySQL用户账号的例子.

 

1. 谁可以举行衔接,从那边衔接.

 

您可以答应用户在特定的主机或触及范围很宽的一组主机中举行衔接.在一个极度,假如知道用户将仅从那个主机中举行衔接,则可限定对单个主机的拜候:

 

GRANT ALL ON samp_db.* TO boris@localhost IDENTFIEDBY "ruby" 

GRANT ALL ON samp_db.* TO fred@ares.mars.net IDENTFIEDBY "quartz"

(标记samp_db.* 含义是“在samp_db 数据库中的全部表”)在另一个极度,您大概会有一个用户max,他环游世界并需求可以从世界各地的主机中举行衔接.在这种情形下,无论他从那边衔接您都将答应:

 

GRANT ALL ON samp_db.* TO max@% IDENTFIEDBY "diamond"

‘%’字符起通配符的作用,与LIKE情势匹配的含义相同,在上个语句中,它的意思是“任何主机”.假如您根本不给出主机名部份,则它与指定“ %”的含义相同.因此,max和max@%是等价的.这是设置一个用户最简单的办法,但安全性最小.

 

要想采纳让步的办法,可答应用户在一组有限的主机中举行衔接.比方,要使mary 从snake.net 域的任何主机中举行衔接,可以利用%.snake.net 主机阐明符:

 

GRANT ALL ON samp_db.* TO mary@%.snake.net IDENTFIEDBY "topaz"

该用户标识符的主机部份可用IP 地址而不是主机名给出(假如乐意的话).可以指定一个直接的IP 地址或包含情势字符的地址.一样,自MySQL3.23 起,可以用一个网络掩码来指定IP 号,网络掩码表明了用于该网络号的二进制位数:

 

GRANT ALL ON samp_db.* TO joe@192.168.0.3 IDENTIFIEDBY "water" 

GRANT ALL ON samp_db.* TO ardis@192.168.128.% IDENTIFIEDBY "snow" 

GRANT ALL ON samp_db.* TO rex@192.168.128.0/17 IDENTIFIEDBY "ice"

第一条语句指明用户可举行衔接的特定的主机.第二条语句指定129.168.128 Class C 子网的IP 情势.在第三条语句中, 192.168.128.0/17 指定一个17 位二进制的网络号,并将任何主机与其IP 地址的前17 个二进制位中的192.168.128.0/17 举行匹配.

 

假如MySQL抱怨您指定的用户值,则大概需求利用引号(但对用户名和主机名辨别加引号):

 

GRANT ALL ON samp_db.president TO "my friend"@"boa.snake.net"

 

 

2. 用户应具有什么级别的权限,这些权限实用于什么.

 

您可授与差别级别的权限.全局权限的功效最强,因为它们实用于任何数据库.为了使ethel 成为可以举行一切操作的超级用户(此中包含可以对其他用户受权),公布下列语句:

 

GRANT ALL ON *.* TO ethel@localhost IDENTIFIEDBY "coffee" 

WITH GRANT OPTION

ON 子句中*.* 阐明符的意思是“全部数据库,全部的表”,为保险起见,我们已经指定ethel 只能从本地主机中衔接.限制超级用户从哪些主机上举行衔接普通是明智的做法,因为它限制住了其他用户对口令举行摸索.

 

有些权限(FILE、PROCESS、RELOAD 和SHUTDOWN)是管理权限,只能用NO *.* 全局权限阐明符来授与.假如但愿的话,也可以不用授与数据库级的权限来授与这些权限.比方,下列语句成立了一个flush 用户,它除了公布FLUSH语句外不做其他任何事情.在管理脚本中这大概是有效的,因为需求在这些脚本中履行诸如在日记文件循环期间革新日记的操作:

 

GRANT RELOAD ON *.* TO flush@localhost IDENTIFIEDBY "flushpass"

普通授与管理权限应当是保守的,因为具有这些权限的用户大概影响服务器的操作.

 

数据库级的权限实用于特定数据库中的全部表.这些权限利用ON db_name.* 子句举行授与:

 

GRANT ALL ON samp_db.* TO bill@racer.snake.net IDENTIFIEDBY "rock" 

GRANT SELECT ON menagerie.* TO ro_user@% IDENTIFIEDBY "dirt"

第一条语句将bill 的全部权限授与samp_db 数据库的任何表.第二条语句成立一个限制拜候的用户r o _ user(只读用户),它可以拜候menagerie 数据库的全部表,但只能读取.也就是说,该用户只能公布SELECT 语句.

 

 

在受权表项中指定本地主机名

 

假如您利用服务器的主机名而非localhost,普通存在从该服务器主机衔接的问题.这大概是由于在受权表中指命名字的办法和名字分化器例程( name reslover routine)向程序报告名字的办法之间的错误匹配.假如分化器报告了一个非限定的名字(如pit-viper),但受权表包含了具有全限定的名字的项(如pit-viper.snake.net,反之亦然),则发生错误匹配.

 

为了肯定这种情形能否正在系统中发生,可试着用-h 选项衔接到本地服务器,该选项指定了主机的名字.然后查看服务器的通例日记文件.它是怎样报告主机名的?是以非限定情势还是限定情势?不管它是哪类情势,都将奉告您在公布GRANT 语句时需求怎样指定用户阐明符的主机名部份.

 

可以同时列出很多被授与的单个权限.比方,假如想让用户能读取和改正已有表的内容,但又不答应成立新表或删除表,可按以下受权:

 

GRANT SELECT,INSERT,DELETE,
UPDATE ON samp_db.* TO jennie@% 

IDENTIFIEDBY "boron"

关于更小粒度(fine-grained)的拜候掌握,可以在单个表上受权,乃至在表的单个列上受权.当存在要对用户躲藏的表时,大概,当只答应用户改正特定列时,列专有的权限是有效的.假定历史同盟会中有一些志愿者操纵您作为同盟会秘书应实施的职责来帮忙您工作.这是一个好消息,但您决意首先给新的助手授与对member表只读的权限(该表中包含了会员资格的信息),然后再对他们增添授与该表的expiration 列的列专有UPDATE权限.也就是说,您的助手可以在人们更新其会员资格时举行更改.

第一条语句授与对整个member表的读拜候权并设置口令.第二条语句增添UPDATE权限,但只是对expiration 列.此时不必要再指定口令,因为在第一条语句中已经完成了.

终止日期的工作.设置此MySQL用户的语句以下:

 

假如想要为多个列授与列专有的权限,可指定一个列清单,并用逗号将这些列脱离.比方,为了给assistant 用户增添对member 表地址列的UPDATE权限,可以利用下列语句.新的权限将被增添到对该用户来说已经存在的全部列上:

 

GRANT UPDATE (street,city,state,zip) ON samp_db.member 

TO assistant@localhost

普通,不要给用户授与比实际需求更大的权限.但是,当您想要利用户可以成立存储中间后果的暂时表,而又不答应用户在包含有他们不能改正的数据的数据库中这样做时,就有了要在数据库上授与相当多的答应权限的来由.您可以成立一个单独的数据库(笔者称它为t m p)并授与用户该数据库的全部权限.比方,假如想要mars.net 域的主机中的任何用户都可以利用tmp 数据库,可公布下列GRANT语句:

 

GRANT ALL ON tmp.* TO ""@%.mars.net

在完成这些之后,用户可以利用tmp.tbl_name 格局的名字成立和引用tmp 数据库中的表(用户阐明符中的“” 成立一个匿名用户项,任何用户都与空白用户名相匹配).

 

3. 答应用户管理权限:

 

通过授与数据库全部者数据库的全部权限并在操作时指定WITH GRANT OPTION,可以答应数据库全部者掌握对该数据库的拜候.比方,假如要让alicia 能在big.corp.com 域的全部主机中举行衔接并管理sales 数据库中全部表的权限,应利用GRANT语句.

 

实际上,WITH GRANT OPTION 子句答应将拜候的权利授与给另一个用户.要知道,具有GRANT 权限的两个用户可以彼此授与自己的权限.假如只给一个用户授与SELECT 权限而给另一个用户除SELECT 外还授与了GRANT 和其他的权限,则第二个用户可以使第一个用户“强盛”起来.

 

撤消权限和删除用户

 

为了收回某个用户的权限,可以利用REVOKE 语句.除了要用FROM 替换TO 并且没有IDENTIFIEDBY 或WITH GRANT OPTION 子句外,REVOKE 的语法与GRANT 语句非常类似:

 

REVOKE privileges (columns) ON what FROM user

user 部份必须与您想要撤消其权限的用户的原始GRANT 语句的user 部份相匹配.privileges部份不需求匹配,您可用GRANT 语句受权,然后用REVOKE 语句撤消此中的一部份.REVOKE 语句只删除权限,不删除用户.用户的项仍旧保存在user 表中,即便您撤消了该用户的全部权限也是如此.这意味着该用户仍旧可衔接到服务器上.要想删除整个用户,必须用DELETE 语句将该用户的记录从user 表中直接删除:

 

DELETE 语句删除该用户的项, FLUSH 语句奉告服务器重新加载受权表(当利用GRANT 或REVOKE 语句,而不是直接改正受权表时,这些表将自动重新加载).

 

一个权限难题

 

下面是一个在MySQL邮件清单中反复呈现的情形:一位新的MySQL管理员给某用户增添一个项,利用了主机名部份,该部份是用一个情势来指定的.比方:

 

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

这里的企图是答应用户fred 从snake.net 域的全部主机中举行衔接,并且具有对samp_db 数据库的全部权限.事实上, fred 可以从那些主机中衔接(除了服务器主机本身外).当fred 试着从服务器主机中举行衔接时,该计划以“拜候被回绝”的消息而告失利.即便用户指定了精确的口令也是如此.

 

假如受权表中包含了由mysql_install_db 安装脚本安装的缺省项,这种情形也会发生.其缘由是,当服务器考证fred 衔接的计划时,一个匿名用户项( anonymous-user entry)比fred 项优先.匿名用户项要求该用户不用口令来衔接,并且一个口令错误匹配发生.

目前,只要说改正此问题的办法是从user表中删除匿名用户项就充足了,我们不能用REVOKE,因为该号令只删除权限.要想完好摆脱这些匿名项,履行以下操作:

 

% mysql-uroot mysql mysql> DELETE FROM user where User=""; 

mysql>FLUSH PRIVILEGES;

目前,当fred试图从本地主机衔接时成功了.

  以上是“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 .