MySQL之权限管理
本文内容纲要:
一、MySQL权限简介
关于mysql的权限简单的理解就是mysql允许你做你全力以内的事情,不可以越界。比如只允许你执行select操作,那么你就不能执行update操作。只允许你从某台机器上连接mysql,那么你就不能从除那台机器以外的其他机器连接mysql。
那么Mysql的权限是如何实现的呢?这就要说到mysql的两阶段验证,下面详细介绍:第一阶段:服务器首先会检查你是否允许连接。因为创建用户的时候会加上主机限制,可以限制成本地、某个IP、某个IP段、以及任何地方等,只允许你从配置的指定地方登陆。第二阶段:如果你能连接,Mysql会检查你发出的每个请求,看你是否有足够的权限实施它。比如你要更新某个表、或者查询某个表,Mysql会查看你对哪个表或者某个列是否有权限。再比如,你要运行某个存储过程,Mysql会检查你对存储过程是否有执行权限等。
MYSQL到底都有哪些权限呢?从官网复制一个表来看看:
MYSQL的权限如何分布,就是针对表可以设置什么权限,针对列可以设置什么权限等等,这个可以从官方文档中的一个表来说明:
权限分布
可能的设置的权限
表权限
'Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter'
列权限
'Select','Insert','Update','References'
过程权限
'Execute','AlterRoutine','Grant'
二、MySQL权限经验原则:
权限控制主要是出于安全因素,因此需要遵循一下几个经验原则:
1、只授予能满足需要的最小权限,防止用户干坏事。比如用户只是需要查询,那就只给select权限就可以了,不要给用户赋予update、insert或者delete权限。
2、创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段。
3、初始化数据库的时候删除没有密码的用户。安装完数据库的时候会自动创建一些用户,这些用户默认没有密码。
4、为每个用户设置满足密码复杂度的密码。
5、定期清理不需要的用户。回收权限或者删除用户。
三、MySQL权限实战:
1、GRANT命令使用说明:
先来看一个例子,创建一个只允许从本地登录的超级用户jack,并允许将权限赋予别的用户,密码为:jack.
mysql>grantallprivilegeson*.*tojack@'localhost'identifiedby"jack"withgrantoption;
QueryOK,0rowsaffected(0.01sec)
GRANT命令说明:
ALLPRIVILEGES是表示所有权限,你也可以使用select、update等权限。
ON用来指定权限针对哪些库和表。
*.*中前面的*号用来指定数据库名,后面的*号用来指定表名。
TO表示将权限赋予某个用户。
jack@'localhost'表示jack用户,@后面接限制的主机,可以是IP、IP段、域名以及%,%表示任何地方。注意:这里%有的版本不包括本地,以前碰到过给某个用户设置了%允许任何地方登录,但是在本地登录不了,这个和版本有关系,遇到这个问题再加一个localhost的用户就可以了。
IDENTIFIEDBY指定用户的登录密码。
WITHGRANTOPTION这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定WITHGRANTOPTION选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。
备注:可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个select权限,然后又给用户添加一个insert权限,那么该用户就同时拥有了select和insert权限。
2、刷新权限
使用这个命令使权限生效,尤其是你对那些权限表user、db、host等做了update或者delete更新的时候。以前遇到过使用grant后权限没有更新的情况,只要对权限做了更改就使用FLUSHPRIVILEGES命令来刷新权限。
mysql>flushprivileges;
QueryOK,0rowsaffected(0.01sec)
3、查看权限
查看当前用户的权限:
mysql>showgrants;
+---------------------------------------------------------------------+
|Grantsforroot@localhost|
+---------------------------------------------------------------------+
|GRANTALLPRIVILEGESON*.*TO'root'@'localhost'WITHGRANTOPTION|
|GRANTPROXYON''@''TO'root'@'localhost'WITHGRANTOPTION|
+---------------------------------------------------------------------+
2rowsinset(0.00sec)
查看某个用户的权限:
mysql>showgrantsfor'jack'@'%';
+-----------------------------------------------------------------------------------------------------+
|Grantsforjack@%|
+-----------------------------------------------------------------------------------------------------+
|GRANTUSAGEON*.*TO'jack'@'%'IDENTIFIEDBYPASSWORD'*9BCDC990E611B8D852EFAF1E3919AB6AC8C8A9F0'|
+-----------------------------------------------------------------------------------------------------+
1rowinset(0.00sec)
4、回收权限
mysql>revokedeleteon*.*from'jack'@'localhost';
QueryOK,0rowsaffected(0.01sec)
5、删除用户
mysql>selecthost,user,passwordfromuser;
+-----------+------+-------------------------------------------+
|host|user|password|
+-----------+------+-------------------------------------------+
|localhost|root||
|rhel5.4|root||
|127.0.0.1|root||
|::1|root||
|localhost|||
|rhel5.4|||
|localhost|jack|*9BCDC990E611B8D852EFAF1E3919AB6AC8C8A9F0|
+-----------+------+-------------------------------------------+
7rowsinset(0.00sec)
mysql>dropuser'jack'@'localhost';
QueryOK,0rowsaffected(0.01sec)
6、对账户重命名
mysql>renameuser'jack'@'%'to'jim'@'%';
QueryOK,0rowsaffected(0.00sec)
7、修改密码
1、用setpassword命令
mysql>SETPASSWORDFOR'root'@'localhost'=PASSWORD('123456');
QueryOK,0rowsaffected(0.00sec)
2、用mysqladmin
[root@rhel5~]#mysqladmin-uroot-p123456password1234abcd
备注:
格式:mysqladmin-u用户名-p旧密码password新密码
3、用update直接编辑user表
mysql>usemysql
Readingtableinformationforcompletionoftableandcolumnnames
Youcanturnoffthisfeaturetogetaquickerstartupwith-A
Databasechanged
mysql>updateusersetPASSWORD=PASSWORD('1234abcd')whereuser='root';
QueryOK,1rowaffected(0.01sec)
Rowsmatched:1Changed:1Warnings:0
mysql>flushprivileges;
QueryOK,0rowsaffected(0.00sec)
4、在丢失root密码的时候:
[root@rhel5~]#mysqld_safe--skip-grant-tables&
[1]15953
[root@rhel5~]#13091109:35:33mysqld_safeLoggingto'/mysql/mysql5.5/data/rhel5.4.err'.
13091109:35:33mysqld_safeStartingmysqlddaemonwithdatabasesfrom/mysql/mysql5.5/data
[root@rhel5~]#mysql-uroot
WelcometotheMySQLmonitor.Commandsendwith;or\g.
YourMySQLconnectionidis2
Serverversion:5.5.22Sourcedistribution
Copyright(c)2000,2011,Oracleand/oritsaffiliates.Allrightsreserved.
OracleisaregisteredtrademarkofOracleCorporationand/orits
affiliates.Othernamesmaybetrademarksoftheirrespective
owners.
Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.
mysql>\s
--------------
mysqlVer14.14Distrib5.5.22,forLinux(i686)usingEditLinewrapper
Connectionid:2
Currentdatabase:
Currentuser:root@
SSL:Notinuse
Currentpager:stdout
Usingoutfile:''
Usingdelimiter:;
Serverversion:5.5.22Sourcedistribution
Protocolversion:10
Connection:LocalhostviaUNIXsocket
Servercharacterset:utf8
Dbcharacterset:utf8
Clientcharacterset:utf8
Conn.characterset:utf8
UNIXsocket:/tmp/mysql.sock
Uptime:36sec
Threads:1Questions:5Slowqueries:0Opens:23Flushtables:1Opentables:18Queriespersecondavg:0.138
--------------
mysql>usemysql
Readingtableinformationforcompletionoftableandcolumnnames
Youcanturnoffthisfeaturetogetaquickerstartupwith-A
Databasechanged
mysql>updateusersetpassword=PASSWORD('123456')whereuser='root';
QueryOK,1rowaffected(0.00sec)
Rowsmatched:1Changed:1Warnings:0
mysql>flushprivileges;
QueryOK,0rowsaffected(0.00sec)
本文内容总结:
原文链接:https://www.cnblogs.com/Richardzhu/p/3318595.html