跳转到

MySQL 安全强化概览

安全性不是一项功能,而是设计不可或缺的一部分,与国际化或无障碍功能没有区别。良好的安全设计旨在使系统难以在每一个可能的步骤中被破坏,在数据库领域,这通常称为“强化”数据库安全。 

其中一些步骤包括使软件保持最新状态、限制系统可被访问的位置、增强密码、定期审核访问权限,以及其他诸多方面。虽然这些技巧具有广泛适用性,但我们将探讨如何运用这些技巧来使您的 Cloud SQL for MySQL 数据库实例尽可能难以破解。

强化 MySQL 实例的安全性

最大限度地减少接入点

毫不夸张地说,有些攻击者可以在几分钟内轻松扫描整个互联网并在数秒内破解密码。虽然有时必须使数据库可通过公共 IP 网络访问,但这将使您的数据库易受攻击。降低公共 IP 风险的一种方法是,将数据库访问权限限制在一组有限的 IP 地址内。

也就是说,更好的解决方案是仅允许在虚拟私有云 (VPC) 内进行访问,并且仅允许在堡垒主机内部进行运营商连接。在 Google Cloud 中,此解决方案称为专用 IP。 如果您的 MySQL 实例只能在 VPC 内访问,则攻击者必须先入侵 VPC 才能尝试入侵您的实例。

更新数据库

每个 MySQL 次要版本都有版本说明,并且几乎总是包含有关安全更新的部分。如果您的实例有多个版本已过时,您的数据库将没有多个版本的安全修复。

除了逐步解决安全问题之外,MySQL 还定期推出几项全新的安全功能。例如,MySQL 8.0 引入了多种方法来强化 MySQL 架构和用户的安全,例如角色、失败的登录跟踪和随机密码生成。

强制执行 TLS

假设您在一家咖啡店工作,想要运行一些查询,以便通过商店的免费 Wi-Fi 网络连接到 MySQL。如果您未使用 TLS(传输层安全协议),则会通过 TCP(传输控制协议,互联网的主要协议之一)泄露您的用户名和密码。在您的 MySQL 实例上强制执行 TLS,这样您就可以在品尝拿铁咖啡时处理工作事务,而不必担心其他顾客窥探网络。

强化应用的安全性

SQL 注入

通常,最容易受到攻击的不是数据库,而是应用。许多应用都遭受了 SQL 注入攻击,攻击者会在这种攻击中插入您的应用认为是有效的 SQL 语句的恶意输入。防范这些攻击的最佳方法是在创建 SQL 语句时使用准备好的语句,而不是将用户输入与 SQL 语句串联起来。

代码库中的 Secret

由于开发者无意中将其用户名和密码推送到其源代码库,因此无数数据库遭到破坏。您可以使用 Google Cloud 的 Secret Manager 等工具,用于管理各种 Secret,包括您的数据库密码。

记录密码

最后,使用日志记录框架的过滤工具从应用日志中过滤掉数据库的密码。示例包括 Log4j 过滤器Rails ParameterFilter,但大多数日志记录框架都应该具有等效功能。否则,您需要确保应用日志是安全的,以确保数据库安全。

增强密码安全

请考虑使用密码验证来确保数据库中的所有密码都足够复杂。对于应用密码,应将其设置得较长而且复杂,并经常轮换。Secret Manager 特别有用,因此您无需记住复杂且经常更改的密码。

如果真人(而非应用)将使用数据库用户,请遵循 NIST 标准并优先考虑长度。密码失效日期和过于复杂的密码要求经常会导致人们将密码记录到明文文件和便笺中,从而破坏这些规则的完整用途。

更好的做法是,考虑为非应用用户利用 IAM 身份验证。IAM 身份验证会将连接建立工作委托给 Google Cloud 的 IAM 产品,这意味着风险只会转给 IAM 用户,而不是 IAM 用户和数据库用户。

最后,MySQL 默认使用哈希,而不是盐(您的数据库密码)。这意味着,具有相同密码的用户将具有相同的身份验证字符串,从而使攻击者能够通过彩虹表攻击轻易破解安全系数低的密码。请注意以下两个 MySQL 用户如何使用相同的 authentication_string。

authentication_string 的输出

请考虑将 default_authentication_plugin 标志设置为 cache_sha2_password。这样可以确保使用相同密码的两个用户的哈希值不同。在以下示例中,请注意这两个用户如何使用不同的 authentication_string 值。

authentication_string 命令的输出

保障用户安全

限制访问不仅意味着保护来自外部的访问,而且还意味着定期审核来自内部的访问。

审核您的应用:如果该应用仅从结算、产品和客户表中读取数据,它是否真的需要访问其他内容?保留数据库的 root 访问权限意味着攻击者可能会对您的数据库造成巨大损害。请考虑您的实例具有的每项要求,列出他们需要的权限,然后为每项权限创建数据库用户。如果攻击者以这些数据库用户之一的身份入侵您的数据库,则您可以有效限制损害的范围。

审核用户:您的数据库用户中有多少人确实需要您的实例的管理员权限?其中有多少用户仍在您的组织中、已关联到非活跃项目或本身处于非活跃状态?访问令牌可能发生泄露,而大多数系统都需要长期关注内部威胁。确保您拥有尽可能少的用户有助于避免实例出现此类问题。

审核“管理员”:考虑移除或重命名“root”或“admin”等用户。这些都是攻击者容易攻击的目标,如果没有这些用户,则您的系统就不易遭到入侵。这就是所谓的通过安全性进行保护,虽然它不应作为第一道防线,但它可以为您的 MySQL 数据库增加一层薄薄的安全防护。

启用二进制日志记录功能

定期数据备份和可验证的数据恢复计划对于健康的数据库管理至关重要。 但即使定期备份,您仍然可能丢失上次备份之后写入的所有数据。MySQL 生态系统的优势之一是时间点恢复 (PITR),可让您随时恢复数据。为了实现 PITR,请在 Cloud SQL for MySQL 实例上启用二进制日志。

审核日志记录

如果您完成了上述所有步骤,就表示您已经做好准备并受到良好保护。也就是说,如果没有持续的警惕措施(数据库审核),则任何安全设计都是不完整的。Cloud SQL for MySQL 审核插件可帮助您在发生违规行为时跟踪异常行为。

更改后的实例

实施上述措施后,您将进一步加大攻击者入侵数据库的难度。攻击者必须入侵您的应用,并希望应用的数据库用户拥有足够的特权供其进行攻击,或者攻击者必须入侵您的 VPC,找到现有的用户名,破解密码,并希望用户拥有足够的特权供其进行攻击。在此期间,您可以查看 MySQL 数据库日志或审核日志,以监控数据库上的任何常见行为,并相应地做出响应。

这就是从设计上保证安全的含义。攻击者会继续探索利用机器的方法。因此,在设计系统时应提供尽可能多的保护,以确保数据库受到保护,这一点非常重要。

Google Cloud 提供旨在满足您业务需求的代管式 MySQL 数据库,可以完成包括弃用本地数据中心、运行 SaaS 应用和迁移核心业务系统在内的各种任务。