MySQL 安全加固:第一部分

6 阅读4分钟

MySQL 安全加固:第一部分

Hudson 译 原文

每当提到应用程序安全性时,人们都会考虑保护应用程序免受一些最常见的攻击,例如注入、身份验证中断、敏感数据泄露等。然而,尽管这些攻击很普遍,但仅知道如何保护应用程序免受攻击是不够的,尤其是在运行MySQL时.

今天,我们将研究安全的另一个方面 —— 我们将研究如何正确保护MySQL。

为什么需要保护 MySQL?

首先,我们必须回答为什么要保护MySQL。 毕竟,如果我们保护我们的应用程序免受最普遍的威胁,我们应该是安全的,对吗?嗯,是的,也不是。 你看,当你保护你的应用程序免受某些攻击时,你要确保攻击者很难穿透你的应用的防御系统——然而,为了保护你的数据库,仅保护应用程序使你免受此类攻击是不够的。数据库的安全可能是挽救应用程序(和数据库!)的最后一根稻草。

如何保护MySQL?

现在,谈谈紧迫的问题。你实际上是如何保护MySQL的?

当考虑MySQL实例的安全性时,应该考虑各种可能的选项。幸运的是,其中一些选项甚至不限于MySQL,这意味着它们也适用于其他场景!我们将从一般的事情开始。

MySQL安全 —— 概述

保护MySQL时,请记住,它对用户执行的操作使用基于安全的访问控制列表(ACL)(访问控制列表是与对象关联的权限列表)。以下是几个最基本的安全问题的处理建议:

  • 保护初始MySQL帐户安全 —— 这一点很明显,您应该确保root帐户有密码。首次安装MySQL时,root帐户可能有密码,也可能没有密码 —— 您可以通过检查错误日志来确定密码是什么,然后如果愿意,将其更改为更高强度的密码。所有其他帐户也应该有密码。

  • 不要在任何MySQL数据库中以明文形式存储密码 – 使用BCrypt之类的单向哈希函数。

  • 不要授予任何用户访问mysql数据库中user表的权限(root用户除外)。

此外,请熟悉MySQL中的访问控制和帐户管理. 这个主题本身值得一本完整的书,但你应该知道的基本内容包括:

  • 控制MySQL中的访问;
  • 创建、更改和删除用户;
  • 向用户授予和撤销特权;
  • 知道如何检查分配了哪些权限;
  • 账户类别是什么;
  • 预留账户是什么;
  • 角色是什么;
  • 密码管理的工作原理;
  • 账户锁定的工作原理;
  • 看看MySQL提供的安全插件;
  • 了解如何保护MySQL备份。

就MySQL安全性而言,还应包括备份。

现在,我们将进一步研究每个选项。

控制对MySQL的访问

  • 如前所述,除了root帐户之外,绝不允许任何帐户访问mysql数据库中的user表;
  • 确保所有现有MySQL帐户仅使用执行其操作绝对需要的权限。

在MySQL中创建、更改和删除用户

在MySQL中,可以通过运行CREATE USER查询来创建用户:

CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;

可以通过运行ALTER USER查询更改用户–该查询允许您执行许多不同的操作,包括锁定和解锁帐户、要求帐户使用SSL连接、建立每小时最大连接数、丢弃旧密码等。下面是示例查询,该查询更改您自己密码的:

ALTER USER USER() IDENTIFIED BY ‘password’;

可以通过运行DROP USER查询删除用户:

DROP USER ‘demouser’@’localhost’;

在MySQL中授予和撤消用户的权限

GRANT语句必须授予权限或角色。ON语句可以告诉您授予权限还是角色。以下查询授予权限:

GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’;

以下查询授予角色:

GRANT ‘demo_role’ TO ‘demouser’@’localhost’;

要撤消用户的某些权限,请使用revoke语句(帐户名的主机名部分默认为“%”):

REVOKE SELECT ON *.* FROM ‘demouser’@’localhost’;

要撤消所有权限,可以使用revoke all:

REVOKE ALL PRIVILEGES ON *.* FROM ‘demouser’@’localhost’;

执行完上述语句后,您可能想执行 FLUSH PRIVILEGES 语句。

检查MySQL中分配了哪些权限

  • 要检查分配了哪些特权,请使用 SHOW GRANTS 语句
  • 对于发出的每个请求,服务器都会确定要执行的操作,然后检查您的权限是否足以执行相关操作。
  • 服务器使用mysql数据库中的user和db表来确保访问控制。
  • user和global_grants表授予全局权限。

其余选项将在即将发布的另外一篇帖子中介绍。

小结

就MySQL安全而言,您有非常广泛的选择。这些选项包括基本的安全措施,可以适用于几乎所有的应用程序,但其中一些选项非常特定于MySQL。请记住,并不是所有可用的选项都已经涵盖–它们将在的后续博客中讨论。