日期:2011-05-02 15:21:00 来源:本站整理
MySQL中文参考手册7(MySQL存取权限系统)grant设置密码password[MSSQL防范]
本文“MySQL中文参考手册7(MySQL存取权限系统)grant设置密码password[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
MySQL中文参考手册7(MySQL 存取权限系统)-F5ofz
转载 译者:晏子〖返回〗〖转发〗
译者:晏子 (clyan@sohu.com)主页:http://linuxdb.yeah.net
6.3 与MySQL服务器衔接 当你想要存取一个MySQL服务器时,MySQL客户程序普通要求你指定衔接参数:你想要联接的主机、你的用户名和你的口令.比方,mysql客户可以象这样启动(可选的参数被包含在"["和"]"之间): shell> mysql [-h host_name][-u user_name][-pyour_pass ] -h, -u和-p选项的另一种情势是--host=host_name、--user=user_name和--password=your_pass.注意在-p或--password=与跟随它背面的口令之间没有空格. 注意:在号令行上指定一个口令是不安全的!随后在你系统上的任何用户可以通过打近似这样的号令发现你的口令:ps auxww.见4.15.4 选项文件. 关于号令行没有的联接参数,mysql利用缺省值:
这样, 对一个Unix用户joe,下列号令是等价的: shell>mysql -h localhost -u joe shell>mysql -h localhost shell>mysql -u joe shell>mysql 别的MySQL客户程序有一样表现. 在Unix系统上,当你举行一个衔接时,你可以指定要利用的差别的缺省值,这样你没必要每次在你调用一个客户程序是在号令行上输入他们.这可以有很多办法做到: 你能在你的主目录下".my.cnf"的配置文件的[client]小节里指定衔接参数.文件的相关小节看上去大概像这样: [client] host=host_name user=user_name password=your_pass 见4.15.4 选项文件. 你可以用环境变量指定衔接参数.主机可用MYSQL_HOST指定,MySQL用户名字可用USER指定(仅对 Windows),口令可用MYSQL_PWD指定(但是这不安全,见下一节) . 假如衔接参数以多种办法被指定,在号令行上被指定的值优先于在配置文件和环境变量中指定的值,而在配置文件指定的值优先于在环境变量指定的值. 6.4 使你的口令安全 以一种表露的可被其他用户发现的方法指定你的口令是不当当的.当你运行客户程序时,你可以利用下列办法指定你的口令,还有每个办法的风险评价:
6.5 MySQL供应的权限 权限信息用user、db、host、tables_priv和columns_priv表被存储在mysql数据库中(即在名为mysql的数据库中).在MySQL启动时和在6.9 权限改正什么时刻见效所说的情形时,服务器读入这些数据库表内容. 本手册所用的触及由MySQL供应的权限名称显示在下表,还有在受权表中每个权限的表列名称和每个权限有关的上下文: 权限 列 上下文 select Select_priv 表 insert Insert_priv 表 update Update_priv 表 delete Delete_priv 表 index Index_priv 表 alter Alter_priv 表 create Create_priv 数据库、表或索引 drop Drop_priv 数据库或表 grant Grant_priv 数据库或表 references References_priv 数据库或表 reload Reload_priv 服务器管理 shutdown Shutdown_priv 服务器管理 process Process_priv 服务器管理 file File_priv 在服务器上的文件存取 select、insert、update和delete权限答应你在一个数据库现有的表上实施操作. SELECT语句只有在他们真正从一个表中检索行是才需求select权限,你可以履行某个SELECT语句,乃至没有任何到服务器上的数据库里的存取任何东西的答应.比方,你可以利用mysql客户作为一个简单的计算器: mysql> SELECT 1+1; mysql> SELECT PI()*2; index权限答应你成立或丢弃(删除)索引. alter权限答应你利用ALTER TABLE. create和drop权限答应你成立新的数据库和表,或丢弃(删除)现存的数据库和表. 注意:假如你将mysql数据库的drop权限授与一个用户,该用户能丢弃存储了MySQL存取权限的数据库! grant权限答应你把你自己拥有的那些权限授给其他的用户. file权限赐与你用LOAD DATA INFILE和SELECT ... INTO OUTFILE语句读和写服务器上的文件,任何被授与这个权限的用户都能读或写MySQL服务器能读或写的任何文件. 别的的权限用于管理性操作,它利用mysqladmin程序实施.下表显示mysqladmin支配每个管理性权限答应你履行的号令: 优惠 权限拥有者答应履行的号令 reload reload, refresh, flush-privileges, flush-hosts, flush-logs, flush-tables shutdown shutdown precess processlist, kill reload号令奉告服务器再读入受权表,refresh号令清洗全部表并翻开和关闭记录文件,flush-privileges是reload的一个同义词,别的flush-*号令履行近似refresh的功效,但是范围更有限,并且在某些情形下大概更好用.比方,假如你只是想清洗记录文件,flush-logs比refresh是更好的挑选. shutdown号令关掉服务器. processlist号令显示在服务器内履行的线程的信息.kill号令杀死服务器线程.你老是能显示或杀死你自己的线程,但是你需求process权限来显示或杀死其他用户启动的线程. 总的说来,只授与权限给需求他们的那些用户是一个好主张,但是你应当在授与某个权限时试验特定的告诫:
6.6 权限系统工作原理 MySQL权限系统保证全部的用户可以严峻地做他们假定被答应做的事情.当你衔接一个MySQL服务器时, 你的身份由你从那衔接的主机和你指定的用户名来决意,系统按照你的身份和你想做什么来授与权限. MySQL在认定身份中考虑你的主机名和用户名字,是因为有很小的缘由假定一个给定的用户在因特网上属于同一个人.比方,用户从whitehouse.gov衔接的bill没必要和从mosoft.com衔接bill是同一个人. MySQL通过答应你辨别在差别的主机上刚巧有一样名字用户来处理它:你可以对从whitehouse.gov衔接授与bill一个权限集,而为从microsoft.com的衔接授与一个差别的权限集. MySQL存取掌握包含2个阶段:
服务器在存取掌握的两个阶段利用在mysql的数据库中的user、db和host表,在这些受权表中字段以下: 表名称 user db host 范围字段 Host Host Host User Db Db Password User 权限字段 Select_priv Select_priv Select_priv Insert_priv Insert_priv Insert_priv Update_priv Update_priv Update_priv Delete_priv Delete_priv Delete_priv Index_priv Index_priv Index_priv Alter_priv Alter_priv Alter_priv Create_priv Create_priv Create_priv Drop_priv Drop_priv Drop_priv Grant_priv Grant_priv Grant_priv Reload_priv Shutdown_priv Process_priv File_priv 对存取掌握的第二阶段(恳求证实),假如恳求触及表,服务器可以别的参考tables_priv和columns_priv表.这些表的字段以下: 表名称 tables_priv columns_priv 范围字段 Host Host Db Db User User Table_name Table_name Column_name 权限字段 Table_priv Column_priv Column_priv 其他字段 Timestamp Timestamp Grantor 每个受权表包含范围字段和权限字段. 范围字段决意表中每个条目的范围,即,条目实用的上下文.比方, 一个user表条目的Host和User值为'thomas.loc.gov'和'bob'将被用于证实来自主机thomas.loc.gov的bob对服务器的衔接.一样,一个db表条目的Host、User和Db字段的值是'thomas.loc.gov'、'bob'和'reports'将用在bob从主机联接thomas.loc.gov存取reports数据库的时刻. tables_priv和columns_priv表包含范围字段,指出每个条目实用的表或表/列的组合. 关于查抄存取的用处,对比Host值是忽视大小写的.User、Password、Db和Table_name值是辨别大小写的.Column_name值在MySQL3.22.12或今后版本是忽视大小写的. 权限字段指出由一个表条目授与的权限,即,可实施什么操作.服务器组合各种的受权表的信息形成一个用户权限的完好描写.为此利用的法则在6.8 存取掌握, 阶段2:恳求证实描写. 范围字段是字符串,以下所述;每个字段的缺省值是空字符串: 字段名 范例 Host CHAR(60) User CHAR(16) Password CHAR(16) Db CHAR(64) (tables_priv和columns_priv表为CHAR(60)) 在user、db和host表中,全部权限字段被声明为ENUM('N','Y')--每一个都可有值'N'或'Y',并且缺省值是'N'. 在tables_priv和columns_priv表中,权限字段被声明为SET字段: 表名 字段名 大概的调集成员 tables_priv Table_priv 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter' tables_priv Column_priv 'Select', 'Insert', 'Update', 'References' columns_priv Column_priv 'Select', 'Insert', 'Update', 'References' 简单地说,服务器利用这样的受权表:
注意管理权限(reload, shutdown, 等等)仅在user表中被指定.这是因为管理性操作是服务器本身的操作并且不是特定数据库,因此没有来由在其他受权表中列出这样的权限.事实上,只需求请教user表来决意你能否履行一个管理操作. file权限也仅在user表中指定.它不是管理性权限,但你读或谢在服务器主机上的文件的的本领独立于你正在存取的数据库. 当mysqld服务器启动时,读取一次受权表内容.对受权表的更改见效在6.9 权限更改什么时刻见效描写. 当你改正受权表的内容时,确保你按你想要的方法更改权限设置是一个好主张.为帮忙诊断问题,见6.13 "存取回绝惹起"错误的缘由.关于安全问题上的警告,见6.14 怎么对使MySQL安全抵挡解密高手. 一个有效的诊断工具是mysqlAccess脚本,由Carlier Yves 供应应MySQL分发.利用--help选项调用mysqlaccess查明它怎样工作.注意:mysqlaccess仅用user、db和host表仅查抄存取.它不查抄表或列级权限. 6.7 存取掌握, 阶段1:衔接证实 当你试图联接一个MySQL服务器时,服务器基于你的身份和你能否能通过供应精确的口令考证身份来承受或回绝衔接.假如不是,服务器完好具结你的存取,不然,服务器承受衔接,然后进入阶段2并且等候恳求. 你的身份基于2个信息:
身份查抄利用3个user表(Host, User和Password)范围字段履行.服务器只有在一个user表条目匹配你的主机名和用户名并且你供应了精确的口令时才承受衔接. 在user表范围字段可以以下被指定:
非空白Password值代表加密的口令. MySQL不以任何人可以看的纯文本格局存储口令,相反,正在试图联接的一个用户供应的口令被加密(利用PASSWORD()函数),并且与存储了user表中的已经加密的版本对比.假如他们匹配,口令是精确的. 下面的例子显示出各种user表中Host和User条目的值的组合若何利用于到来的衔接: Host 值 User 值 被条目匹配的衔接 'thomas.loc.gov' 'fred' fred, 从thomas.loc.gov 衔接 'thomas.loc.gov' ' 任何用户, 从thomas.loc.gov衔接 '%' 'fred' fred, 从任何主机衔接 '%' ' 任何用户, 从任何主机衔接 '%.loc.gov' 'fred' fred, 从在loc.gov域的任何主机衔接 'x.y.%' 'fred' fred, 从x.y.net、x.y.com,x.y.edu等联接.(这大概无用) '144.155.166.177' 'fred' fred, 从有144.155.166.177 IP 地址的主机衔接 '144.155.166.%' 'fred' fred, 从144.155.166 C类子网的任何主机衔接 既然你能在Host字段利用IP通配符值(比方,'144.155.166.%'匹配在一个子网上的每台主机),有大概某人大概计划根究这种本领,通过命名一台主机为144.155.166.somewhere.com.为了禁止这样的计划,MySQL不答应匹配以数字和一个点起始的主机名,这样,假如你用一个命名为近似1.2.foo.com的主机,它的名字决不会匹配受权表中Host列.只有一个IP数字能匹配IP通配符值. 一个到来的衔接可以被在user表中的超越一个条目匹配.比方,一个由fred从thomas.loc.gov的衔接匹配多个条目如上所述.假如超越一个匹配,服务器怎么挑选利用哪个条目呢?服务器在启动时读入user表后通过排序来办理这个问题,然后当一个用户试图衔接时,以排序的次序浏览条目,第一个匹配的条目被利用. user表排序工作以下,假定user表看起来像这样: +-----------+----------+- | Host | User | ... +-----------+----------+- | % | root | ... | % | jeffrey | ... | localhost | root | ... | localhost | | ... +-----------+----------+- 当服务器在表中读取时,它以最特定的Host值为先的次序布列('%'在Host列里意味着"任何主机"并且是最不特定的).有相同Host值的条目以最特定的User值为先的次序布列(一个空白User值意味着"任何用户"并且是最不特定的).终究排序的user表看起来像这样: +-----------+----------+- | Host | User | ... +-----------+----------+- | localhost | root | ... | localhost | | ... | % | jeffrey | ... | % | root | ... +-----------+----------+- 当一个衔接被尝试时,服务器浏览排序的条目并利用找到的第一个匹配.关于由jeffrey从localhost的一个衔接,在Host列的'localhost'条目首先匹配.那些有空白用户名的条目匹配衔接的主机名和用户名.('%'/'jeffrey'条目也将匹配,但是它不是在表中的第一匹配.) 这是别的一个例子.假定user表看起来像这样: +----------------+----------+- | Host | User | ... +----------------+----------+- | % | jeffrey | ... | thomas.loc.gov | | ... +----------------+----------+- 排序后的表看起来像这样: +----------------+----------+- | Host | User | ... +----------------+----------+- | thomas.loc.gov | | ... | % | jeffrey | ... +----------------+----------+- 一个由jeffrey从thomas.loc.gov的衔接被第一个条目匹配,而一个由jeffrey从whitehouse.gov的衔接被第二个匹配. 广泛的曲解是认为,对一个给定的用户名,当服务器试图对衔接探求匹配时,明确命名那个用户的全部条目将首先被利用.这明显不是事实.先前的例子阐明了这点,在那边一个由jeffrey从thomas.loc.gov的衔接没被包含'jeffrey'作为User字段值的条目匹配,但是由没有效户名的标题匹配! 假如你有服务器衔接的问题,打印出user表并且手工排序它看看第一个匹配在哪儿举行. 6.8 存取掌握,阶段2:恳求证实 一旦你成立了一个衔接,服务器进入阶段2.对在此衔接长进来的每个恳求,服务器查抄你能否有充足的权限来履行它,它基于你但愿履行的操作范例.这恰是在受权表中的权限字段施展作用的地方.这些权限可以来子user、db、host、tables_priv或columns_priv表的任何一个.受权表用GRANT和REVOKE号令操作.见7.26 GRANT和REVOKE 句法.(你可以发觉参考6.6 权限系统怎样工作很有帮忙,它列出了在每个权限表中显现的字段.) user表在一个全局底子上授与赋予你的权限,该权限不管当前的数据库是什么均实用.比方,假如user表授与你delete权限, 你可以删除在服务器主机上从任何数据库删除行!换句话说,user表权限是超级用户权限.只把user表的权限授与超级用户如服务器或数据库主管是明智的.对其他用户,你应当把在user表中的权限设成'N'并且仅在一个特定数据库的底子上受权, 利用db和host表. db和host表授与数据库特定的权限.在范围字段的值可以以下被指定:
db和host表在服务器启动时被读取和排序(同时它读user表).db表在Host、Db和User范围字段上排序,并且host表在Host和Db范围字段上排序.关于user表,排序首先安排最特定的值然后最后最不特定的值,并且当服务器探求匹配入条目时,它利用它找到的第一个匹配. tables_priv和columns_priv表授与表和列特定的权限.在范围字段的值可以以下被指定:
tables_priv和columns_priv表在Host、Db和User字段上被排序.这近似于db表的排序,固然因为只有Host字段可以包含通配符,但排序更简单. 恳求证实进程在下面描写.(假如你熟习存取查抄的源代码,你会注意到这里的描写与在代码利用的算法略有差别.描写等价于代码实际做的东西;它只是差别于使注释更简单.) 对管理恳求(shutdown、reload等等),服务器仅查抄user表条目,因为那是唯一指定管理权限的表.假如条目答应恳求的操作,存取被受权了,不然回绝.比方,假如你想要履行mysqladmin shutdown,但是你的user表条目没有为你授与shutdown权限,存取乃至不用查抄db或host表就被回绝.(因为他们不包含Shutdown_priv行列,没有这样做的必要.) 对数据库有关的恳求(insert、update等等),服务器首先通过查找user表条目来查抄用户的全局(超级用户)权限.假如条目答应恳求的操作,存取被受权.假如在user表中全局权限不够,服务器通过查抄db和host表肯定特定的用户数据库权限:
在肯定了由db和host表条目授与的数据库特定的权限后,服务器把他们加到由user表授与的全局权限中.假如后果答应恳求的操作,存取被受权.不然,服务器查抄在tables_priv和columns_priv表中的用户的表和列权限并把它们加到用户权限中.基于此后果答应或回绝存取. 用布尔术语表示,前面关于一个用户权限若何计算的描写可以这样总结: global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges 它大概不明显,为什么呢,假如全局user条目的权限最初发现对恳求的操作不够,服务器今后把这些权限加到数据库、表和列的特定权限.缘由是一个恳求大概要求超越一种范例的权限.比方,假如你履行一个INSERT ... SELECT语句,你就都要insert和select权限.你的权限必须如此以便user表条目授与一个权限而db表条目授与另一个.在这种情形下,你有必要的权限履行恳求,但是服务器不能自己把两个表辨别开来;两个条目授与的权限必须组合起来. host表能被用来保护一个"安全"服务器列表.在TcX,host表包含一个在本地的网络上全部的机械的表,这些被授与全部的权限. 你也可以利用host表指定不安全的主机.假定你有一台机械public.your.domain,它位于你不认为是安全的一个大众区域,你可以用下列的host表条目子答应除了那台机械外的网络上全部主机的存取: +--------------------+----+- | Host | Db | ... +--------------------+----+- | public.your.domain | % | ... (全部权限设为 'N') | %.your.domain | % | ... (全部权限设为 'Y') +--------------------+----+- 当然,你应当老是测试你在受权表中的条目(比方,利用mysqlaccess)让你确保你的存取权限实际上以你认为的方法被设置. 6.9 权限更改什么时刻见效 当mysqld启动时,全部的受权表内容被读进存储器并且从那点见效. 用GRANT、REVOKE或SET PASSWORD对受权表施行的改正会当即被服务器注意到. 假如你手工地改正受权表(利用INSERT、UPDATE等等),你应当履行一个FLUSH PRIVILEGES语句或运行mysqladmin flush-privileges奉告服务器再装载受权表,不然你的改变将不见效,除非你重启服务器. 当服务器注意到受权表被改变了时,现存的客户衔接有以下影响:
6.10 成立初始的MySQL权限 在安装MySQL后,你通过运行scripts/mysql_install_db安装初始的存取权限.见4.7.1 快速安装概述. scripts/mysql_install_db脚本启动mysqld服务器,然后初始化受权表,包含下列权限调集:
注意:对Win32的初始权限是差别的.见4.12.4 在Win32上运行MySQL. 既然你的安装初始时广开大门,你首先应当做的事情之一是为MySQL root用户指定一个口令.你可以做以下(注意,你利用PASSWORD()函数指定口令): shell> mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD('new_password') WHERE user='root'; mysql> FLUSH PRIVILEGES; 在MySQL 3.22和以上版本中,你可以利用SET PASSWORD语句: shell> mysql -u root mysql mysql> SET PASSWORD FOR root=PASSWORD('new_password'); 设置口令的另一种办法是利用mysqladmin号令: shell> mysqladmin -u root password new_password 注意:假如你利用第一种办法在user表里直接更新口令,你必须奉告服务器再次读入受权表(用FLUSH PRIVILEGES),因为不然改变将不被注意到. 一旦root口令被设置,此后当你作为root与服务器衔接时,你必须供应那个口令. 你大概但愿让root口令为空白以便当你施行附加的安装时,你不需求指定它或测试,但是保证在任何真实的生产工作中利用你的安装之前,设置它. 看看scripts/mysql_install_db脚本,看它若何安装缺省的权限.你可用它作为一个研究若何增添其他用户的底子. 假如你想要初始的权限差别于上面描写的那些,在你运行mysql_install_db之前,你可以改正它. 为了完好重建权限表,删除在包含mysql数据库的目录下全部"*.frm","*.MYI"和"*.MYD"文件.(这是在数据库目录下面命名为"mysql"的目录,当你运行mysqld --help时,它被列出.)然后运行mysql_install_db脚本,大概在首先编辑它拥有你想要的权限之后. 注意:关于比MySQL 3.22.10旧的版本,你不该该删除"*.frm"文件.假如你无意做了,你应当在运行mysql_install_db之前你的MySQL分发中拷回它们. 6.11 向MySQL增添新用户权限 你可以有2个差别的办法增添用户:通过利用GRANT语句或通过直接操作MySQL受权表.对比好的办法是利用GRANT语句,因为他们是更简明并且仿佛错误少些. 下面的例子显示出若何利用mysql客户安装新用户.这些例子假定权限按照从前的章节描写的缺省被安装.这意味着为了改变,你必须在mysqld正在运行同一台机械上,你必须作为MySQL root用户衔接,并且root用户必须对mysql数据库有insert权限和reload管理权限.别的,假如你改变了root用户口令,你必须以下的mysql号令指定它. 你可以通过发出GRANT语句增添新用户: shell> mysql --user=root mysql mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY 'something' WITH GRANT OPTION; mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%" IDENTIFIED BY 'something' WITH GRANT OPTION; mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost; mysql> GRANT USAGE ON *.* TO dummy@localhost; 这些GRANT语句安装3个新用户: monty 可以从任何地方衔接服务器的一个完好的超级用户,但是必须利用一个口令('something'做这个.注意,我们必须对monty@localhost和monty@"%"发出GRANT语句.假如我们增添localhost条目,对localhost的匿名用户条目在我们从本地主机衔接接时由mysql_install_db成立的条目将优先考虑,因为它有更特定的Host字段值,所以以user表布列次序看更早到来. admin 可以从localhost没有一个口令举行衔接并且被授与reload和process管理权限的用户.这答应用户履行mysqladmin reload、mysqladmin refresh和mysqladmin flush-*号令,还有mysqladmin processlist.没有授与数据库有关的权限.他们能在今后通过发出另一个GRANT语句受权. dummy 可以不用一个口令衔接的一个用户,但是只能从本地主机.全局权限被设置为'N'--USAGE权限范例答应你无需权限便可设置一个用户.它假定你将在今后授与数据库相关的权限. 你也可以直接通过发出INSERT语句增添一样的用户存失信息,然后奉告服务器再次装入受权表: shell> mysql --user=root mysql mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('something'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y') mysql> INSERT INTO user VALUES('%','monty',PASSWORD('something'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y') mysql> INSERT INTO user SET Host='localhost',User='admin', Reload_priv='Y', Process_priv='Y'; mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','dummy','); mysql> FLUSH PRIVILEGES; 取决于你的MySQL版本,对上述,你大概必须利用一个差别数目'Y'值(在3.22.11从前的版本有更少的权限列).对admin用户,只用在3.22.11开始的版本具有的越发可读的INSERT扩大的语法. 注意,为了设置一个超级用户,你只需创造一个user表条目,其权限字段设为'Y'.不需求db或host表的条目. 在user表中的权限列不是由最后一个INSERT语句明确设置的(对dummy用户),因此那些列被赋予缺省值'N'.这是GRANT USAGE做的一样的事情. 下列例子增添一个用户custom,他能从主机localhost、server.domain和whitehouse.gov衔接.他只想要从localhost存取bankaccount数据库,从whitehouse.gov存取expenses数据库和从全部3台主机存取customer数据库.他想要从全部3台主机上利用口令stupid. 为了利用GRANT语句设置个用户的权限,运行这些号令: shell> mysql --user=root mysql mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO custom@localhost IDENTIFIED BY 'stupid'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO custom@whitehouse.gov IDENTIFIED BY 'stupid'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO custom@'%' IDENTIFIED BY 'stupid'; 通过直接改正受权表设置用户权限,运行这些号令(注意,在完毕时FLUSH PRIVILEGES): shell> mysql --user=root mysql mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','custom',PASSWORD('stupid')); mysql> INSERT INTO user (Host,User,Password) VALUES('server.domain','custom',PASSWORD('stupid')); mysql> INSERT INTO user (Host,User,Password) VALUES('whitehouse.gov','custom',PASSWORD('stupid')); mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y'); mysql> FLUSH PRIVILEGES; 头3个INSERT语句增添user表条目,答应用户custom用给定口令从差别的主机举行衔接,但是没有授与任何答应(全部权限被设置为缺省值'N').后3个INSERT语句增添db表条目,授与custom以bankaccount、expenses和customer数据库权限,但是只能在从精确的主机存取时.普通,在受权表直接被改正时,服务器必须被奉告再次装入他们(用FLUSH PRIVILEGES)以便使权限改正见效. 假如你想要给特定的用户从一个给定的域上的任何机械上存取权限,你可以发出一个以下的GRANT语句: mysql> GRANT ... ON *.* TO myusername@"%.mydomainname.com" IDENTIFIED BY 'mypassword'; 为了通过直接改正受权表做一样的事情,这样做: mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername', PASSWORD('mypassword'),...); mysql> FLUSH PRIVILEGES; 你也可以利用xmysqladmin、mysql_webadmin乃至xmysql在受权表中插入、改变和更新值.你可以在MySQL的Contrib目录找到这些实用程序. 6.12 怎样设置口令 在前面小节的例子里阐明了一个重要的原则:当你利用INSERT或UPDATE语句存储一个非空的口令时,你必须利用PASSWORD()函数加密它.这是因为在user表中以加密情势存储口令,而不是作为纯文本.假如你忘掉这个事实,你大概像这样试图设置口令: shell> mysql -u root mysql mysql> INSERT INTO user (Host,User,Password) VALUES('%','jeffrey','biscuit'); mysql> FLUSH PRIVILEGES 后果是纯文本值'biscuit'作为口令被存储在user表中.在用户jeffrey试图用这个口令衔接服务器时,mysql客户用PASSWORD()加密它并且将后果送给服务器,服务器对比在user表中的值(它是纯文本值'biscuit')和加密的口令(而不是 'biscuit'),对比失利并且服务器回绝衔接: shell> mysql -u jeffrey -pbiscuit test Access denied 因为当他们被插入user表时,口令必须被加密,相反,INSERT语句应当象这样被指定: mysql> INSERT INTO user (Host,User,Password) VALUES('%','jeffrey',PASSWORD('biscuit')); 当你利用SET PASSWORD语句时,你也必须利用PASSWORD()函数: mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit'); 假如你利用GRANT ... IDENTIFIED BY语句或mysqladmin password号令设置口令,PASSWORD()函数是不必要的.他们都考虑到为你加密口令,多以你可像这样指定一个口令'biscuit': mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit'; 或 shell> mysqladmin -u jeffrey password biscuit 注意: PASSWORD()不是以在Unix口令加密的一样办法施行口令加密.你不该该假定假如你的Unix口令和你的MySQL口令是一样的,PASSWORD()将招致与在Unix口令文件被存储的一样的加密值.见6.2 MySQL 用户名和口令. 6.13 Access denied错误的缘由
6.14 怎样使MySQL安全以抵挡解密高手 当你衔接一个MySQL服务器时,你普通应当利用一个口令.口令不以明文在衔接上传输. 全部别的信息作为能被任何人读懂的文本被传输.假如你耽忧这个,你可以利用紧缩协议(MySQL3.22和以上版本)使事情变得更难.乃至为了使一切更安全,你应当安装ssh(见http://www.cs.hut.fi/ssh).用它,你能在一个MySQL服务器与一个MySQL客户之间得到一个加密的TCP/IP衔接. 为了使一个MySQL系统安全,激烈要求你考虑下列倡议:
下列mysqld选项影响安全: --secure 由gethostbyname()系统调用返回的IP数字被查抄,确保他们解析回到本来的主机名.这对某些外人通过模拟别的主机得到存取权限变得更难.这个选项也增添一些聪明的主机名查抄.在MySQL3.21里,挑选缺省是关掉的,因为它有时它花很长时间履行反向解析.MySQL 3.22缓存主机名并缺省地启用了这个选项. --skip-grant-tables 这个选项招致服务器根本不利用权限系统.这给每个人以完好存取全部的数据库的权利!(通过履行mysqladmin reload,你能奉告一个正在运行的服务器再次开始利用受权表.) --skip-name-resolve 主机名不被解析.全部在受权表的Host的列值必须是IP数字或localhost. --skip-networking 在网络上不答应TCP/IP衔接.全部到mysqld的衔接必须经过Unix套接字举行.这个选项对利用MIT-pthreads的系统是不符合的,因为MIT-pthreads包不支持Unix套接字. -F5ofz 责任编辑:eight(2001-06-07 09:40) |
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论