数据库安全使用规则

1. 数据库版本及运行要求

  1. 使用稳定的解决了已知漏洞的版本,如5.6.39或5.7.20 (更新 于2018.2)
  2. 以--skip-symbolic-links选项启动数据库:禁止在创建索引和创建表的时候,将索引文件和数据文件链接到其他文件。

2. 通用加固项

  1. 删除冗余数据库, 如test。
    drop database if exists ${dbname};
  2. 清除无用用户(没有用户名的用户)。
    drop user ''
  3. 修改超级用户的密码。
    set password for <user>@<hostname> = password('<yourpassword>')
  4. 配置密码复杂度

    使用validate_password.so插件:

    Installing the MySQL Password Validation Plugin

    配置后,举例:
mysql> create user testuser;
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> CREATE USER 'test'@'localhost' IDENTIFIED BY '123456';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> grant all privileges on *.* to testuser@"%" Identified by "123456";
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> use mysql; update user set password =PASSWORD('123456') where user ='system';
Database changed
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

自问: 使用insert能够绕过 !?

mysql> insert into user(Host,User,Password,ssl_cipher,x509_issuer,x509_subject)  values('%','testuser','123456','BLOB','BLOB','BLOB');
Query OK, 1 row affected (0.00 sec)

自答:

. insert直接插入的123456虽然可以插入成功但表中保存的应是加密后的内容,不能用123456进行登录;

. 使用PASSWORD('123456'),PASSWORD方法会进行校验,校验通过情况下insert方式(insert后记得flush privileges;)添加用户有效!

. 补充:即便使用UPPER(SHA1(UNHEX(SHA1('123456')))) ,插入其加密之后的值,也不能使用“123456”进行登录。

mysql> insert into user(Host,User,Password,ssl_cipher,x509_issuer,x509_subject)  values('%','testuser',PASSWORD('123456'),'BOLOB','BLOB','BLOB');
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> update user set password=UPPER(SHA1(UNHEX(SHA1('123456')))) where user='testuser';
...
mysql> select user,host,password from user;
+-------------+-----------+-------------------------------------------+
| user | host | password |
+-------------+-----------+-------------------------------------------+
| root | 127.0.0.1 | *936A04AEF6CF3742E2F327C1970D875C588546F2 |
| testuser | % | 6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9|
| system | % | *197D257ACCF6E52954DAA9A406D6B58EA95FCF45|
+-------------+-----------+-------------------------------------------+
# mysql -utestuser -p123456
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'testuser'@'localhost' (using password: YES)

3. 用户权限

Mysql提供的用户权限参考:Permissible Privileges for GRANT and REVOKE

  1. mysql.user表只有管理员(root)用户才能操作

    说明:实际应用中,有修改mysql.user的用户都算超级用户,都禁止远程连接数据库。

    【mysql用户权限管理体系】

    mysql.user表:记录用户的全局操作权限。GRANT ALL ON .和REVOKE ALL ON .

    mysql.db表:记录用户对指定数据库的操作权限。 GRANT ALL ON db_name.和REVOKE ALL ON db_name.

    mysql.talbes_priv表: 记录用户对指定表的操作权限。 GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name

    mysql.columns_priv表: 记录用户对表中具体列的操作权限。

    注意: user表中没有相应的操作权限时,才会继续检查对应的数据库或表是否有操作权限。

  2. 避免以管理员用户创建存储过程和函数

  3. 以下权限只能赋予超级用户(root):

    Shutdown_priv、Process_priv、File_priv、Grant_priv、Reload_priv、Super_priv 、Create_user_priv 、Repl_slave_priv

    update mysql.user set Shutdown_priv='N',Process_priv='N',File_priv='N',Grant_priv='N',Reload_priv='N',Super_priv ='N',Create_user_priv ='N',Repl_slave_priv='N' where mysql.user.User!='root';

遗留:多实例情况下用户 multi_admin 也算管理员用户? 和root用户拥有一样的权限?

  1. 更改MySQL root用户的名字
    update mysql.user set user='<your_account>' where user='root'
    flush privileges

4. 连接设置

  1. 监听地址不允许包含*,0.0.0.0,::

    [mysqld] bind-address=<’ServerIP’>
  2. 用户主机名不使用通配符%

  3. 超级管理员只能本地登录

    验证:
    select count(*) from mysql.user where Super_priv = 'Y' and host not in ('localhost','127.0.0.1','::1')
  4. 限制数据库连接闲置等待时间

    [mysqld] wait_timeout、interactive_timeout、slave-net-timeout
  5. 防暴力破解

    Installing Connection Control Plugins

    修改my.cnf配置文件:
    plugin-load-add="connection_control.so"
    connection-control=FORCE_PLUS_PERMANENT
    connection-control-failed-login-attempts=FORCE_PLUS_PERMANENT
    connection-control-failed-connections-threshold=3
    connection-control-min-connection-delay=1000
    connection-control-max-connection-delay=2147483647

扩展

5. ssl安全认证

  1. 确保对所有远端用户均设置了ssl_type参数
    GRANT USAGE ON *.* TO <my_user>@<host> REQUIRE SSL;
    
    验证:
    SELECT user, host, ssl_type FROM mysql.user WHERE NOT HOST IN ('::1', '127.0.0.1', 'localhost');
>**注意**:服务端、客户端都需要配置SSL证书!

## 6. 涉及操作系统相关配置
### 6.1 系统资源
1. 禁止数据库启动用户交互式登录
/etc/passwd文件,在mysql用户对应行添加/sbin/nologin或/bin/false.
```bash
usermod -s /sbin/nologin mysql
``` ### 6.2 文件权限
1. 禁止mysql_history文件记录信息
```bash
rm <your_path>/.mysql_history
ln -s /dev/null <your_path>/.mysql_history
sed -i '$a readonly MYSQL_HISTFILE=/dev/null' /etc/profile
```
2. 限制安装文件属主和权限
MySQL初始安装后,安装目录和文件属主要求为MySQL运行用户,目录权限要求为700,二进制文件为500,库文件为500,启动文件(一般位于/etc/init.d目录下)为500。
3. 限制数据库数据文件属主和权限
数据目录和文件属主为mysql用户,数据目录为700,数据文件为600。
```bash
#chmod 700 <data_dir Value>
#chown mysql:mysql <data_dir Value>
#chmod 600 <data_dir Value>/*
#chown mysql:mysql <data_dir Value>/*
```
4. 限制日志文件(含binlog)属主(mysql)和权限(600)
MySQL数据库中常见日志文件有:
- **错误日志**(log_error):
记录了MySQL的启停和运行过程。——有问题首先看这个文件。
'log_error=/opt/mysql/data/aaa.err' - **二进制日志**(log_bin):
记录了对数据库执行更改的所有操作。
作用:数据恢复、复制、日志审计(如判断有无注入攻击)。
```
log_bin [=name] # 默认关闭,需要配置此参数开启。不指定name默认文件名为'主机名.日志序号'。
```
备注:bin_log.00001即是二进制日志,bin_log.index为索引文件。二进制日志可使用自带的**mysqlbinlog**工具查看。 - 慢查询日志(slow_query_log_file):
记录运行慢的sql,帮助进行sql优化。
```
slow_query_log=1 # 默认关闭,1启用,0禁用 [log_slow_queries]
slow_query_log_file=slow.log # 指定文件路径和名字;默认值是'主机名-slow.log',位于datadir目录
long_query_time=3 # 执行时间超过设置阈值(s)的sql语句会被记录在slow_query_log_file中
log_output=FILE,TABLE # 指定慢查询的输出方式,动态参数。 FILE:慢查询日志;TABLE:mysql.slow_log表
```
Tips: 可以借助**mysqldumpslow**命令帮助分析慢查询日志。 - 查询日志(general_log_file)
记录了所有对数据库请求的信息。
```
general_log=1 # 默认关闭,配置此参数开启查询日志。
general_log_file=/opt/mysql/data/general.log
```
按照log=/opt/mysql/data/xxx.log 配置,mysql服务启动失败。
可以动态开启:
```
mysql>set global general_log_file='/tmp/general.log';
mysql>set global general_log=on;
mysql>set global general_log=off;
```
与slow_log一样,可以将查询日志放入mysql.general_log表中。 5. 限制my.cnf文件属主和权限
```bash
#chmod 600 /xxx/my.cnf
#chown mysql:mysql /xxx/my.cnf
```
6. 限制Plugin目录及其文件权限
取得Plugin目录路径:
```
show variables where variable_name = 'plugin_dir';
```
目录权限为500, 目录下的文件权限为400:
```bash
#chmod 500 <plugin_dir Value>
#chown mysql:mysql <plugin_dir Value>
#chmod 400 <plugin_dir Value>/*
#chown mysql:mysql <plugin_dir Value>/*
```
7. 限制SSLfile文件权限
数据库运行用户,权限是否为400。
取得ssl_ca、ssl_cert、ssl_crl、ssl_key文件路径:
```bash
show variables like 'ssl%';
```

网络安全系列 之 MySQL数据库安全的更多相关文章

  1. MySQL数据库安全配置

    文章来源:http://www.xfocus.net MySQL数据库安全配置 1.前言 MySQL 是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统.它具 ...

  2. 网络安全系列 之 TLS/SSL基本原理

    1. TLS/SSL基本工作方式: TLS/SSL的功能实现主要依赖于三类基本算法(参见"网络安全系列 之 密码算法"): 非对称加密算法:实现身份认证和密钥协商 对称加密算法: ...

  3. Linux Mysql数据库安全配置

    Linux  Mysql数据库安全配置 目录: 1.修改mysql管理员账号root的密码(2种方法) 2.修改mysql管理员账号root 3.mysql管理员root账号密码遗忘解决办法(2种方法 ...

  4. Docker系列之MySQL安装教程

    Docker系列之MySQL安装教程 有了前面的基础教程Docker系列之常用命令操作手册之后,本博客记录一篇mysql的安装教程 mysql镜像查询命令 docker search mysql 几个 ...

  5. 【大白话系列】MySQL 学习总结 之 COMPACT 行格式的设计原理

    如果大家对我的 [大白话系列]MySQL 学习总结系列 感兴趣的话,可以点击关注一波. 一.回顾 MySQL 学习总结系列至此已经第七节了. 从大方向:我们已经学习了 MySQL 的架构设计.Inno ...

  6. 干货 | MySQL数据库安全之审计

    干货 | MySQL数据库安全之审计 原创: 李勇 京东云开发者社区  今天 每家公司都希望业务高速增长,最好能出几个爆款产品或者爆款业务,从而带动公司营收高速攀升.但站在数据库管理员的角度,这却是实 ...

  7. [Java网络安全系列面试题] 说一说TCP和UDP的区别与联系?

    TCP TCP是Transfer Control Protocol(传输控制协议)的简称,是一种面向连接的保证可靠传输的协议. 在TCP/IP协议中,IP层主要负责网络主机的定位,数据传输的路由,由I ...

  8. mysql 开发进阶篇系列 20 MySQL Server(innodb_lock_wait_timeout,innodb_support_xa,innodb _log_*)

    1. innodb_lock_wait_timeout mysql 可以自动监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的死锁不能自动监测,所以该参数主要用于,出现类似情况的时候等待指定的时间 ...

  9. mysql 开发进阶篇系列 16 MySQL Server(myisam key_buffer)

    一.概述 mysql 提供了很多参数来进行服务器的设置,当服务第一次启动的时候,所有启动参数值都是系统默认的.这些参数在很多生产环境下并不能满足实际的应用需求.在这个系列中涉及到了liunx 服务器, ...

随机推荐

  1. CSS控制Span强制换行、溢出隐藏

    CSS控制Span强制换行 word-wrap: break-word; word-break: break-all; white-space: pre-wrap !important; 盒子文字设置 ...

  2. parseFloat 和 Number isNaN 转换

    parseFloat(true) // NaN Number( parseFloat(null) // NaN Number( parseFloat('') // NaN Number('') par ...

  3. CSS盒模型及应用

    其实,CSS就三个大模块: 盒子模型 . 浮动 . 定位,其余的都是细节.要求这三部分,无论如何也要学的非常精通. 所谓盒子模型就是把HTML页面中的元素看作是一个矩形的盒子,也就是一个盛装内容的容器 ...

  4. OpenSceneGraph | OSG如何存储带纹理osgb格式可以节省空间

      在使用OSG(OpenSceneGraph)存储带纹理osgb格式的过程中,大家会遇到这样一种情况:存储后的osgb文件所占用的大小远大于原始文件的大小,几倍至几十倍.这是为何呢?原因是OSG默认 ...

  5. c# 将byte数组保存成图片

    将byte数组保存成图片: 方式一:System.IO.File.WriteAllBytes(@"c:\test.jpg", bytes); 方式二:MemoryStream ms ...

  6. [转] boost undefined reference to 'pthread_create 问题

    由于是Linux新手,所以现在才开始接触线程编程,照着GUN/Linux编程指南中的一个例子输入编译,结果出现如下错误:undefined reference to 'pthread_create'u ...

  7. Python+Django+SAE系列教程6-----本地配置Django

    前五章.我们介绍了Python的语法,本章開始介绍Django. Python的Web框架有非常多,有Django.web2py.tornado.web.py等.我们这里选 则Django.至于这些框 ...

  8. neo4j采坑记

    1.安装后启动不起来,解决方案: https://stackoverflow.com/questions/38607283/failed-to-start-neo4j-service  2.一直启动不 ...

  9. Pod 私有仓库构建

    Pod 私有仓库构建 创建`私有仓库索引库`(iOS) 添加`私有仓库索引库`到本地repo管理 创建自己的`组建库工程 上传`组建库工程`到`私有仓库索引库` App工程调用`组建库工程` 目的 私 ...

  10. iOS进阶五-RunLoop

    简介 RunLoop 运行循环.跑圈 RunLoop的作用主要体现在三方面: 1.保持程序持续运行 2.处理App中的各种事件(比如触摸事件.定时器事件.Selector事件) 3.节省CPU资源,提 ...