什么是MySQL?MySQL安全的最佳实践

什么是 MySQL?MySQL 是一个开源的 RDBMS(关系数据库管理系统)。它基于结构化查询语言 (SQL),可在许多平台上运行,包括 Windows、Linux 和 UNIX。MySQL 还在所有流行的公共云平台上作为服务提供,包括Amazon、Azure和Google Cloud。

什么是MySQL?MySQL安全的最佳实践-南华中天

MySQL 是 LAMP 的一部分,LAMP 是一个开源 Web 开发平台。LAMP 企业堆栈由 Linux(操作系统)、Apache(Web 服务器)、MySQL (RDBMS) 和 PHP(面向对象的脚本语言)、Perl 或 Python 组成。

MySQL 有助于支持各种用例,包括 Web 应用程序和在线发布场景。它为网站、面向消费者和基于企业网络的应用程序提供支持,例如 Twitter、YouTube 和 Facebook。

数据库安全威胁

数据库存储敏感信息,这些信息容易受到许多威胁——包括数据丢失和被盗、隐私侵犯、可用性问题以及恶意或意外修改。这些问题可能由于各种原因而发生,包括外部攻击者、恶意内部人员和意外操作。MySQL 等开源数据库通常会带来与安全通信和访问控制相关的安全问题,以及已知漏洞和零日漏洞等开源安全风险。

访问和特权

例如,过多的权限可以让用户获得对机密信息的不必要的访问权限。此问题可能会升级为权限滥用,使授权用户能够滥用其权限来执行未经授权的操作。虽然您可以使用访问控制策略和查询级访问控制来缓解这些威胁,但可能会出现更多问题。例如,它可能无法阻止威胁参与者将低级别访问升级为高级权限。

漏洞和攻击

平台和操作系统通常包含漏洞,可能导致泄漏和数据损坏。您可以使用补丁管理流程和漏洞评估来缓解这种情况。但是,漏洞评估无法阻止威胁行为者使用 SQL 注入发送未经授权的数据库查询以诱骗服务器泄露信息。您需要使用准备好的 SQL 语句来减轻这种威胁。数据库也会受到拒绝服务 (DoS) 攻击,这些攻击会使资源和数据库不可用,从而拒绝用户访问数据或应用程序。

MySQL 安全最佳实践

以下最佳实践可以帮助您增强 MySQL 数据库的安全性。

修改端口映射

MySQL 的默认映射是在端口 3306 上运行。您应该在安装 MYSQL 后更改此设置以隐藏运行关键服务的端口。攻击者通常首先针对默认设置,因此修改它们以避免漏洞利用非常重要。

避免使用 root 权限运行 MySQL

您应该在包含运行服务所需的最小权限的专用用户帐户下运行 MySQL。不要让 MySQL 直接作为根服务器运行。除了日志记录和审计的优势之外,避免 root 级权限有助于确保攻击者无法劫持 root 用户帐户以获得访问权限。

在云中保护 MySQL

如果您在云环境中运行 MySQL,您的云提供商可能会提供安全服务来保护您的数据库。例如,Azure 允许您使用 Microsoft Defender 来保护您的开源关系数据库,以检测可能表明恶意尝试访问服务器的异常行为。AWS 提供 AWS Shield 来帮助保护应用程序和数据库免受分布式拒绝服务 (DDoS) 攻击。

禁用和删除您的 MySQL 历史记录

默认情况下,MySQL 在安装时会创建一个历史文件,将其存储在 ~/.mysql_history 下。您应该删除此文件,因为它详细说明了您的安装和配置历史。如果受到破坏,恶意行为者可以使用它来暴露关键的数据库用户密码。您还应该创建从历史文件到空设备的软链接,以防止 MySQL 将事件记录到文件中。

什么是MySQL?MySQL安全的最佳实践-南华中天

锁定可疑活动的用户帐户

MySQL 8.0.19 引入了临时帐户锁定功能。您可以将 MySQL 设置为根据登录尝试失败次数和帐户锁定时间等变量来锁定用户帐户。

在创建用户帐户时运行以下脚本以启用帐户锁定:CREATE USER ‘demo_user’@’localhost’ IDENTIFIED BY ‘userpassword’ FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 10;

失败登录尝试变量后面的值指定锁定帐户之前所需的失败尝试次数。密码锁定时间变量后面的值指定帐户将被锁定的时间(以天为单位)。您还可以将“无界”指定为密码锁定时间值,以使帐户无限期锁定,直到手动解锁为止。

使用身份验证插件

身份验证插件使用户能够选择他们喜欢的身份验证方法。MySQL 支持许多可插入的身份验证选项,您可以将它们组合起来以获得更高的安全性。您可以在 ALTER USER 或 CREATE USER 等语句旁边使用身份验证插件。

例如:CREATE USER ‘user_7’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;

此查询使用本机密码散列来实现身份验证。

限制或禁用数据库可见性

SHOW DATABASES 命令允许用户查看敏感信息。您应该限制使用此命令以防止远程用户和恶意行为者收集有关您的数据库的数据。您可以通过在 [mysqld] 部分中指定“skip-show-database”来限制或删除 MYSQL 配置文件中的此功能。

加密静态和传输中的数据

默认情况下,MySQL 在服务器和客户端之间使用未加密的通信,这为攻击者提供了通过中间人 (MitM) 攻击拦截数据的机会。同样,数据库中未加密的任何用户数据都可能危及用户的完整性和隐私。

您可以使用 TLS/SSL 加密来保护网络之间的 MySQL 通信。受保护网络内的通信可能不需要加密。MySQL 还允许您对静态数据进行加密,以在服务器遭到破坏时保护您存储的数据。

实施安全密码策略

MySQL 允许您应用密码策略,要求非特权用户在输入当前密码时设置新密码。此功能可以保护您的数据库免受多种威胁,例如入侵主机并尝试使用 Web Shell 访问用户数据库会话的攻击者。启用密码策略更改后,攻击者无法锁定目标用户,除非他们拥有用户的现有密码。

MySQL 默认不启用 Change Current Password 策略。您可以基于单个用户或全局控制此策略(在所有非特权用户帐户中强制执行)。建议全局设置策略,或至少覆盖所有非特权用户。使用 my.cnf 服务器文件启用全局当前密码策略。