对 MySQL 的攻击 - 如何预防?

Attack on MySQL - and how to prevent it?

我的服务器受到攻击,并通过在 apache conf 文件中包含以下内容来阻止 xmlrpc 访问:

<files xmlrpc.php>
    order allow,deny
    deny from all
</files>

现在,它不是每隔几个小时就破坏 mysql 服务,而是每天破坏 once/twice。这仍然是一个问题。 fail2ban 禁止 2 次失败的 ssh 尝试一个小时。但是,我确实在 daemon.log:

中看到了大约 100 多个以下条目

mysqld[18852]: 2016-10-13 3:06:40 139773247216384 [Warning] Access denied for user 'root'@'139.196.28.237' (using password: YES)

所有这 100 多次尝试都在一分钟内发生,大约一个小时后我看到几条消息,例如:

mysqld[18852]: 2016-10-13 3:32:52 139773325777664 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted. Statement: DELETE FROM wp_generic_options WHERE option_name LIKE 'jetpack\_nonce\_%' AND CAST( option_value AS UNSIGNED ) < 1476340372 ORDER BY option_id LIMIT 100

一段时间后,似乎 mysql 服务重新启动,但随后失败,并在错误日志中找到以下行:

InnoDB: Initializing buffer pool, size = 256.0M
InnoDB: mmap(281542656 bytes) failed; errno 12
InnoDB: Cannot allocate memory for the buffer pool
Plugin 'InnoDB' init function returned error.
Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
Unknown/unsupported storage engine: InnoDB
Aborting

有人可以向我解释一下发生了什么吗?以及如何制止和防止它再次发生?

IP 地址 139.196.28.237 的地理位置报告它来自中国杭州。这是您期望 MySQL 客户端连接到您的 MySQL 实例时的来源吗?如果不是,则您可能遇到了外部攻击者。您可能根本不应该允许外部客户端访问您的 MySQL 服务器。您需要防火墙来阻止 MySQL 的端口免受外部请求。

您的二进制日志中有关不安全语句的警告消息可能与此无关。我记得 "jetpack" 是一个流行的 WordPress 插件,而 SQL 查询可能是 jetpack 代码的正常部分。您可以通过将 MySQL binlog 格式更改为 MIXED 或 ROW 来修复这些警告。要了解有关不安全语句的更多信息,请阅读 https://dev.mysql.com/doc/refman/5.7/en/replication-rbr-safe-unsafe.html

有关 InnoDB 未能为其缓冲池分配 256MB 内存的错误表明您的服务器上的进程正在使用比服务器拥有的更多内存。 InnoDB 不会分配内存,除非物理内存可用(它不会分配已经交换的内存)。这也可能与尝试登录无关。您需要增加服务器上的内存。如果您使用的是 AWS,则需要增加实例大小。