MySQL安全----用户创建与权限控制

2023-05-18 14:20:24 浏览数 (3)

简介

创建用户以及给用户合理的分配权限是提高安全的最有效措施之一。不仅仅是MySQL数据库、对于其他数据库、操作系统、应用系统等等,用户权限分配都是有效的安全措施之一。即使被黑客攻破,但是由于其拿到的用户权限较低,可以有效降低危害。所以对外开放的系统,应尽量使用较低权限的用户。

详解

用户相关命令

create user 'testuser'@'%' identified by 'password'; --创建用户,密码为password,允许所有IP都可以连接 create user 'testuser'@'10.%' identified by 'password'; --创建用户,密码为password,仅允许IP为 10. 的网段可以连接 drop user 'admin'@'localhost';(@不加默认为“%”) --删除用户 Delete FROM user Where User='test' and Host='localhost'; --从USER表删除用户(不建议使用) ALTER USER 'testlocal'@'localhost' identified by 'password'; --修改用户testlocal用户localhost地址的密码为password ALTER USER 'testlocal'@'192.168.1.2' identified by 'password1'; --修改用户testlocal用户192.168.1.2地址的密码为password1 RENAME USER 'test'@'localhost' TO test1@localhost --修改用户名,将test用户名改为test1

MySQL的用户其实可以说是由两部分组成,用户名 网段/IP地址。这也是一个安全设计,网段或IP地址可以限制用户的连接地址,比如设置为localhost127.0.0.1,则只允许本机使用此用户名连接MySQL。也可以使用通配符%,比如testuser@%就是允许所有的IP都可以使用testuser用户连接MySQL,既可以远程连接。再比如testuser@10.%,允许IP地址以 10 开头的网段用testuser用户连接MySQL。 删除用户的方式有两种,但是不建议使用第二种方式直接从user表删除。这与权限有关,在其他表中会存储着用户的权限数据,直接删除user表中数据会删除用户但是不会删除用户的相关权限数据。

用户权限

权限层级

MySQL的权限是有多个层级的,分别是,存储在各个表当中。

mysql.user表

mysql.db表

mysql.tables_priv表

mysql.columns_priv表

全局权限

数据库权限

表权限

列权限

权限判断过程大概是这样的: 客户端操作核实阶段,当客户端的连接请求被MySQL服务器端通过其身份认证后。那么接下来就可以发送数据库的操作命令给服务器端处理,服务器检查用户要执行的操作,在确认权限时,MySQL首先检查user表,如果指定的权限没有在user表中被授权;MySQL将检查db表,db表时下一安全层级,其中的权限限定于数据库层级,在该层级的SELECT权限允许用户查看指定数据库的所有表中的数据;如果在该层级没有找到限定的权限,则MySQL继续检查tables_priv表以及columns_priv表,如果所有权限表都检查完毕,但还是没有找到允许的权限操作,MySQL将返回错误信息,用户请求的操作不能执行,操作失败。

权限分类

权限的分类也有很多种,就比如select查权限、delete删权限。直接看下表:

分类

权限

描述

应用层级

普通权限(应用程序)

CREATE

允许用户创建数据库或表

数据库、表或索引

DROP

允许用户删除数据库或表

数据库或表

GRANT OPTION

允许用户授予权限

数据库、表或保存的程序

ALTER

允许用户改变表结构

DELETE

允许用户删除现存表的行

INDEX

允许用户创建、修改表索引

INSERT

允许用户在表中插入新的记录

SELECT

允许用户查看表记录

UPDATE

允许用户修改表中现有的记录

CREATE VIEW

允许用户创建视图

视图

SHOW VIEW

允许用户查看视图创建语句

视图

ALTER ROUTINE

允许用户修改存储过程、函数

保存的程序

CREATE ROUTINE

允许用户创建存储过程、函数

保存的程序

EXECUTE

允许用户允许以创建的子程序

保存的程序

管理员

FILE

允许用户使用select…into outfile、load data infile 将数据从文件读入表或从表读入文件

服务器主机上的文件访问

CREATE TEMPORARY TABLES

允许用户创建临时表

服务器管理

LOCK TABLES

允许用户使用LOCK TABLES

服务器管理

CREATE USER

允许用户使用CREATE USER,DORP USER,RENAME USER,REVOKE ALL PRIVILEGES

服务器管理

PROCESS

允许用户使用show processlist 查看线程

服务器管理

RELOAD

允许用户使用flush 、重载授权表、清空授权、主机、日志等

服务器管理

REPLICATION CLIENT

允许用户询问从属服务器或主机服务器地址

服务器管理

REPLICATION SLAVE

用于主从复制性从属服务器(从主服务器中读取二进制日志文件)

服务器管理

SHOW DATABASES

允许使用show databases 查看所有的数据库列表,没有这个权限,用户只能看到拥有权限的数据库

服务器管理

SHUTDOWN

允许使用mysqladmin shutdown 关闭mysql服务器

服务器管理

SUPER

允许使用change master,kill,purge master logs 和set global 语句,mysqladmin debug 命令,当数据库达到max_connections 允许连接一次

服务器管理

特殊

allall perivileges

授予所有权限

服务器管理

usage

仅允许用户登录,但不授予权限

服务器管理

相关语法

show grants --查看当前用户权限 show grants for 'test'@'localhost' --查看指定用户的权限,一般只有root用户可以查看其他用户权限 grant 权限 on 数据库.* to 用户; --数据库权限操作 grant select on testdb.* to 'testuser'@'localhost'; --将 testdb 数据库的查询权限授权给 testuser@localhost grant 权限 on 数据库.数据表 to 用户; --表权限操作 grant select on testdb.testtable to 'testuser'@'localhost'; --将 testbd库的 testtables 表的查询权限授权给 testuser@localhost grant 权限(列名1,列名2···) on 数据库.数据表 to 用户; --列权限操作 grant select(column_1,column_2) on testdb.testtable to 'testuser'@'localhost' --将 testbd 库的 testtables 表的 column_1,column_2 列的查询权限授权给 testuser@localhost revoke 权限(列名1,列名2···) on 数据库.数据表 from 用户; --撤销权限,撤销权限语法和授权相似,只需把grant换成revoke,to换成from即可 ··· with grant option; --被授权的用户可以将此权限授权给其他用户 grant select on testdb.testtable to 'testuser'@'localhost' with grant option; --将 testbd库的 testtables 表的查询权限授权给 testuser@localhost ,同时 testuser@localhost 用户可以将 testbd库的 testtables 表的查询权限授权给其他用户 flush privileges; --刷新权限,在执行授权或者撤销权限操作后,需要执行此条语句才会有效

information_schema、performance_schema、test数据库

这三个数据库是安装MySQL默认有的三个库,比较特别。

information_schema数据库不占用物理磁盘,是虚拟数据库。类似于视图,从其他库中取数据。保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表列的数据类型与访问权限等。

information_schema和test数据库默认所有用户都有权限,即使是新建用户。可以新建个用户,然后登录使用show databases;语句查看,会显示这两个数据库。

默认情况下用户只能查看information_schema中的部分表,如果要指用户可以查看全部的表,就要授于它process 权限才行。语法:grant process on *.* to 'testuser'@'localhost';

PERFORMANCE_SCHEMA数据库主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.5默认是关闭的,需要手动开启,在配置文件里添加:

代码语言:javascript复制
[mysqld]
performance_schema=ON

SQL

PERFORMANCE_SCHEMA数据库不能使用 ALL 权限类型直接授权。

0 人点赞