玖叶教程网

前端编程开发入门

MySQL运维实战(2.3)MySQL的权限体系

作者:俊达

MySQL权限划分

MySQL权限按授权范围可以分为三大类:全局权限、数据库权限和对象权限。

  • 全局权限主要用于管理系统模块,这些权限涵盖了对MySQL服务器整体的操作和管理,与具体的数据库或对象无关,因此在授权时需要指定为*.*。
  • 数据库权限是用于管理数据库,这些权限针对特定数据库,允许用户执行与该数据库相关的操作,例如创建、修改、删除数据库等。在授权时需指定database_name.*。
  • 对象权限是用于管理数据库对象,涉及对具体数据库对象(如表、字段)的权限管理,允许用户对特定对象执行特定操作,例如对表进行查询、更新或删除操作。授权时需指定为database_name.table_name或database_name.table_name.column_name。

这种分类使得MySQL的权限管理更加灵活,可以根据实际需求精细地控制不同级别的权限,保障数据库安全性和管理的有效性。

MySQL各权限说明

权限名称

授权范围

描述

ALL

全局权限

实例所有权限

CREATE ROLE

全局权限

创建数据库角色

CREATE TABLESPACE

全局权限

创建表空间

CREATE USER

全局权限

创建数据库用户

DROP ROLE

全局权限

删除数据库角色

PROCESS

全局权限

查看实例中的所有session(show processlist)

默认只能看登录用户的session

PROXY

全局权限


RELOAD

全局权限

执行下面的操作需要reload权限

flush privileges

flush logs

REPLICATION CLIENT

全局权限

查看复制信息的权限(show slave status)

REOLICATION SLAVE

全局权限

复制权限(从主库复制数据)

SHUTDOWN

全局权限

关闭实例

SUPER

全局权限

超级权限

kill任何用户的session

修改参数

管理复制(start slave,change master等)

USAGE

全局权限

无任何权限

SHOW DATABASES

全局权限

查看数据库列表

show databases

CREATE

数据库权限

创建数据库、表

INDEX

对象权限

创建索引(create index)

CREATE VIEW

对象权限

创建视图

CREATE ROUTINE

数据库权限

创建存储过程、函数

DROP

数据库权限

删除表、视图、存储过程、触发器、定时任务

ALTER

对象权限

修改表结构和表的索引

即使没有index权限,也可以使用alter语句添加或删除索引

修改表名称时,同时需要drop权限

ALTER ROUTINE

对象权限

修改存储过程、函数

EVENT

全局权限

创建、删除调度任务

TRIGGER

对象权限

创建触发器的权限

SELECT

对象权限

查询数据

INSERT

对象权限

插入数据

UPDATE

对象权限

更新数据

DELETE

对象权限

删除数据

EXECUTE

对象权限

执行存储过程的权限

REFERENCE

数据库权限

外键引用权限

LOCK TABLES

数据库权限

执行lock tables权限,需要同时对表有select权限

SHOW VIEW

对象权限

查看视图定义(show create view)

一个例子:授权库不一致导致访问报错

1、创建账号并授权
授予账号(cc@%) select和create view的权限。

mysql> create database hello_db_x;
Query OK, 1 row affected (0.01 sec)

mysql> grant select on `hello\_db\_x`.* to 'cc'@'%' identified by '123';
Query OK, 0 rows affected, 1 warning (0.05 sec)

mysql> grant create view, show view on `hello_db_x`.* to 'cc'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> use hello_db_x;
Database changed
mysql> create table tx(a int);
Query OK, 0 rows affected (0.14 sec)

2、使用新账号登陆,创建视图
报没有create view的权限

root@box1 ~]# mysql -ucc -p123
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hello_db_x         |
+--------------------+
2 rows in set (0.00 sec)

mysql> use hello_db_x;


mysql> show tables;
+----------------------+
| Tables_in_hello_db_x |
+----------------------+
| tx                   |
+----------------------+
1 row in set (0.01 sec)

mysql> select * from tx;
Empty set (0.01 sec)


mysql> create or replace view v_xx as select * from tx;
ERROR 1142 (42000): CREATE VIEW command denied to user 'cc'@'localhost' for table 'v_xx'


mysql> show grants;
+------------------------------------------------------------+
| Grants for cc@%                                            |
+------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'cc'@'%'                             |
| GRANT SELECT ON `hello\_db\_x`.* TO 'cc'@'%'               |
| GRANT CREATE VIEW, SHOW VIEW ON `hello_db_x`.* TO 'cc'@'%' |
+------------------------------------------------------------+

创建视图失败,但是通过show grants,可以看到账号有create view的权限。

3、分析原因

hello_db_x库存在2条授权记录,一条有select权限,但是没有create view权限,一条有create view权限,但是无select权限。

mysql使用没有create view权限的那条授权记录,导致create view失败。

mysql> select host, db, user, select_priv, create_view_priv, show_view_priv from mysql.db where user='cc';
+------+--------------+------+-------------+------------------+----------------+
| host | db           | user | select_priv | create_view_priv | show_view_priv |
+------+--------------+------+-------------+------------------+----------------+
| %    | hello_db_x   | cc   | N           | Y                | Y              |
| %    | hello\_db\_x | cc   | Y           | N                | N              |
+------+--------------+------+-------------+------------------+----------------+

4、解决: 重新授权,库名保持一致(包括转义符)

grant create view, show view on `hello\_db\_x`.* to 'cc'@'%';

select host, db, user, select_priv, create_view_priv, show_view_priv from mysql.db where user='cc';
+------+--------------+------+-------------+------------------+----------------+
| host | db           | user | select_priv | create_view_priv | show_view_priv |
+------+--------------+------+-------------+------------------+----------------+
| %    | hello_db_x   | cc   | N           | Y                | Y              |
| %    | hello\_db\_x | cc   | Y           | Y                | Y              |

账号和权限管理实践

以下是一些关于MySQL账号和权限管理的建议:

  1. 避免无密码和弱密码账号:确保不使用没有密码或者弱密码的账号,可以利用validate_password插件来评估密码的强度,从而保证只有强密码被使用。
  2. 删除匿名用户: 删除所有用户名为空的匿名用户,以防止未经授权的访问。
  3. 最小权限原则: 按需分配权限,给予用户所需的最小权限。例如,对于只需要进行查询的账号,仅授予"select"权限。
  4. 区分业务账号权限:对于业务相关的账号,限制权限仅限于数据操作语言(DML)操作,如"insert"、“update”、“delete”、“select”、“lock tables”。通常不建议使用业务账号执行数据定义语言(DDL)操作(如"create"、“alter”、“drop”),以防止对数据库结构的意外更改。
  5. 创建专用的DBA账号: 为数据库管理员(DBA)创建单独的账号,赋予其DDL权限(如"create"、“drop”、"alter"等)。这种职责分离确保了管理任务与常规业务操作分离,增强了对数据库修改的安全性和控制。

这些措施可以有助于更好地保护MySQL数据库安全,并且有条不紊地管理账号和权限,减少潜在的安全风险。

更多技术信息请查看云掣官网云掣YunChe - 可观测运维专家 | 大数据运维托管 | 云MSP服务

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言