`
zhuruxin86
  • 浏览: 103095 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Mysql权限详解

 
阅读更多
转载:http://nyu16.blog.163.com/blog/static/1281536200812094641794/
MySQL权限系统的主要功能是证实连接到一台给定主机的一个用户,并且赋予该用户在一个数据库上select、 insert、update和delete的权限。

    由MySQL使用用户名和口令的方法与Unix或Windows使用的方式有很多不同之处:


MySQL使用于认证目的的用户名,与Unix用户名(登录名字)或Windows用户名无关。缺省地,大多数MySQL客户尝试使用当前Unix用户名作为MySQL用户名登录,但是这仅仅为了方便。客户程序允许用-u或--user选项指定一个不同的名字,这意味着无论如何你不能使得一个数据库更安全,除非所有的MySQL用户名都有口令。任何人可以试图用任何名字连接服务器,而且如果他们指定了没有口令的任何名字,他们将成功。


•MySQL用户名最长可以是16各字符;典型地,Unix用户名限制为8个字符。
•MySQL口令与Unix口令没关系。在你使用登录到一台Unix机器口令和你使用在那台机器上存取一个数据库的口令之间没有必要有关联。
•MySQL加密口令使用了一个Unix登录期间所用的不同算法,见7.4.12 杂项函数一节中描述PASSWORD()和ENCRYPT()函数部分。

附加的功能包括有一个匿名的用户和对于MySQL特定的功能例如LOAD DATA INFILE进行授权及管理操作的能力。

   

当你想要存取一个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使用缺省值:

•缺省主机名是localhost。
•缺省用户名是你的Unix登录名。
•如果没有-p,则没有提供口令。

这样, 对一个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指定(但是这不安全,见下一节) 。

如果连接参数以多种方法被指定,在命令行上被指定的值优先于在配置文件和环境变量中指定的值,而在配置文件指定的值优先于在环境变量指定的值。

   

以一种暴露的可被其他用户发现的方式指定你的口令是不妥当的。当你运行客户程序时,你可以使用下列方法指定你的口令,还有每个方法的风险评估:

•使用一个在命令行上-pyour_pass或--password=your_pass的选项。这很方便但是不安全,因为你的口令对系统状态程序(例如ps)变得可见,它可以被其他的用户调用来显示命令行。(一般MySQL客户在他们的初始化顺序期间用零覆盖命令行参数,但是仍然有一个短暂间隔时间内参数值可见的。)
•使用一个-p或--password选项(没有指定your_pass值)。在这种情况下,客户程序请求来自终端的口令:

shell>mysql - u user_name - pEnter password: ********

客户回应“*”字符到作为输入你的口令的终端使得旁观者不能看见它。因为它对其他用户不可见,与在命令行上指定它相比,这样进入你的口令更安全。然而,这个输入一个口令的方法仅仅为你交互式运行程序是合适的。如果你想要从非交互式运行的一个脚本调用一个客户,就没有从终端输入入口令的机会。

•在一个配置文件中存储你的口令。例如,你可你的主目录的“.my.cnf”文件中的[client]节列出你的口令:

[client]password=your_pass

如果你在“.my.cnf”里面存储口令,文件应该不是组或世界可读或可写的。保证文件的存取模式是400或600。见4.15.4 选项文件。

•你可在MYSQL_PWD环境变量中存储口令,但是这个方法必须想到是极不安全的且应该不使用。ps的某些版本包括显示运行进程的环境的选项;如果你设定MYSQL_PWD,你的口令将对所有人是显而易见的,甚至在没有这样一个版本的ps系统上,假设没有其他方法观察到进程环境是不明智的。

总之,最安全的方法是让客户程序提示口令或在一个适当保护的“.my.cnf”文件中指定口令。

   

权限信息用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权限来显示或杀死其他用户启动的线程。

总的说来,只授予权限给需要他们的那些用户是一个好主意,但是你应该在授予某个权限时试验特定的警告:

•grant权限允许用户放弃他们的权限给其他用户。2个有不同的权限并有grant权限的用户可以合并权限。
•alter权限可以用于通过重新命名表来推翻权限系统。
•file权限可以被滥用在服务器上读取任何世界可读(world-readable,即任何人可读)的文件到一张数据库表,然后其内容能用SELECT被存取。
•shutdown权限通过终止服务器可以被滥用完全拒绝为其他用户服务, 。
•precess权限能被用来察看当前执行的查询的普通文本,包括设定或改变口令查询。
•在mysql数据库上的权限能被用来改变口令和其他存取权限信息。(口令被加密存储,所以一个恶意的用户不能简单地读取他们。然而,有足够的权限,同一个用户能用不同的一个代替一个口令。)

有一些事情你不能用MySQL权限系统做到:

•你不能明显地指定一个给定用户应该被拒绝存取。即,你不能明显地匹配一个用户并且然后拒绝连接。
•你不能指定一个用户有权创建立或抛弃一个数据库中的表,也不能创建或抛弃数据库本身。

    

    MySQL权限系统保证所有的用户可以严格地做他们假定被允许做的事情。当你连接一个MySQL服务器时, 你的身份由你从那连接的主机和你指定的用户名来决定,系统根据你的身份和你想做什么来授予权限。

    MySQL在认定身份中考虑你的主机名和用户名字,是因为有很小的原因假定一个给定的用户在因特网上属于同一个人。例如,用户从whitehouse.gov连接的bill不必和从mosoft.com连接bill是同一个人。 MySQL通过允许你区分在不同的主机上碰巧有同样名字用户来处理它:你可以对从whitehouse.gov连接授与bill一个权限集,而为从microsoft.com的连接授予一个不同的权限集。

MySQL存取控制包含2个阶段:

•阶段1:服务器检查你是否允许连接。
•阶段2:假定你能连接,服务器检查你发出的每个请求。看你是否有足够的权限实施它。例如,如果你从数据库中一个表精选(select)行或从数据库抛弃一个表,服务器确定你对表有select权限或对数据库有drop权限。

服务器在存取控制的两个阶段使用在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' 


简单地说,服务器使用这样的授权表:

•user表范围字段决定是否允许或拒绝到来的连接。对于允许的连接,权限字段指出用户的全局(超级用户)权限。
•db和host表一起使用:
◦db表范围字段决定用户能从哪个主机存取哪个数据库。权限字段决定允许哪个操作。
◦当你想要一个给定的db条目应用于若干主机时,host表作为db表的扩展被使用。例如,如果你想要一个用户能在你的网络从若干主机使用一个数据库,在用户的db表的Host条目设为空值,然后将那些主机的每一个移入host表。这个机制详细描述在6.8 存取控制, 阶段2:请求证实。
•tables_priv和columns_priv表类似于db表,但是更精致:他们在表和列级应用而非在数据库级。

注意管理权限(reload, shutdown, 等等)仅在user表中被指定。这是因为管理性操作是服务器本身的操作并且不是特定数据库,因此没有理由在其他授权表中列出这样的权限。事实上,只需要请教user表来决定你是否执行一个管理操作。

file权限也仅在user表中指定。它不是管理性权限,但你读或谢在服务器主机上的文件的的能力独立于你正在存取的数据库。

当mysqld服务器启动时,读取一次授权表内容。对授权表的更改生效在6.9 权限更改何时生效描述。

当你修改授权表的内容时,确保你按你想要的方式更改权限设置是一个好主意。为帮助诊断问题,见6.13 “存取拒绝引起”错误的原因。对于安全问题上的忠告,见6.14 怎么对使MySQL安全对抗解密高手。

一个有用的诊断工具是mysqlaccess脚本,由Carlier Yves 提供给MySQL分发。使用--help选项调用mysqlaccess查明它怎样工作。注意:mysqlaccess仅用user、db和host表仅检查存取。它不检查表或列级权限。
分享到:
评论

相关推荐

    MySQL逻辑架构-存储引擎-用户权限密码详解

    MySQL逻辑架构-存储引擎-用户权限密码详解 • mysql系统架构 • 常见引擎 • msyql 数据库用户和权限管理 • 修改帐户密码 • 重置root密码

    阿里云下配置MySQL远程连接的步骤详解

    注意一点:当我们修改完mysql权限相关的操作后一定要刷新权限表,使配置生效,执行 flush privileges ; 环境前提:centos7 mysql5.7 1、首先登录位于阿里云上的mysql: mysql -u root -h localhost -p 2、打开...

    MySQL用户权限管理详解

    主要为大家详细介绍了MySQL用户权限管理的相关资料,感兴趣的小伙伴们可以参考一下

    MySQL用户管理和用户授权详解.pdf

    •一 : mysql 用户管理与恢复root 密码[1] •1 新建用户[2] •2 查看用户信息与显示登录用户[3] •3 重命名用户[4] •4 删除用户[5] ... ...•6.2 重启mysql 服务,匿名进入mysql ,修改root 密码[9]...•3 撤销用户权限[16]

    mysql语句查询用户权限过程详解

    在MySQL中,如何查看一个用户被授予了那些权限呢? 授予用户的权限可能分全局层级权限、数据库层级权限、表层级别权限、列层级别权限、子程序层级权限。具体分类如下: 全局层级 全局权限适用于一个给定服务器中的...

    详解利用Dockerfile构建mysql镜像并实现数据的初始化及权限设置

    本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Dockerfile和shell脚本实现这一...

    新版 MySQL DBA 高级视频 基于MySQL 5.7 MySQL 8.0版本.rar

    │ 2_MySQL权限系统介绍.mp4 │ 3_MySQL授权用户和权限回收.mp4 │ 4_MySQL8新的密码认证方式和客户端链接.mp4 │ 5_MySQL Create命令.mp4 │ 6_MySQL CreateTable命令.mp4 │ 7_课堂练习1.mp4 │ 8_MySQL Insert...

    MySQL数据库用户帐号管理基础知识详解

    MySQL3.22.11引入了两个更容易进行这项工作的语句:GRANT 语句创建MySQL用户并指定其权限,REVOKE 语句删除权限。这两个语句充当mysql数据库中的授权表的前端,并提供直接操纵这些表内容的可选择的方法。本文讨论了...

    Mysql User表权限字段说明全介绍

    Mysql User表权限字段说明全介绍 一、mysql权限表user字段详解 二、创建更新mysql用户表

    MySql基础命令详解(基础篇)

    MySql学习笔记(基础篇)-MySql基础命令详解 目录MySql学习笔记(基础篇)-MySql基础命令详解环境介绍Sql的分类DDL语句对库的操作对表的操作DML语言插入记录更新记录删除记录查询记录MySql语法规范 环境介绍 Centos7 ...

    MySQL用户权限验证与管理方法详解

    一、Mysql权限分两阶段验证 1. 服务器检查是否允许连接:用户名、密码,主机地址。 2. 检查每一个请求是否有权限实施。 二、Mysql权限列表 权限 权限级别 权限说明 create 数据库、表或索引 创建数据库、表或...

    CMD命令操作MySql数据库的方法详解

    第一:mysql服务的启动和停止 net stop mysql net start mysql 第二:登陆 mysql –u用户名 [–h主机名或者IP地址] –p密码 说明:用户名是你登录的用户,主机名或者IP地址为可选项,如果是本地连接则不需要,远程...

    MySQL的Grant命令详解

    MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户  一、grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。 代码如下:grant select on testdb.* to common_...

    详解mysql8.0创建用户授予权限报错解决方法

    主要介绍了详解mysql8.0创建用户授予权限报错解决方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    详解MySQL开启远程连接权限

    主要介绍了MySQL开启远程连接权限,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    详解mysql权限和索引

    本篇文章给大家详细分析了mysql的权限和索引相关知识要点,有这方面需要的朋友参考学习下。

Global site tag (gtag.js) - Google Analytics