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

安全加固

1、帐号安全

  • 禁止 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 服务后即可生效。

预防数据库勒索事件

ElasticSearch勒索事件
MongoDB勒索事件
MySQL勒索事件
Redis勒索事件
PostgreSQL勒索事件
针对Oracle的勒索事件

基线安全问题

从MongoDB和Elasticsearch,以及现在的MySQL数据库勒索案例中,可以发现受害数据库都是因为基线安全问题,才被黑客劫持而勒索。

这些被勒索的自建数据库服务都开放在公网上,并且存在空密码或者弱口令,使得攻击者可以轻易暴力破解出密码,连接数据库,下载并清空数据。再加上不正确的安全组配置,甚至没有配置任何网络访问控制策略,导致问题被放大。

基线安全问题已经成了Web漏洞之外入侵服务器的主要途径,特别是无网络访问控制、默认账号和空口令、默认账号弱口令、后台暴露、后台无口令、未授权访问等情况。错误的配置可以导致相关服务暴露在公网上,成为黑客攻击的目标;加上采用空密码和弱口令,更方便了黑客以极低的攻击成本入侵这些服务。

工具排查

您也可以使用类似NMap这样的端口扫描工具,直接针对被检查的服务器IP,在服务器外网执行扫描,以检查业务服务器开放在外网的端口和服务。

注意:需要在授权情况下对自身业务进行扫描,不要对其他不相关的业务进行非法扫描,以避免法律风险。

安全建议及修复方案

配置严格网络访问控制策略
当您安装完服务,或在运维过程中发现对外开放了服务后,您可以使用Windows自带防火墙功能、Linux系统的iptables防火墙功能来配置必要的访问控制策略。

推荐您使用ECS安全组策略,控制内外网出入的流量,防止暴露更多不安全的服务。

对操作系统和服务进行安全加固

必要的安全加固是确保业务在云上安全可靠运行的条件,您可以使用安骑士的自动化检测和人工加固指南对业务服务器进行安全加固。

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('新密码');

参考链接 :
mysql安全机制 :https://www.jianshu.com/p/7c242654bb97

Mysql安全防护 :https://www.jianshu.com/p/de37c26c1739

MySQL服务安全加固
https://help.aliyun.com/knowledge_detail/60893.html

day101 MySQL-全面优化 : https://www.jianshu.com/p/5b6707f6019e

你可能感兴趣的:(安全)