Mysql存取权限系统

Mysql有一个高级的但不标准的存取权限系统.此部分即描述其如何工作.

权限系统做什么

Mysql的权限系统的主要功能是验证从假定主机来的用户连接.以及检查用
户对数据库的select,insert,update和delete操作权限.

其附加功能还包括匿名用户验证及赋予权限以使用Mysql特殊的功能,如从
文件中装入数据和管理操作.

Mysql的用户名和口令

Mysql的用户名和口令在Unix和Windows之间有一些差别:

·用户名,Mysql用于达到其验证目的.与Unix和Windows的用户名毫无干系
(login names).大多数的Mysql客户端缺省的使用Uinx当前用户名作为
Mysql用户名去登录,但那只是为了方便而已.客户端程序允许使用-u或--
user参数指定一个不同的名字.这意味着你不可能使Mysql数据库得到安全
保护除非每一个Mysql用户名都具有口令.任何人都可以用任何名字来企图
连接数据库,如果他们指定的某一个名字恰好没有口令,他们就会取得成功
.

·Mysql用户名可以提高到十六位字符长,而典型的Unix用户名都限制在八位
.

·Mysql的口令跟Unix口令毫无干系.不必把你登录进Unix机器的口令和你用
来在该机器上存取数据库的口令联系起来.

·Mysql使用了与Unix登录进程不同的加密算法.请参见7.3.11节各种函数中
对PASSWORD()和ENCRYPT()函数的描述.

6.3连接上Mysql服务器

Mysql客户端程序通常会让你指定一些连接参数,但你想存取Mysql数据库的时
候:你想连接的主机,你的用户名和口令.例如,Mysql客户端可以象这样开始(
可选参数被加上了""[""和""]""):

shell> mysql [-h 主机名] [-u 用户名] [-p口令]

也可以用--host=主机名,--user=用户名和--password=口令来代替-h,-u和-p
选项.注意,在-p或--password和口令之间没有空格.

如果在命令行没有指定连接参数,Mysql将使用缺省值:

·缺省的主机名是localhost.
·缺省的用户名是你在Unix中的登录名.
·如果没有-p参数则将不提供口令.

因而,对于Unix用户Joe如下的命令是等价的

shell> mysql -h localhost -u joe
shell> mysql -h localhost
shell> mysql -u joe
shell> mysql

其它的客户端的动作与此类似.

在Unix系统中,你不必在每一次调用客户机程序进行连接的时候都在命令行敲入
所有选项,可以为它们指定不同的缺省值.这可以用两种方法来办到:

·你可以在你的home目录中的"".my.cnf""配置文件中的[client]一节指定连接参
数.该文件的相关节看起来可能象这样:

[client]host=host_name
user=user_name
password=your_pass

请参见4.15.4选项文件一节
·你也可以使用环境变量来指定连接参数.主机可以被指定使用MYSQL_HOST,Mysql
用户名可以被指定使用USER,LOGNAME或是LOGIN(尽管这些变量可能已经被设置
成你的Unix登录名,但它们可能被任意改变).口令可以被指定为使用MYSQL_PWD(
但这是不安全的;参见下节)

如果通过多种不同的方法指定连接参数,那么在命令行中指定的值比在配置文件中
和环境变量中指定的值具有更高的优先权.而在配置文件中指定的值又比在环境变
量中指定的值具有更高的优先权.

使你的口令安全

在其它用户可以发现的情况下将你的口令用一种方法暴露的指定出来是相当失策的
.下面列出了当你使用客户端程序时可以用来指定密码的方法,比比较了每一种方法
的优劣:

·在命令行使用一个 -p密码 或 --password=密码 参数.这确很方便,但极不安全,
你密码能被系统状态检测程序看见(如ps),所以可以被其他用户调用出来显示在
命令行上.(MySQL客户端特别在命令行参数初始化时用0覆盖它们,但在该值显得
可见时仍有短暂的间隔).
·用一个-p或--password参数(不指定你的密码).这样,客户端程序会要求密码从终
端输入:

shell> mysql -u 用户名 -p]
Enter password: ********

客户端把你输入的密码以*""字符显示在终端上,以使旁观者无法看见.如此输入
密码比你在命令行上指定密码更安全,因为它对其他用户并不可见.但是,此输入
密码的方法只在你使用交互式程序时才有效.如果你想非交互的从一个脚本中调
用客户端,则没有机会从终端输入密码了.
·把你的密码保存在一个配置文件中.举例来说,你可以把你的密码列在你home目录
下的.my.cnf文件的[client]节:

[client]
password=your_pass

如果你把密码存放在.my.cnf中,那么同组用户和其他用户对该文件必须不能具
有读取和写入的权限.确定文件的存取模式必须为400或600.参见4.15.4节选项文
件.
·你也可以把你的密码存放在MYSQL_PWD环境变量中,但该方法被认为极不安全而通
常不被使用.某些版本的PS包括一个选项可以列出正在运行的进程的环境;你的密
码将被清楚的显示出来,如果你设置了MYSQL_PWD环境变量的话.

总而言之,最安全的方法是在客户端提示输入密码或将密码保存在受到正确保护的
.my.cnf文件中.

MySQL提供的权限

权限信息存放在mysql数据库(即数据库的名字叫mysql)的user, db, host, tables
_priv and columns_priv表中.当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 数据库或表
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权限允许你create或drop(删除)索引.

alter权限允许你使用ALTER TABLE.

create和drop权限允许你create新数据库和表,或drop(删除)存在的数据库和表.

注意,如果你允许一个用户拥有对mysql数据库的drop权限,那么该用户可以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
process processlist, kill

reload命令告诉服务器重新读取认证表.refresh命令刷新所有的数据库,打开和关闭日
志文件.flush-privileges是reload的一个同义词.其它flush-*执行和refresh大致相
同的功能,但是在更有限的范围内,也许在某些场合效果更好.例如,如果你仅想刷新日
志文件,flush-logs就是比refresh更好的选择.

shutdown命令关闭服务器.

processlist命令列出有关服务器中所执行的线程的信息.kill命令杀掉服务器的线程
.你通常只能列出和杀掉你自己的线程,但如果你有process权限就可以列出或杀掉由其
他用户启动的线程.

通常只授予相关用户一些必须权限是一个好办法,当你得学会小心谨慎的授出下列权限:

·grant权限允许用户把他们自己的权限授予另外一些用户.如果两个用户有不同的权
限,而又同时具有grant权限的话,那他们就共同具有了这所有的这些权限.
·alter权限拥有者可以用给表重命名的方式破坏权限系统.
·file权限些许会被滥用,以在数据库表中读取任何的全程文件,该项目可以使用SELECT
进行存取.
·shudown权限也可能被滥用.关闭服务器,对其他所有用户拒绝服务.
·process权限可以以纯文本的方式显示出当前正执行的查询,包含设置和修改密码的查
询.
·mysql数据库上的权限可以用来改变密码和其它存取权限信息.(密码是加密存储的,所
以一个有恶意的用户不能简单的读取它们.但是,如果有足够的权限,他可以把它改成另
一个不同的密码.)

通过MySQL权限系统无法实现下面一些事情:

·你不能明确的指定一个用户将被拒绝存取.也就是说,你不能明确指定匹配一个用户,拒
绝它的连接.
·你不能指定一个用户能在一个数据库中创建和删除表,而不能创建和删除该数据库自身.