MYSQL教程MySQL 5.7 学习心得之安全相关特性

MYSQL教程MySQL 5.7 学习心得之安全相关特性,第1张

概述介绍《MYSQL教程MySQL 5.7 学习心得之安全相关特性》开发教程,希望对您有用。

《MysqL教程MysqL 5.7 学习心得之安全相关特性》要点:
本文介绍了MysqL教程MysqL 5.7 学习心得之安全相关特性,希望对您有用。如果有疑问,可以联系我们。

1,账号安全相关的特性
MysqL教程

1.1:创建用户MysqL教程

5.7版本的用户表MysqL.user要求plugin字段非空,且默认值是MysqL_native_password认证插件,并且不再支持MysqL_old_password认证插件.5.7用户长度最大为32字节,之前最大长度为16字节,并且CREATE USER 和 DROP USER 命令里实现了 IF [NOT] EXISTS 条件判断.5.7之后用户通过grant创建用户报warning.如:
MysqL教程

grant all on *.* to dxy@localhost IDentifIEd by 'dxy';query OK,0 rows affected,1 warnings (0.00 sec)show warnings; +---------+------+---------------------------------------------------------------+| Level | Code | Message |+---------+------+---------------------------------------------------------------+| Warning | 1287 | Using GRANT for creating new user is deprecated and will be removed in future release. Create new user with CREATE USER statement. |+---------+------+---------------------------------------------------------------+2 rows in set (0.01 sec)

提示grant创建账户的语法将会被删除,用cerate user代替,创建用户分2步:创建和授权.
MysqL教程

先通过create user 创建用户:
MysqL教程

#明文密码创建CREATE USER 'dxy'@'localhost' IDENTIFIED BY '123456';等同CREATE USER 'dxy'@'localhost' IDENTIFIED WITH 'MysqL_native_password' BY '123456';#加密密码创建CREATE USER 'dxy'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9'; --will be removed in a future release等同CREATE USER 'dxy'@'localhost' IDENTIFIED WITH 'MysqL_native_password' AS '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9';

再通过grant来授权:
MysqL教程

grant select,insert,update,delete on dba_test.* to dxy@localhost;

注意:授权管理用户的时候,不止只有all的权限,还要包括with grant option和proxy的权限.proxy权限需要在代理用户的时候用到.
MysqL教程

查看默认管理用户权限:show grants for root@localhost; ----2条记录 +---------------------------------------------------------------------+ |+---------------------------------------------------------------------+| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION || GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |+---------------------------------------------------------------------+新建管理账号:create user dba@127.0.0.1 IDentifIEd by '123456';授权:GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;授proxy权:创建代理用户的时候需要GRANT PROXY ON ''@'' TO 'dba'@'127.0.0.1' WITH GRANT OPTION;查看:show grants for 'dba'@'127.0.0.1';+--------------------------------------------------------------------+| GRANT ALL PRIVILEGES ON *.* TO 'dba'@'127.0.0.1' WITH GRANT OPTION || GRANT PROXY ON ''@'' TO 'dba'@'127.0.0.1' WITH GRANT OPTION |+--------------------------------------------------------------------+

查看用户权限:
MysqL教程

show grants for dxy@localhost;+---------------------------------------------------------------------------+| Grants for dxy@localhost |+---------------------------------------------------------------------------+| GRANT USAGE ON *.* TO 'dxy'@'localhost' || GRANT SELECT,INSERT,UPDATE,DELETE ON `dba_test`.* TO 'dxy'@'localhost' |+---------------------------------------------------------------------------+

查看用户密码:
MysqL教程

show create user dxy@localhost;+----------------------------------------------------------------------------------+| CREATE USER 'dxy'@'localhost' IDENTIFIED WITH 'MysqL_native_password' AS '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' REQUIRE NONE PASSWORD EXPIRE DEFAulT ACCOUNT UNLOCK |+----------------------------------------------------------------------------------+

1.2:密码过期策略
MysqL教程

为用户设置密码过期时间,一定时间以后,强制用户修改密码.可以直接在create user的时候设置,也可以alter user设置:
MysqL教程

PASSWORD EXPIRE DEFAulT   默认,过期时间受全局变量default_password_lifetime控制
PASSWORD EXPIRE NEVER 永不过期
PASSWORD EXPIRE INTERVAL N DAY   N天后过期
PASSWORD EXPIRE 过期

直接创建用户的时候设置:MysqL教程

create user dxy@localhost IDentifIEd by '123456' password expire interval 10 day; ---- 10天后过期

对已有用户设置MysqL教程

alter user zjy@localhost password expire never; ----永不过期

注意:设置一个用户过期后,登陆会有提示修改密码,不能进行任何 *** 作:适用让程序不能访问数据库.
MysqL教程

设置用户密码过期:MysqL教程

alter user dxy@localhost password expire;

执行任何命令报错:MysqL教程

ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

解决办法:重置密码 alter user dxy@localhost IDentifIEd by '123456';MysqL教程

1.3:锁定禁用用户 alter user
MysqL教程

当某些场景需要"锁"住用户,暂时禁用某个用户:适用让程序不能访问数据库.MysqL教程

设置锁定用户:MysqL教程

alter user dxy@localhost account lock;

登陆报错:MysqL教程

ERROR 3118 (HY000): Access denIEd for user 'dxy'@'localhost'. Account is locked.

解决办法:解锁用户MysqL教程

alter user dxy@localhost account unlock;

1.4 代理用户
MysqL教程

基于MysqL_native_password的认证插件自带了代理用户的功能.代理用户相当于“代理”其他用户的权限,这样很方便的把一个账号的权限授予其他账号,而不需要每个账号都需要执行授权 *** 作.开启代理用户的功能需要开启参数:check_proxy_users 和 MysqL_native_password_proxy_users
MysqL教程

创建原始账号:MysqL教程

create user dxy@127.0.0.1 IDentifIEd by '123456';

授权:MysqL教程

grant all on test.* to dxy@127.0.0.1;

创建代理账号:MysqL教程

create user dxy_proxy@127.0.0.1 IDentifIEd by '123456';

授权代理权限:MysqL教程

grant proxy on dxy@127.0.0.1 to dxy_proxy@127.0.0.1;

查看:MysqL教程

show grants for dxy_proxy@127.0.0.1;+-------------------------------------------------------------+| GRANT USAGE ON *.* TO 'dxy_proxy'@'127.0.0.1' || GRANT PROXY ON 'dxy'@'127.0.0.1' TO 'dxy_proxy'@'127.0.0.1' |+-------------------------------------------------------------+

用代理账号登陆测试:MysqL教程

查看登陆账号:代理账号current_user(),原始账号user()MysqL教程

select user(),current_user();+---------------------+----------------+| user() | current_user() |+---------------------+----------------+| dxy_proxy@127.0.0.1 | dxy@127.0.0.1 |+---------------------+----------------+

查看权限:发现代理账号的权限显示的是原始账号的权限MysqL教程

show grants;+-------------------------------------------------------+ +-------------------------------------------------------+| GRANT USAGE ON *.* TO 'dxy'@'127.0.0.1' || GRANT ALL PRIVILEGES ON `test`.* TO 'dxy'@'127.0.0.1' |+-------------------------------------------------------+

验证代理账号是否有test库的权限:MysqL教程

MysqL> show databases;+--------------------+| Database |+--------------------+| information_schema || test |+--------------------+MysqL> use testMysqL> show tables;+----------------+| tables_in_test |+----------------+| tttt |+----------------+MysqL> select * from tttt; +------+| ID |+------+| 1 || 100 |+------+MysqL> insert into tttt values(2),(200);MysqL> select * from tttt;+------+| ID |+------+| 1 || 100 || 2 || 200 |+------+

验证得出代理账号(dxy_proxy)代理了原始账号(dxy)的权限.
MysqL教程

1.5:其他选项:SSL、MAX_QUERIES_PER_HOUR、MAX_UPDATES_PER_HOUR、MAX_CONNECTIONS_PER_HOUR、MAX_USER_CONNECTIONS.当需要限制账号通过ssl登陆,需要添加require,当需要限制资源,需要添加with:
MysqL教程

create user dxy@localhost IDentifIEd by '123456' require SSL with MAX_QUERIES_PER_HOUR 100 MAX_USER_CONNECTIONS 100 password expire never account unlock;

2,外部相关的安全
MysqL教程

2.1:MysqL5.7已经删除了test数据库,默认安装完后是没有test数据库,原先任何用户都可以访问test数据库,增加安全隐患.
MysqL教程

2.2:MysqL5.7提供了更为简单SSL安全访问配置,并且默认连接就采用SSL的加密方式.在5.7之前,生成SSL相关文件需要自己手动创建,可以查看这篇文章,5.7之后MysqL通过
MysqL教程

MysqL_ssl_rsa_setup可以直接生成了:MysqL教程

root@t20:~# MysqL_ssl_rsa_setup Generating a 2048 bit RSA private key.................................+++....................+++writing new private key to 'ca-key.pem'-----Generating a 2048 bit RSA private key......+++..............................+++writing new private key to 'server-key.pem'-----Generating a 2048 bit RSA private key.........................................................................................+++..+++writing new private key to 'clIEnt-key.pem'-----

可以在数据目录下面看到一些以pem结尾的文件,而这些文件就是开启SSL连接所需要的文件(注意文件权限),之后用账号
MysqL教程

默认登陆:MysqL教程

root@t20:/var/lib/MysqL# MysqL -udba -p -h127.0.0.1Enter password: MysqL> \s--------------MysqL Ver 14.14 distrib 5.7.12,for linux (x86_64) using Editline wrapperConnection ID: 4Current database: Current user: dba@localhostSSL: Cipher in use is DHE-RSA-AES256-SHA......

强制ssl登陆:MysqL教程

root@t20:~# MysqL -udba -p -h127.0.0.1 --ssl=1 WARNING: --ssl is deprecated and will be removed in a future version. Use --ssl-mode instead.Enter password: MysqL> \s--------------MysqL Ver 14.14 distrib 5.7.12,for linux (x86_64) using Editline wrapperConnection ID: 10Current database: Current user: dba@localhostSSL: Cipher in use is DHE-RSA-AES256-SHA......

从上面看到均已ssl登陆,若在创建用户时,希望该用户每次必须通过SSL方式,则需在创建用户通过REQUIRE SSL来进行设置,上面已经介绍.姜承尧文章中的测试案例显示开启SSL性能开销在25%左右:MysqL的SSL加密连接与性能开销
MysqL教程

2.3:MysqL5.7开始建议用户使用 MysqLd --initialize来初始化数据库,放弃之前的MysqL_install_db的方式,新的方式只创建了一个root@localhost的用户,随机密码保存在~/.MysqL_secret文件中,第一次使用必须reset password.
MysqL教程

初始化数据库:新建实例.MysqL教程

MysqLd --initialize --datadir=/var/lib/MysqL3309/MysqL教程

2.4:MysqL5.7 sql_mode的变更,
MysqL教程

5.7默认的sql_mode
MysqL教程

select @@sql_mode;
ONLY_FulL_GROUP_BY,STRICT_TRANS_tableS,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_divISION_BY_ZERO,NO_auto_CREATE_USER,NO_ENGINE_SUBSTITUTIONMysqL教程

5.7之前默认的sql_mode
MysqL教程

select @@sql_mode;
NO_ENGINE_SUBSTITUTIONMysqL教程

看到在5.7中sql_mode更加严格.解释下各个mode的含义:
MysqL教程

ONLY_FulL_GROUP_BY   不要让GROUP BY部分中的查询指向未选择的列  
STRICT_TRANS_tableS 为事务存储引擎启用严格模式,也可能为非事务存储引擎启用严格模式
NO_ZERO_IN_DATE 在严格模式,不接受月或日部分为0的日期
NO_ZERO_DATE 在严格模式,不将 '0000-00-00'做为合法日期
ERROR_FOR_divISION_BY_ZERO 在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误  
NO_auto_CREATE_USER 防止GRANT自动创建新用户,除非还指定了密码
NO_ENGINE_SUBSTITUTION 如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎

在默认情况下5.7的情况:
MysqL教程

----对于datetime类型<NO_ZERO_DATE>:插入"0000-00-00 00:00:00"值,会报错:Incorrect datetime value----对于varchar/char类型<STRICT_TRANS_tableS>:插入字符串超出长度,会报错: Data too long for column...----对于not null的列<STRICT_TRANS_tableS>:插入不指定not null的列会报错:FIEld 'xxx' doesn't have a default value ' ----对于grant<NO_auto_CREATE_USER>:授权一个用户,不指定密码会报错:Can't find any matching row in the user table '----对于engine存储引擎<NO_ENGINE_SUBSTITUTION>:创建一个不支持的存储引擎,不会转换为默认的存储引擎,直接报错:UnkNown storage engine ... Using storage engine InnoDB for table '...'

注意:在一个主从环境下,为保证数据的一致性,一定要设置主从的sql_mode一样,在数据迁移的时候也要保证sql_mode的一致,不然复制和迁移遇到上面的限制均会失败,所以尽可能使用标准sql语法.
MysqL教程

3,总结:
MysqL教程

在MysqL 5.7中,有不少安全性相关的改进:创建账号分2步:用create user来建立账号(账号长度加大),用grant 来授权;初始数据库的时候密码不为空;账号可以锁和可以设置密码过期;test库被删除;默认提供ssl连接;sql_mode增强等.文章从这些方面进行了介绍和测试,进一步加深对MysqL5.7的认识.
MysqL教程

以上所述是小编给大家介绍的MysqL 5.7 学习心得之安全相关特性,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对内存溢出PHP网站的支持!MysqL教程

总结

以上是内存溢出为你收集整理的MYSQL教程MySQL 5.7 学习心得之安全相关特性全部内容,希望文章能够帮你解决MYSQL教程MySQL 5.7 学习心得之安全相关特性所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1162853.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存