MySQL数据库精研之旅第十三期:吃透用户与权限管理,筑牢数据库安全第一道防线
专栏:MySQL数据库成长记
个人主页:手握风云
目录
一、应用场景
二、用户
2.1. 查看用户
2.2. 创建用户
2.3. 修改密码
2.4. 删除用户
三、权限与授权
3.1. 内置权限列表
3.2. 给用户授权
3.3. 回收权限
一、应用场景
数据库服务安装成功后默认有⼀个root用户,可以新建和操纵数据库服务中管理的所有数据库。在真实的使用过程中,通常每个应用对应着⼀个数据库,我们只希望某个用户只能操纵和管理当前应用对应的那个数据库,而不能操纵和管理其他应⽤的数据库,这时就可以添加⼀个用户并指定用户的权限。
在MySQL中如果要对数据进行某些操作,必须添加一个用户,并对用户赋予相应的权限。安装完MySQL之后,操作系统已经赋予了我们root用户的权限。
二、用户
2.1. 查看用户
MySQL中的用户信息保存在mysql系统数据库的user表中,可以通过select语句查看。
show tables;
desc user;
select host, user, authentication_string from user;
authentication_string代表加密过的密码。我们也可以点击user表查看存储的用户信息。
Host是用户用来登录的主机名或者IP,User是用户名,剩余的是用户所有的权限,"Y"表示拥有权限,"N"表示没有权限。“localhost, user”就是我们使用的用户。
2.2. 创建用户
- 语法
CREATE USER [IF NOT EXISTS] 'user_name'@'host_name' IDENTIFIED BY 'auth_string'
'user_name'@'host_name'统一称为用户,user_name是用来登录MySQL的用户名,host_name是用来登录的主机名或IP,起到一个“白名单”的作用,只有指定的机器上才可以访问MySQL。不指定host_name默认'user_name'@'%',存在安全风险。user_name和host_name需用单引号包裹,避免格式错误。host_name可通过子网掩码/CIDR设置范围(如198.51.100.0/24)。
比如我们想添加一个'gao'@'192.168.0.124'用户,就可以通过我主机的TPV4地址进行访问。这样的用户只能通过一台主机登录到MySQL,如果我们想让局域网内所有的机器都可以登录,就需要把IP地址设置成一个范围。这个范围设置为129.168.100开头的都可以。
- 示例
-- 添加一个名为gao1的新用户,允许从本机登录
create user 'gao1'@'localhost' identified by '123456';
-- 添加一个名为gao2的新用户,允许从192.168.1.1/24网段登录
create user 'gao2'@'192.168.1.1/24' identified by '123456';
如果我们用刚创建的两个用户去登录我主机的MySQL,第一个可以登录,但是第二个主机不允许登录。
第一个用户虽然登录成功,但是还没添加权限,所以不能进行任何数据库的操作。
2.3. 修改密码
- 语法
-- 为指定用户设置密码(推荐)
ALTER USER 'user_name'@'host_name' IDENTIFIED BY 'auth_string';-- (不推荐)
SET PASSWORD FOR 'user_name'@'host_name' = 'auth_string;-- 为当前用户设置密码
SET PASSWORD = 'auth_string';
- 示例
alter user 'gao1'@'localhost' identified by '123457';
2.4. 删除用户
- 语法
-- 可以一次删除多个
DROP USER [IF EXISTS] 'user_name'@'host_name'[, ...]
- 示例
drop user 'gao2'@'192.168.1.1/24';
三、权限与授权
3.1. 内置权限列表
3.2. 给用户授权
-- 查看用户权限
show grants for 'gao1'@'localhost';
- 语法
grant priv_type[, ...] on priv_level to 'user_name'@'host_name' [WITH GRANT OPTION]
priv_level:* | . | db_name.* | db_name.tbl_name等(如.表示所有库表)。
- 示例
-- 为指定用户赋予查询权限
grant select on test3_26_1.* to 'gao1'@'localhost';
-- 授权所有权限
grant ALL on test3_26_1.* to 'gao1'@'localhost';
注意:授权后需刷新权限(flush privileges)或重新登录使其生效。
3.3. 回收权限
- 语法
REVOKE [IF EXISTS] priv_type[, ...] ON priv_level FROM 'user_name'@'host_name'[, ...]