理解MySQL用户

2023-09-19  本文已影响0人  古飞_数据

1.认识MySQL用户名结构及限制
2.给用户正确的授权
3.如何查当前的用户和连接用户
4.实战案例:创建业务帐号,复制帐号,管理帐号;
线上多台机器使用同一个帐号连接MySQL,如何禁掉其中一台服务器连接MySQL
5.小议MySQL帐号安全

1.认识MySQL用户名结构及限制

create user "wubx"@'192.168.11.%' identified by 'zstzst'
mysql --protocol=tcp -h dbhost -Pxxx -uwubx -pzstzst
wubx@192.168.11.%
name@host

认证大概步骤
1.连接(来源)校验
2.密码校验
3.操作权限
用户名长度限制
< 5.7.8 length(name) <= 16      超过会有内存溢出

> 5.7.8 length(name) <= 32
函数: user(), current_user()
创建的用户
mysql>create user 'wubx'@'%' identified by 'zstzst";
连接到MySQL中
mysql -h 10.2.53.53 -uwubx -pzstzst
select user(),current_user();

host限制
IPV4,IPV6, localhost,域名
%,_
MySQL中的host以数字开头的机器名,只能和IP匹配
如:192.168.11.10    idc10.bj
%和_都是广匹配
对于host也支持带掩码的方式
使用DNS注意:skip-name-reslove

用户名对应的表:mysql.user

show privileges;  5.7  55 rows

表库级别开发
管理级别
复制级别
help alter user;

mysql_native_password
caching_sha2_password

[mysqld]
default_authentication_plugin=mysql_native_password

金融类 ssl认证

给帐户设置密码

create user ... identified by "密码";
grant ... identified by "密码";
set password for 'wubx'@'%'=password("密码");
mysqladmin password
update授权表(不推荐)
alter user 'wubx'@r%' identified by "密码";
mysql>set password = password('xxx');          5.7版本
mysql>set password ='xxx'                              8.0版本
密码策略
show variables like "validate_password.%";
alter user 'wubx'@'%' password history default;
select user,host,authentication_string from mysql.user;

删除用户

drop user 'wubx'@'%';
直接删除该用户
从授权表中删除该用的记录

rename user 'wubx'@"% ' to 'zst'@′ %';
更改帐号的名称
保留权限。
可以更改:用户名和主机名部分

确保从数据库断开
select concat("kill",id,";") from information_schema.processlist where user='wubx' into outfile '/tmp/k.sql' ;
set global variables like '%pri%';            #secure_file_priv 不能动态分配
mysql>source /tmp/k.sql

系统账号怎么断开? w  ,杀进程


1.创建一个支持192.168.1.%段IP用户可以登录的帐号
2.创建一个支持域名srv%.zst.com域名帐号登录的帐号,更改mysq|服务器上的host解析,让客户端可以登录。
3.利用精确匹配,创建一个只支持192.168.1.10帐号登的帐号
4.给用户添加密码或是重置密码

给用户正确授权

MySQL授权的控制对象:
1.库级别
2.表级别
3.列级别
4.存储过程&事件
5.用户管理级别(admin)

开发对应的权限:
CRUD: create, read, update, delete

用户管理:
添加权限: grant                   help grant
with grant option
删除权限: revoke
grant 权限 on dbname.tablename to 用户
show privileges
revoke 要回收的权限 on dbname.table from 用户
show grants for 'wubx'@'%';


权限控制表

     表                                           用处
mysql.user                      每个创建的用户都会有一条记录
mysql.db                        限制用户作用于特定的DB
mysql.tabls_priv                用于表级别的权限限制
mysql.procs_priv                用于存储过程和函数权限限制
MySQL启动时从mysql库中把权限读取加载到内存中;
如果通过DML更新权限表需要借助于: flush privileges;生效
特别提示:不要对权限表进行DML 操作

用户权限

只读用户
         全局,数据库或表级别权限,只用: SELECT
一般开发帐号
        业务库,权限: INSERT, UPDATE, DELETE, SELECT, Execute
管理用户
        全局级别,权限: INSERT, UPDATE, DELETE, SELECT,
       CREATE,INDEX, ALTER, DROP, FILE, PROCESS,
       SHUTDOWN, SUPER

查看用户权限

show grants
show grants for current_user();
show grants for 'root'@'localhost';

grant语句用于创建或是给现有的用户添加权限
grant SELECT on world.innodb." to 'zst_dev'@ localhost' identified by 'xxx'

关建点描述
       权限列表,多个权限可以用逗号分隔如: INSERT,SELECT (不区别大小写)
      授权的对象:
             所有对象,全局:  *.* 
            数据库级别: <db_name>.*
            表级别: <db_name>.<table_name>
       要创建或是授权的用户: 'user.name'@'hostname'
       密码:可选

使用revoke语句撤消对用户的授权
revoke delete,insert,update on world.jinnodb.* from 'zst'@'%';
revoke all privileges,grant option from 'zst@'%';
REVOKE语法:
     REVOKE关键字指定要撤消的特权列表
     ON子句:指示要撤消特权的级别[全局级时可以不用带]
     FROM子句:指定帐户名称

服务账号 复制账号 监控账号 备份账号 管理账号

MySQL 8.0用户

[mysqld]
default_authentication_plugin=mysql_native_password
character_set_server =utf8
>CREATE USER 'wubx'@' %' IDENTIFIED WITH mysql_native_ password BY 'zstzst';
>GRANT ALL PRIVILEGES ON *.* TO 'wubx'@'%';
>CREATE DATABASE IF NOT EXISTS zst COLLATE 'utf8_ general ci' ;
>show create database zst;

1.设置密码过期
Alter user 'wubx' @' %’ password expire interval 90 day;
Alter user 'wubx' password expire;
2.设置密码重用间隔:
alter user 'wubx' password history 2;
3.一个用户两个密码
alter user 'wubx' identified by 'wubxwubx' retain current password;
Alter user 'wubx' discard old password;
4.锁定帐号
Alter user 'wubx' account lock;

查看当前用户&用户连接

问题
1.当前用的那个帐号连接&权限是什么?
2.当前有哪些连接
3.当前有哪些用户连接
4.当前每个用户有多少个连接?
5.当前有哪些主机连接&每个主机多少个连接?

1.select user(),current_user(); show grants for current_user();
2.show processlist;
3.select user from information_schema.processlist group by user;
4.select user,count(*) as conns from information_schema.processlist group by user;
5.select substring_index(host,":",1) as iphost,count(*) from information_schema.processlist group by iphost;

实战案例:

1.创建业务帐号
        create user 'app_dev'@ 192168 1.%' identified by 'zstzst;
        grant insert, update, delete,update on dbname.* to 'app_dev'@' 192.168.1.%';
2.复制帐号
      create user 'repl'@ %' identified by 'repl4slave';
      grant replication slave on *.* to repl'@'%" ;
3.管理帐号
      create user zstadmin'@'192.168.1.%" identified by 'zstzst';
      grant all privileges on *.* to 'zstadmin'@'192.168.1.% with grant option;
4.线上多台机器使用同一个帐号连接MySQL,如何禁掉其中一台服务器连接MySQL
     create user 'app_dev'@'192.168. 1.%' identified by 'zstzst':
     create user 'app_dev'@'192.168.1.11' identified by 'wubxwubx';

忘记密码

1.利用skip-grant-tables启动
skip-networking

2.黑科技 <= 5.7版本可用
       copy mysql/{user.*} /data/mysql/mysqlX/data/zst/
       chown -R mysql:mysql /data/mysql/mysqlX/data/zst/user.*·在新的环境去更改后再copy回来
3. init-file
/path/mysqld --defaults-file=/path/myxxx.cnf --skip-grant-tables --skip-networking

kill -HUP pid   相当于reload

用户和密码管理

这块大家能想到什么?
安全
应用程序被别人偷走,会不会也拿到MySQL的密码
配置库(zk,consul)
大家有没有好办法处理?
show global like 'max_connect%';   max_connect_errors  默认100次
通过刷新 flush hosts;  重新计数

配置管理中心

5.小议MySQL帐号安全

推荐做法:
应用程序和用户名密码分开存储·用户名长度在8-16个字符
密码长度推荐:16-32个字符,复杂密码策略
可能的情况下实现各组配置加密
每个业务系统,只能看自已的配置·访问别人的配置只能通过API调用
https://wiki.skullsecurity.org/index.php/Passwordsubx

strings user.MYD | grep -A 2 'w'
安全VS性能
ssl认证
密码过期策略
操作系统安全

SQL变量绑定

innodb_data_file_path=ibdata1:1024M:autoextend
innodb_file_per_table=1
https://imysql.cn

上一篇下一篇

猜你喜欢

热点阅读