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

1,账号安全相关的特性

1.1:创建用户

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。如:

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步:创建和授权。

先通过create user 创建用户:

#明文密码创建
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来授权:

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

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

查看默认管理用户权限:
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 |
+--------------------------------------------------------------------+

查看用户权限:

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' |
+---------------------------------------------------------------------------+

查看用户密码:

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:密码过期策略

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

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

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

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

对已有用户设置

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

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

设置用户密码过期:

alter user dxy@localhost password expire;

执行任何命令报错:

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

解决办法:重置密码 alter user dxy@localhost identified by '123456';

1.3:锁定禁用用户 alter user

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

设置锁定用户:

alter user dxy@localhost account lock;

登陆报错:

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

解决办法:解锁用户

alter user dxy@localhost account unlock;

1.4 代理用户

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

创建原始账号:

create user dxy@127.0.0.1 identified by '123456';

授权:

grant all on test.* to dxy@127.0.0.1;

创建代理账号:

create user dxy_proxy@127.0.0.1 identified by '123456';

授权代理权限:

grant proxy on dxy@127.0.0.1 to dxy_proxy@127.0.0.1;

查看:

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' |
+-------------------------------------------------------------+

用代理账号登陆测试:

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

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

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

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

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

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
mysql> use test
mysql> 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)的权限。

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

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,外部相关的安全

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

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

mysql_ssl_rsa_setup可以直接生成了:

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连接所需要的文件(注意文件权限),之后用账号

默认登陆:

root@t20:/var/lib/mysql# mysql -udba -p -h127.0.0.1
Enter password:
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.12, for Linux (x86_64) using EditLine wrapper
Connection id: 4
Current database:
Current user: dba@localhost
SSL: Cipher in use is DHE-RSA-AES256-SHA
...
...

强制ssl登陆:

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 wrapper
Connection id: 10
Current database:
Current user: dba@localhost
SSL: Cipher in use is DHE-RSA-AES256-SHA
...
...

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

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

初始化数据库:新建实例。

mysqld --initialize --datadir=/var/lib/mysql3309/

2.4:MySQL5.7 sql_mode的变更,

5.7默认的sql_mode

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_SUBSTITUTION

5.7之前默认的sql_mode

select @@sql_mode;
NO_ENGINE_SUBSTITUTION

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


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的情况:

----对于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语法。

3,总结:

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

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

(0)

相关推荐

  • mysql 5.7.12 winx64安装配置方法图文教程

    之前安装mysql时未做总结,换新电脑,补上安装记录,安装的时候,找了些网友的安装记录,发现好多坑 1.mysql-5.7.12-winx64.zip下载 官方下载地址:http://dev.mysql.com/downloads/mysql/ 2.解压到C:\job\mysql-5.7.12-winx64 3.在C:\job\mysql-5.7.12-winx64下新建my.ini配置文件 内容如下: ####################配置文件开始###################

  • MySQL 5.5/5.6/5.7及以上版本安装包安装时如何选择安装路径

    安装环境需求: 自从昨天安装了mysql 5.7,发现了一个问题,mysql5.6起,已经不支持2003系统了,如果安装了无法开启服务而且会出现在 本地计算机 无法启动 MySQL57 服务.错误 193: 0xc1,那就是版本不兼容,提示mysqld.exe不是正确的32位程序. 昨天整理的一篇mysql 5.7的安装教程大家可以参考一下: http://www.jb51.net/article/82399.htm 路径问题就可以参考下面的文章了: 从2016年4月以后从官方下载的mysql

  • mysql 5.7.13 安装配置方法图文教程(linux)

    linux环境Mysql 5.7.13安装教程分享给大家,供大家参考,具体内容如下 1系统约定 安装文件下载目录:/data/software Mysql目录安装位置:/usr/local/mysql 数据库保存位置:/data/mysql 日志保存位置:/data/log/mysql 2下载mysql 在官网:http://dev.mysql.com/downloads/mysql/ 中,选择以下版本的mysql下载: 执行如下命名: #mkdir /data/software #cd /da

  • mysql5.7.13.zip安装教程(windows)

    这是我之前进行MySQL免安装版下载与配置的详细过程,先分享给大家. 1. 下载Mysql 官方:http://www.mysql.com→downloads→选社区版本MySQL Community Edition(GPL)→点击Community(GPL)Downloads>>→MySQL Community Server(GPL)→选择自己要下载的版本(我是64位系统选择的是Windows (x86, 64-bit), ZIP Archive)→Downloads→No thanks,

  • mysql 5.7.13 winx64安装配置方法图文教程

    针对之前安装mysql的笔记进行了总结,分享给大家. 1.下载 下载地址:http://dev.mysql.com/downloads/mysql/ 根据电脑配置来选,我选了 windows(x86,64-bit),ZIP Archive这个,点击Download,页面跳转到如下图 点击最下面的No thanks,just start my download,开始下载. 我的mysql安装路径是D:\Mysql\mysql-5.7.13-winx64 2.配置my.ini文件,新增data文件夹

  • mysql 5.7.13 安装配置方法图文教程(win10)

    MySQL是一款关系型数据库管理系统,是由Oracle旗下公司MySQL AB 公司开发,是在web方面最好的.最流行的关系型数据库软件应用之一,深受广大个人使用者以及中小型企业的喜爱. 方法/步骤 双击安装文件,进入安装,如图所示,点击"next",进入下一步 在协议许可(LicenseAgreement)界面,勾选"Iacceptthelicenseterm",然后点击"next" 在选择安装类型(ChoosingaSetupType)界面,

  • mysql 5.7.30安装配置方法图文教程

    之前把服务器里面的MySQL卸了重装,安装mysql时未做总结,换新电脑,补上安装记录,安装的时候,找了些网友的安装记录,发现好多坑 截个图,作为笔记,也正好留给需要的朋友们. MySQL 5.7.3.0 安装 全程截图 经典的MySQL数据库就不需要过多介绍了. 本篇主要介绍MySQL的安装过程,步步截图,跟着弄就行. 1. 下载软件 在这里,我使用的是新版的MySQL 5.7.3.0,其实这些版本大都一样,可忽视. 需要软件的可自行Google,官网可免费下载,不过貌似需要注册账号登录了才能

  • MySQL 5.7 学习心得之安全相关特性

    1,账号安全相关的特性 1.1:创建用户 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.如: grant all on *.* to dxy@lo

  • Mysql学习心得之插入、更新、删除记录

    下面通过图文并茂的方式给大家详解Mysql学习心得之插入.更新.删除记录. 插入记录 复制代码 代码如下: Insert[]into] tb1_name[(col_name,-..)] 自动编号的字段,可以用values default Default 可以赋予默认值 复制代码 代码如下: INSERT USERS VALUES(NULL,'TOM','123',25,1); 可以同时插入多条记录 复制代码 代码如下: INSERT users VALUES(DEFAULT,'TOM','123

  • vue2.X组件学习心得(新手必看篇)

    VUEJS学习网址:https://cn.vuejs.org/ 此文章是用来记录自己的学习和实践心得. 关注点:父子组件之间的通信 看图说话: Pass Props 子组件本身与父组件是孤立的,通过子组件中显示声明的props属性,接收父组件数据; 父组件的数据更新时,子组件的prop会跟着更新: 此数据流动是单向的(看着); Emit Events 子组件使用$.emit(fn)向外抛出自己的内部触发的事件; 父组件是否监听?如果父组件需要监听,使用v-on绑定监听,触发对应事件; 以上为通用

  • 使用Promise解决多层异步调用的简单学习心得

    前言 第一次接触到Promise这个东西,是2012年微软发布Windows8操作系统后抱着作死好奇的心态研究用html5写Metro应用的时候.当时配合html5提供的WinJS库里面的异步接口全都是Promise形式,这对那时候刚刚毕业一点javascript基础都没有的我而言简直就是天书.我当时想的是,微软又在脑洞大开的瞎捣鼓了. 结果没想到,到了2015年,Promise居然写进ES6标准里面了.而且一项调查显示,js程序员们用这玩意用的还挺high. 讽刺的是,作为早在2012年就在M

  • javascript 继承学习心得总结

    看了不少js继承的东西也该总结总结了. 先说一下大概的理解,有不对的还望指正,也好更正一下三观.另外说明下,下面的例子并非原创基本就是改了个变量名啥的,有的甚至直接拿过来用的. js继承是用来干啥的: 首先说js没有真正的跟其他面向对象的语言一样概念的继承,js里边所说的继承是指模拟继承. 具体js继承是干啥呢,刚开始做前端的时候我是用来面试的(最早写些小效果的时候基本用不到,为啥要看呢,因为面试官很爱问这个问题啊),所以就看看大概的,面试时候能说个大概,在这个问题上算是面试党了.后来跟着慢慢的

  • Backbone中View之间传值的学习心得

    Backbone中的View就是用来展示由Model层传出的数据,或者在View里产生的一些数据,包括输入框中输入等产生的数据,由当前View传递到另外一个View层里,应该怎么办呢,我之前读到一位博主<Backbone View的三种通信方式 >写的尤为的清晰,在我实际的项目中,常常使用的也就是最后一种方式. 嘿嘿,分享知识是一件快乐的事情,我就直接借鉴表述一下如下: 直接用 Backbone 作为事件注册机, 代码如下: var ApplicationView = Backbone.Vie

  • python简单线程和协程学习心得(分享)

    python中对线程的支持的确不够,不过据说python有足够完备的异步网络框架模块,希望日后能学习到,这里就简单的对python中的线程做个总结 threading库可用来在单独的线程中执行任意的python可调用对象.尽管此模块对线程相关操作的支持不够,但是我们还是能够用简单的线程来处理I/O操作,以减低程序响应时间. from threading import Thread import time def countdown(n): while n > 0: print('T-minus:

  • 给php新手谈谈我的学习心得

    明天开始期末考试,接着后天就要回福州了,由于家里还没装网络,因此,得有一段时间不能来论坛了,在这之前,我想了下,我给新手解答过问题,演示过代码,好像没谈过自己的学习心得,临走之前,我就来谈谈我学习PHP的心得,虽然是老生长谈,但是我想我的情况还是具有代表性的,希望各位想加入PHPER队伍的新生力量能有所帮助. 大家学习PHP大部分都靠自学,我也不例外,不乏和我一样过去是做ASP的,刚看到PHP代码,我就感到奇怪,怎么里面这么多$啊?好奇怪啊,潜意识我觉得这东西肯定比ASP难多了,可是当我领略了P

  • jQuery学习心得总结(必看篇)

    jQuery 对象 •jQuery 对象就是通过 jQuery 包装 DOM 对象后产生的对象. •jQuery 对象是 jQuery 独有的. •只有 jQuery 对象才能使用 jQuery 的方法,在 jQuery 对象中无法使用 DOM 对象的任何方法,反之 DOM 对象也无法使用任何 jQuery 的方法. •约定:如果获取的是 jQuery 对象,那么要在变量前面加上 $ •jQuery 对象中封装了多个 DOM 对象,同时 jQuery 对象是类数组对象 •数组与类数组对象的区别

  • js学习心得_一个简单的动画库封装tween.js

    具体代码如下: ~function(){ var myEffect = { Linear:function(t,b,c,d){ return c*t/d+b }, Quad: {//二次方的缓动(t^2): easeIn: function(t,b,c,d){ return c*(t/=d)*t + b; }, easeOut: function(t,b,c,d){ return -c *(t/=d)*(t-2) + b; }, easeInOut: function(t,b,c,d){ if

随机推荐