MySQL服务安全加固及防护

1、MySQL 安全防护

一、配置添加新用户密码复杂度检查

二、配置密码过期策略

三、MySQL数据库限制多次登录失败重试时间

一、配置密码复杂度检查

1.mysql 5.7.15版本好像默认启用了密码复杂度设置,插件名字叫做 validate_password

mysql>>INSTALL PLUGIN validate_password SONAME 'validate_password.so';

2、加上/etc/my.cnf配置

[mysqld]
plugin-load=validate_password.so
validate_password_policy=2 
# 0 or LOW 仅需需符合密码长度
# 1 or MEDIUM 满足LOW策略,同时还需满足至少有1个数字,小写字母,大写字母和特殊字符
# 2 or STRONG 满足MEDIUM策略,同时密码不能存在字典文件(dictionary file)中
validate-password=FORCE_PLUS_PERMANENT

3.重启MySQL

systemctl restart mysqld.service

二、配置密码定期更换

定期更换口令策略:由于定期修改密码,会涉及到应用一块更改,涉及到应用重启,不建议定期修改密码。

1、在/etc/my.cnf配置文件中增加

[mysqld]

default_password_lifetime=90  # 90天过期

2、重启MySQL

systemctl restart mysqld.service

三、MySQL数据库限制多次登录失败重试时间

需求:

如果连续5次输入密码错误,限制登录数据库30分钟 --次数和限制时间可以根据实际变更

解决方法(通过MySQL插件控制)

1、登录数据库,安装插件(CONNECTION_CONTROL和CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS)

mysql -uroot -p

install plugin CONNECTION_CONTROL soname 'connection_control.so';

install plugin CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS soname 'connection_control.so';

2、查看所有已安装的插件

show plugins;

重新启动MySQL(根据版本选择重启命令)

service mysqld restart 或 service mysql restart

4、重新登录数据库,查看配置是否生效

mysql -uroot -p

show variables like '%connection_control%';

5、验证

输错5次密码后,会发现第6次登录会卡住,限制登录,时间为设定的限制时间30分钟

2、MySQL服务安全加固

转载来源 : https://help.aliyun.com/knowledge_detail/49568.html

介绍

数据库管理人员可以参考本文档进行 MySQL 数据库系统的安全配置加固,提高数据库的安全性,确保数据库服务稳定、安全、可靠地运行。
漏洞发现
您可以使用安骑士企业版自动检测您的服务器上是否存在 MySQL 漏洞问题,或者您也可以自己排查您服务器上的 MySQL 服务是否存在安全问题。

判断Mysql数据库版本

nmap的指纹识别可以精确的判断数据库的版本号,通过telnet来判断是否支持远程连接(telnet 192.168.0.88 3306)。当连接成功后会显示Mysql版本号。
然后可以利用hydra来探测是否存在弱口令。

hydra -L user.txt -P pass.txt -o savessh.log -f -vV -e ns 192.168.0.88 mysql

InnoDB并发调优
解决InnoDB高并发条件性能下降快,就是限制并发。SHOW INNODB STATUS输出中的SEMAPHORES部分来确认是否发生了并发问题,
并发 = CPU的数量 x 磁盘的数量 x 2

安全加固

1、帐号安全

正确设置目录权限:
设置目录权限的原则是软件和数据分开,具体如下:

  1. 将 mysql 安装在单独的用户下
  2. 安装时,以 root 用户进行安装,mysql 的软件默认都为 root 权限
  3. 安装完毕后,将数据目录权限设置为实际运行 mysql 的用户权限,比如:
Chown –R mysql:mysql /home/mysql/data
  • 禁止 Mysql 以管理员帐号权限运行
    以普通帐户安全运行 mysqld,禁止以管理员帐号权限运行 MySQL 服务。在 /etc/my.cnf 配置文件中进行以下设置。
[mysql.server]
user=mysql
  • 避免不同用户间共享帐号
    参考以下步骤。
    a、创建用户。
mysql> mysql> insert into
mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_sub 
ject) values("localhost","pppadmin",password("passwd"),'','','');

执行以上命令可以创建一个 phplamp 用户。
b、使用该用户登录 MySQL 服务。

mysql>exit; 
@>mysql -u phplamp -p 
@>输入密码 
mysql>登录成功
  • 删除无关帐号
    DROP USER 语句可用于删除一个或多个 MySQL 账户。使用 DROP USER 命令时,必须确保当前账号拥有 MySQL 数据库的全局 CREATE USER 权限或 DELETE 权限。账户名称的用户和主机部分分别与用户表记录的 User 和 Host 列值相对应。

执行DROP USER user;语句,您可以取消一个账户和其权限,并删除来自所有授权表的帐户权限记录。

2、口令

检查账户默认密码和弱密码。口令长度需要至少八位,并包括数字、小写字母、大写字母和特殊符号四类中的至少两种类型,且五次以内不得设置相同的口令。密码应至少每 90 天进行一次更换。
修改root用户口令,删除空口令
您可以通过执行以下命令修改密码。

 mysql> update user set password=password('test!p3') where user='root';
 mysql> flush privileges;

3、授权

在数据库权限配置能力范围内,根据用户的业务需要,配置其所需的最小权限。

查看数据库授权情况。

mysql> use mysql;
mysql> select * from user;
mysql>select * from db;
mysql>select * from host;
mysql>select * from tables_priv;
mysql>select * from columns_priv;

通过 revoke 命令回收不必要的或危险的授权。

mysql> help revoke
Name: 'REVOKE'
Description:
Syntax:
REVOKE
priv_type [(column_list)]
   [, priv_type [(column_list)]] ...
 ON [object_type]
     {
         *
       | *.*
       | db_name.*
       | db_name.tbl_name
       | tbl_name
       | db_name.routine_name
     }
 FROM user [, user] ...

4、开启日志审计功能

数据库应配置日志功能,便于记录运行状况和操作行为。

MySQL服务有以下几种日志类型:

  • 错误日志: -log-err
  • 查询日志: -log (可选)
  • 慢查询日志: -log-slow-queries (可选)
  • 更新日志: -log-update
  • 二进制日志: -log-bin
    找到 MySQL 的安装目录,在 my.ini 配置文件中增加上述所需的日志类型参数,保存配置文件后,重启 MySQL 服务即可启用日志功能。例如,
#Enter a name for the binary log. Otherwise a default name will be used. 
#log-bin= 
#Enter a name for the query log file. Otherwise a default name will be used. 
#log= 
#Enter a name for the error log file. Otherwise a default name will be used. 
log-error= 
#Enter a name for the update log file. Otherwise a default name will be used. 
#log-update=

该参数中启用错误日志。如果您需要启用其他的日志,只需把对应参数前面的 “#” 删除即可。

日志查询操作说明

执行show variables like 'log_%';命令可查看所有的 log。
执行show variables like 'log_bin';命令可查看具体的 log。

5、安装最新补丁

确保系统安装了最新的安全补丁。

注意: 在保证业务及网络安全的前提下,并经过兼容性测试后,安装更新补丁。

6、如果不需要,应禁止远程访问

禁止网络连接,防止猜解密码攻击、溢出攻击、和嗅探攻击。

注意: 仅限于应用和数据库在同一台主机的情况。

如果数据库不需要远程访问,可以禁止远程 TCP/IP 连接,通过在 MySQL 服务器的启动参数中添加–skip-networking参数使 MySQL 服务不监听任何 TCP/IP 连接,增加安全性。

您可以使用 安全组 进行内外网访问控制,建议不要将数据库高危服务对互联网开放。

7、设置可信 IP 访问控制

通过数据库所在操作系统的防火墙限制,实现只有信任的 IP 才能通过监听器访问数据库。

 mysql> GRANT ALL PRIVILEGES ON db.*
 ·-> -> TO 用户名@'IP子网/掩码';

8、连接数设置

根据您的机器性能和业务需求,设置最大、最小连接数。

在 MySQL 配置文件(my.conf 或 my.ini)的 [mysqld] 配置段中添加max_connections = 1000,保存配置文件,重启 MySQL 服务后即可生效。

9、 删除匿名帐号:

安装完毕 mysql 后,会自动安装一个空帐号,普通用户只需要执行 mysql 命令即可
登陆 mysql,给系统造成隐患,建议删除此空帐号:

drop user ''@'localhost';
drop user ''@' localhost.localdomain’;

10、 给 mysql root 帐号设置口令:

Mysql 安装完毕后,root 默认口令为空,需要马上修改 root 口令:

[zzx@localhost data]$ mysql  –uroot
mysql> set password=password('123');
Query OK, 0 rows affected (0.00 sec)

11、设置安全密码并定期修改:

尽量使用安全密码,建议使用 6 位以上字母、数字、下画线和一些特殊字符组合而
成的字符串

12、 只授予帐号必须的权限:

只需要赋予普通用户必须的权限,比如:

Grant select,insert,update,delete on tablename to
‘username’@’hostname’;

13、 除 root 外 , 任何用户不应有l mysql 库 user 表的存取权限:

如果拥有 mysql 库中 user 表的存取权限(select 、 update 、 insert 、 delete ), 就
可以轻易的增加、修改、删除其他的用户权限,造成系统的安全隐患。

14、 不要把 FILE 、S PROCESS 或 或 SUPER 权限授予管理员以外的帐号 : :

FILE 权限可以被滥用于将服务器主机上 MySQL能读取的任何文件读入到数据库表中 。
包括任何人可读的文件和服务器数据目录中的文件。可以使用 SELECT 访问数据库表 ,
然后将其内容传输到客户端上。不要向非管理用户授予 FILE 权限。有这权限的任何用户能在拥有 d mysqld 守护进程权
限的文件系统那里写一个文件!为了更加安全,由SELECT … INTO OUTFILE 生成的所有文件对每个人是可写的,并且你不能覆盖已经存在的文件。 file 权限也可以被用来读取任何作为运行服务器的 Unix 用户可读取或访问的文件。使用该权限,你可以将任何文件读入数据库表。这可能被滥用,例如,通过使用 LOAD DATA 装载“/etc/passwd”进一个数据库表,然后能用 SELECT 显示它。PROCESS 权限能被用来察看当前执行的查询的明文文本,包括设定或改变密码的查
询。
SUPER 权限能用来终止其它用户或更改服务器的操作方式。比如 kill 进程不要将 PROCESS 或 SUPER 权限授给非管理用户。n mysqladmin t processlist 的输出显示出当前执行的查询正文,如果另外的用户发出一个 UPDATE user SET password=PASSWORD(‘not_secure’)查询,被允许执行那个命令的任何用户可能看得到

15、 尽量避免通过 symlinks 访问表:

不要允许使用表的符号链接。(可以用–skip-symbolic-links 选项禁用)。如果 你
用 root 运行 mysqld则特别重要,因为任何对服务器的数据目录有写访问权限的人
则能够删除系统中的任何文件!

16、 使用 merge 存储引擎潜藏的安全漏洞:

Merge 表在某些版本中可能存在以下安全漏洞:
用户 A 赋予表 T 的权限给用户 B
用户 B 创建一个包含 T 的 merge 表,做各种操作
用户 A 收回对 T 的权限
安全隐患:用户 B 通过 merge 表仍然可以访问表 A 中的数据

17、 drop table 命令并不收回以前的相关访问授权:

drop 表的时候,其他用户对此表的权限并没有被收回,这样导致重新创建同名的
表时,以前其他用户对此表的权限会自动赋予,导致权限外流。
因此,要在删除表时,同时取消其他用户在此表上的相应权限。

18、 如果可能,给所有用户加上访问 IP 限制:

给所有用户加上 ip 限制将拒绝所有未知的主机进行的连接,保证只有受信任的主
机才可以进行连接。例如:

Grant select on dbname.* to ‘username’@’ip’ identified by
‘passwd’;

Mysql安全防护

1.禁用local-infile选项

禁用local_infile选项会降低攻击者通过SQL注入漏洞器读取敏感文件的能力

编辑Mysql配置文件/etc/my.cnf,在[mysqld](https://yundun.console.aliyun.com/?p=sasnext) 段落中配置local-infile参数为0,并重启mysql服务:
local-infile=0

2.确保配置了log-error选项

启用错误日志可以提高检测针对mysql和其他关键消息的恶意尝试的能力,例如,如果错误日志未启用,则连接错误可能会被忽略

编辑Mysql配置文件/etc/my.cnf,在[mysqld_safe](https://yundun.console.aliyun.com/?p=sasnext) 段落中配置log-error参数,<log_path>代表存放日志文件路径,如:/var/log/mysqld.log,并重启mysql服务:
log-error=<log_path>

3.禁用symbolic-links选项

编辑Mysql配置文件/etc/my.cnf,在[mysqld](https://yundun.console.aliyun.com/?p=sasnext) 段落中配置`symbolic-links=0`,5.6及以上版本应该配置为`skip_symbolic_links=yes`,并重启mysql服务。

4.为Mysql服务使用专用的最低特权帐户

使用最低权限帐户运行服务可减小MySQL天生漏洞的影响。受限帐户将无法访问与MySQL无关的资源,例如操作系统配置。

使用非root和非sudo权限用户启动Mysql服务

5.禁止使用–skip-grant-tables选项启动Mysql服务

使用此选项,会导致所有客户端都对所有数据库具有不受限制的访问权限。

编辑Mysql配置文件/etc/my.cnf,删除skip-grant-tables参数,并重启mysql服务

6.删除’test’数据库

测试数据库可供所有用户访问,并可用于消耗系统资源。删除测试数据库将减少mysql服务器的攻击面

登陆数据库执行以下SQL语句删除test数据库:

DROP DATABASE test;
flush privileges;

7.确保log-raw选项没有配置为ON

当log-raw记录启用时,有权访问日志文件的人可能会看到纯文本密码。

编辑Mysql配置文件/etc/my.cnf,删除log-raw参数,并重启mysql服务

8.确保没有用户配置了通配符主机名

避免在主机名中只使用通配符,有助于限定可以连接数据库的客户端,否则服务就开放到了公网

执行SQL更新语句,为每个用户指定允许连接的host范围。 
1. 登录数据库,执行use mysql; ; 
2. 执行语句select user,Host from user where Host='%';查看HOST为通配符的用户; 
3. 删除用户或者修改用户host字段,删除语句:DROP USER 'user_name'@'%'; 。更新语句:update user set host = <new_host> where host = '%';。 
4. 执行SQL语句:

OPTIMIZE TABLE user;
flush privileges;

9.匿名登陆检查

检查Mysql服务是否允许匿名登陆

登陆Mysql数据库,执行以下命令删除匿名帐户:
delete from user where user='';
flush privileges;

10.数据库登陆弱密码

若系统使用弱口令,存在极大的被恶意猜解入侵风险,需立即修复

可使用 SET PASSWORD 命令把弱密码修改为强密码

1、登陆数据库 
2、查看数据库用户密码信息   
    mysql> SELECT user, host, authentication_string FROM user;   
    部分版本查询命令为: 
    mysql> SELECT user, host, password FROM user;  
3、根据查询结果及弱密码告警信息修改具体用户的密码 
    mysql> SET PASSWORD FOR '用户名'@'主机' = PASSWORD('新密码');

11 个必须注意的 MySQL 安全规范

1 mysql_secure_installation

这是数据库基础的安全设置脚本

a 设置root密码

b 移除匿名用户

c 禁止远程root登录

d 移除test数据库

看看你的环境是否存在上述问题,这个算是是最基本的安全吧。

2 连接访问安全

常见创建用户的时候你需要指定你的ip访问地址范围或者固定ip,一般化而言,只有特定唯一的几个ip的才会访问,或者说你可以采用代理访问的方式,减少应用直接访问你的数据库,而且现在很多中间件也都有白名单机制,原则上是把非法请求防止在数据库以外的地方。

规范数据库管理软件,实现管理软件的标准、统一化,还有严禁杜绝开启外网访问,如果客户端在远程,就根本不应该直接访问数据库,而应该使用中间件堡垒机或其他替代方案。

为了防止连入数据库的应用程序存在后门,造成数据库安全隐患,检查所有连接数据库程序的安全性。通过使用堡垒机或者其他监控登录数据库,禁止对数据库的直接操作。

对已经连接的IP网段进行规范化、统一化的管理,定期进行权限复核操作,对系统所属IP、用户进行权限梳理工作。

对员工进行安全培训,增强员工的系统安全观念,做到细心操作,安全操作。

确保访问数据库的主机为已知用户或者主机,使用专门主机与数据库进行连接。

对重要业务表的所有行为,全部审计,审计同时所有包括即使是DBA的DDL操作行为
最后是报表系统,利用审计的相关日志,出具系统化的审计报告。

3 权限安全

权限这块无可厚非,在简历之初遵循最小权限原则,坚持最小权限原则,是数据库安全的重要步骤。

很多时候我们不知道具体的最小权限是什么,你说一个账号到底需要什么样权限才合适,才不会影响业务?这个不是很好界定。我们需要知道在设置权限时的信息,要授予的权限级别,库级别,表级别,列级别,或者其他超级权限,要授予的权限类型,增删改查等

从mysql.user表来看

Select_priv/Insert_priv/Update_priv/Delete_priv/Create_priv/Drop_priv
Reload_priv/Shutdown_priv/Process_priv/File_priv/Grant_priv/References_priv
Index_priv/Alter_priv/Show_db_priv/Super_priv/Create_tmp_table_priv/Lock_tables_priv
Execute_priv/Repl_slave_priv/Repl_client_priv/Create_view_priv/Show_view_priv/Create_routine_priv/
Alter_routine_priv/Create_user_priv/Event_priv/Trigger_priv/Create_tablespace_priv

用户名,IP地址,是否需要连接数控制,SSL,过期时间等,不要怕麻烦,可能前期设置的时候比较繁琐,但是,一个好的基础设置,才是安全的保障,做到需要什么给什么,而不是。

4 账户安全

用户账户划分原则
超级管理员账号
系统应用账号(比如备份,监控,审计等)
应用业务账号
业务人员账号
开发人员账号
测试人员账号
其他专用账号

主要是防止泄漏,非必要人员不需要知道账号的名称,同时需要制定相应的命名规则,还有就是合理使用自己的账号密码,保护好你的账号密码,对于绝无必要的用户,先禁用,后期删除,要做到无匿名账户和无废弃账户。

5 目录文件安全

提高本地安全性,主要是防止mysql对本地文件的存取,会对系统构成威胁,还有Load DATA LOCAL INFILE,禁用该功能。

这个主要是防止误删除,非权限用户禁止访问目录,还有就是数据文件禁止访问,或者采用更改常用的目录路径,或者通过chroot,要保证该目录不能让未经授权的用户访问后把数据库打包拷贝走了,所以要限制对该目录的访问。

6 密码安全

密码强度复杂性

尽量并且不要使用固定密码,实行每个用户单独密码,长度在16位以上 0-9a-zA-Z~!@#$%^&*()-+ 随机组合。

密码过期机制

根据公司的情况设定密码过期时间,定期更改,同时不可使用重复密码。

密码保存机制

为了方便管理,可能会采用一个密码表,要加强对于密码表的维护更新,最重要的是保证不泄漏。

7 漏洞安全

常规的方式是安装补丁,不过这个往往比较麻烦,主要是版本升级,还有就是防护策略。

8 被忽视的SSL

由于性能或者其他方面原因,很多生产环境并没有使用,不过从5.7+开始,已经好很多了,有需要的加强安全防范其实可以尝试下了。

https://dev.mysql.com/doc/refman/5.7/en/mysql-ssl-rsa-setup.html

9 防火墙安全

一般化数据库前面都会有主备的墙,不过从成本上考虑,很多企业都是单个或者裸奔的,有自己的硬件防火墙最好,没有的话也可以使用系统自带的防火墙,然后在加上其他白名单和中间件白名单过滤辅助措施,也能防止一部分问题。

10 端口安全

默认端口是3306,这个最好修改下,为了方便记忆,你可以根据的ip地址来加密动态调整,不过如果生产网络允许,也可以定期修改,最好不要影响研发进度。

11 记录安全

删除操作系统记录的敏感数据,比如.mysql_history、.bash_history 等,及时清理,移除和禁用.mysql_history文件。

人是安全的主导,管理的对象要从两个角度来看,从信息角度来说就是MySQL本身的安全,要防止数据的丢失和免遭破坏;从技术的角度来说就是整个系统的安全,要防止系统的瘫痪和免遭破坏。

©版权声明:
作者:xiaofu
文章标题:MySQL服务安全加固及防护
文章地址:https://blog.xf0.cc/200.html
作者地址:https://blog.xf0.cc/author/xiaofu
来源:Fu Zai's Notes
文章版权归作者所有,未经允许请勿转载。
THE END
分享
二维码
海报
MySQL服务安全加固及防护
1、MySQL 安全防护 一、配置添加新用户密码复杂度检查 二、配置密码过期策略 三、MySQL数据库限制多次登录失败重试时间 一、配置密码复杂度检查 1.mysql 5.7.1……
文章目录
关闭
目 录