美文网首页
理解MySQL用户

理解MySQL用户

作者: 古飞_数据 | 来源:发表于2023-09-19 13:27 被阅读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

    相关文章

      网友评论

          本文标题:理解MySQL用户

          本文链接:https://www.haomeiwen.com/subject/bzztzrtx.html