DBA之权限控制浅析

MySQL 的用户管理和权限管理

权限表说明

mysql的权限库,只有一个,即mysql库。里面包含了所有的MySQL权限信息

mysql所有表

user表:
包含所有用户(账号)信息

  • 用户字段: Host, User, Password
  • 权限字段: _priv结尾的字段
  • 安全字段: ssl x509字段
  • 资源控制字段: max_开头的字段

db表:
包含所有对所有库的信息

  • 用户字段: Host, User, Db
  • 权限字段: 剩下的_priv结尾的字段

_priv 后缀的表: 授权信息表

授权级别排列:

  • user表 # 全局授权
  • db表# 数据库级别授权
  • 其他 # 表级,列级授权

用户管理

 登陆和退出MySQL
mysql -h host -p port -u user -ppassword -e ‘SQL语句’
-h 后 跟主机 , -p 跟密码,-u 跟用户 -e 后面接一句SQL语句 ,如果前面账号密码主机授权没有问题的话,登录后就会直接执行SQL语句,展示SQL语句执行的结果。 这些信息都在user表中进行授权

创建用户

mysql> flush privileges; 刷新授权表

mysql> create user admin@'localhost' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
*************************** 1. row ***************************
                  Host: localhost
                  User: admin
              Password: *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: 
      password_expired: N
1 row in set (0.01 sec)
可以看到这个用户对主机基本上没有授权
-- 创建用户并且授权*.* 表示对localhost主机所有库表授权
grant select on *.* to admin@'localhost' identified by '123456';

删除用户

mysql> drop user admin;
Query OK, 0 rows affected (0.00 sec)
或者
mysql> delete from user where user=’admin’;
Query OK, 1 row affected (0.00 sec)

mysql> flush privileges;//刷新权限
Query OK, 0 rows affected (0.00 sec)

修改密码(root用户修改自己的密码)

方法一: 通过 mysqladmin 修改密码
mysqladmin -u root -ppasswd password ‘passwd’
这种方式不是在登录mysql控制终端操作的, 直接在shell命令行进行命令操作;

提示: 采用shell命令行修改密码必须采用对应的mysql版本来操作,如果Linux 安装了MariaDB或者说跟现在mysql版本不同的mysql客户端。登录的话没有问题,但是修改密码就会出现错误提示;

可以使用which mysqladmin 来查看命令路径
/usr/bin/mysqladmin
rpm -qa /usr/bin/mysqladmin 查看版本然后对比使用的mysql版本。
有问题则卸载相关mysql 或者采用绝对命令 方式运行正确版本的 mysqlamdin

方法二:登录控制台
UPDATE mysql.user SET authentication_string=password(‘newpassword’) where user=’root’ AND host=’localhost’ ;
flush privileges;
默认root都是登录本机的所以host=localhost,在没有开其他权限的情况下

方法 三:
SET PASSWORD=password(‘newpassword’)
mysql在高版本似乎是在5.7 以上,密码都采用了加密模式,修改密码调用内置的password方法来加密密码。如果是在5.7版本一下 则没有password方法,直接写入明文密码;

权限管理

权限应用的顺序

user(Y|N) >= db >= tables_priv >= columns_priv
相应权限对于的表为
mysql.user >= mysql.db >= mysql.tables_priv >= mysql.columns_priv
一个用户对一个数据库有权限则可以创建,删除这个数据库

语法格式

grant 权限列表 on 库名.表名 to ‘用户名’@’客户端主机’ [identified by ‘密码’ with grant option];

权限列表

all <==> 所有权限(不包括授权权限,如果有了grant语句最后有grant option则有了授权权限)
select(列1, 列2, …), update

参数说明

数据库.表名:
.	所有库的所有表

客户端主机:
%	所有主机
192.168.1.%	192.168.2.0网段的所有主机
192.168.2.1	某个特定的主机

with_option 参数
GRANT OPTION	                授权选项
MAX_QUERIES_PER_HOUR	        允许每小时执行的查询数
MAX_UPDATES_PER_HOUR	        允许每小时执行的更新数
MAX_CONNECTIONS_PER_HOUR	允许每小时可以建立连接数
MAX_USER_CONNECTIONS	        定义单个用户同时可以建立的连接数

查看权限
查看当前用户所有授权
show grants\G
管理员查看其它用户权限
show grants for username \G

权限的回收

不删除用户:
revoke 权限列表 on 数据库名 from 用户名@'客户端主机'
revoke delete on *.* from admin1@'%'; -- 回收删除权限
revoke grant option on *.* from admin1@'%'; -- 取消授权权限
删除用户:
delete from mysql.user where user='admin1'
flush privileges

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据