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
网友评论