ITPub博客

首页 > 数据库 > MySQL > MySQL入门--MySQL安全

MySQL入门--MySQL安全

MySQL 作者:panpong 时间:2019-06-11 10:21:44 0 删除 编辑

MySQL 安全

当多个用户同时访问 MySQL 服务器,尤其当这些用户通过 Internet 进行连接时, MySQL 服务器将有安全风险。不仅 MySQL 服务器处于危险中,整个服务器主机也可能受到损害。有多种类型的安全攻击:窃听、更改、播放、拒绝服务;

对于存储在 MySQL 数据库中的数据,必须使其保持安全,以免 MySQL 用户期望保密的数据被公开。 MySQL 使用基于访问控制列表 (access control list, ACL) 的安全。对于所有连接、查询和其他操作, MySQL 使用基于 ACL 的安全。 ACL 也支持 MySQL 客户机和服务器之间的 SSL 加密连接。

有关 MySQL 安全问题的更多信息,请参阅《 MySQL 参考手册》:

http://dev.mysql.com/doc/refman/5.6/en/security.html

最常见的安装安全风险为:

u   网络安全:有关客户机帐户的信息存储在 mysql 数据库中。为每个帐户设置的权限应该仅提供对该帐户需要查看或修改的数据的访问权限。指定帐户口令可使用户难以使用别人的帐户连接到服务器。例如, MySQL root 帐户具有可执行任何数据库操作的完全权限,因此有必要为其指定一个不易猜到的口令。

u   操作系统安全:通常使用专用的登录帐户管理 MySQL 。但是,该帐户所在的主机上可能还有其他登录帐户。将与 MySQL 不相关的帐户数量减至最少可以尽可能地降低此风险。

u   文件系统安全:目录和文件是文件系统的一部分,因此您需要保护它们免受在服务器主机上具有登录帐户的其他用户的直接访问。 MySQL 安装还包括用于管理和访问数据库的程序和脚本。用户需要能够运行其中的一部分(例如客户机程序),但应该无法对其进行修改或替换。

可以认为网络安全是最高防御级别。其中包含了操作系统安全。后者又包含了文件系统安全以及更深层的用户安全。尽管每个安全级别都有缺陷(或漏洞),但是当它们结合使用时,各个级别形成了一个几乎坚不可摧的堡垒。

1.1.        网络安全

网络安全风险预防任务:

投资设置防火墙。

确保仅供授权的客户机进行访问。

限制服务器所使用的网络接口。

使用安全安装脚本: mysql_secure_installation

遵守常规权限安全事项。

不通过 Internet 传输明文(未加密)数据。

MySQL 服务器在客户机 / 服务器环境中运行,并提供内在面向网络的服务。确保只有授权的客户机可以连接到服务器以访问其数据库是非常重要的。确保使用口令保护 MySQL 帐户并且不为其设置不必要的权限也非常重要。此外,请考虑限制服务器所使用的网络接口。

有许多不错的免费开源防火墙。 MySQL 不是为了面向 Internet 。如果 MySQL 未放置在 DMZ 中,应格外小心。事实上,如果 MySQL 与面向 Internet 的应用程序在同一计算机上运行,则可能应该仅使用文件套接字。

未加密的数据可被任何有时间和能力拦截该数据并使用它来达到自己目的的用户访问。因此,您应该使用 SSL SSH 等加密协议。

1.2.        口令安全

口令安全风险预防任务:

使用强口令保护初始 MySQL 帐户。

不在数据库中存储任何纯文本口令。 mysql 数据库将口令存储在 user 表中。最好使用单向散列存储这些口令。

不从字典中选择口令。

如果您使用纯文本口令,则在您的计算机被入侵后,入侵者可以获取完整的口令列表并使用这些口令。请改用 MD5() SHA1() SHA2() 或其他单向散列函数来存储散列值。

这种谨慎的方法用于在服务器中存储其他口令。有一些特殊程序可破译口令。应对这些程序的方法之一是使用由句子中每个单词的第一个字符组成的口令(例如,“ Mary had a little lamb ”可以生成口令“ Mhall ”)。这种口令易于记忆和输入,但不知道句子的人很难猜到。

 

1.3.        操作系统安全

操作系统安全与配置的复杂程度有关;

将不直接与运行 MySQL 相关的服务器主机任务数减至最少。当为主机配置的任务较少时,与运行复杂配置以支持多个服务的主机相比,前一个主机更易于确保安全。所分配的 MySQL 服务器最好是主要用于 MySQL 或专供其用,而不是用于 Web 托管或邮件处理之类的其他目的,或者是为通用交互使用而托管登录帐户的计算机。

如果其他用户可以登录,则可能会存在 MySQL 安装及其管理帐户的私密数据库信息被公开的风险。例如,不正确的文件系统权限可能会导致数据文件被公开。用户可以运行 ps 命令来查看有关进程及其执行环境的信息。

当计算机仅用于 MySQL 时,除了系统管理帐户和管理 MySQL 自身可能需要的其他任何帐户(例如 mysql 用户的帐户),无需再设置登录帐户。

此外,如果在服务器主机上运行的网络服务较少,则需要保持打开状态的网络端口也较少。关闭端口可将主机可能遭遇的攻击途径减至最少。尽量减少非 MySQL 服务的数量意味着更多的系统资源可以专用于 MySQL ,从而可以在性能方面获益。

1.4.        文件系统安全

MySQL 安装(目录和文件)风险预防任务:

l   更改所有权和访问权限后,再启动服务器。

将多用户系统的所有权设置为具有管理权限的帐户。将与 MySQL 相关的目录和文件以及 user group 表所有权设置为 mysql ,其中包括: MySQL 程序、数据库目录和文件、日志、状态和配置文件;

l   不要在保护文件之前设置口令。否则,将允许未经授权的用户替换文件。

l   设置一个专用于 MySQL 管理的帐户。

请勿向任何人( MySQL root 帐户除外)授予对 mysql 数据库中的 user 表的访问权限。将 MySQL 置于防火墙后或隔离区 (demilitarized zone, DMZ) 中。

仅当服务器正在运行时,才可以设置 MySQL root 帐户的口令。因此,启动服务器并设置口令之前,请采取任何必要的措施来保护文件系统中与 MySQL 相关的部分。如果在保护相应文件之前设置了口令,则有权直接访问 服务器主机上文件系统的用户可能会替换这些文件。这会危害 MySQL 安装并撤消口令设置的效果。

对于 Linux 之类的多用户系统,请将 MySQL 安装的所有组件的所有权设置为具有正确管理权限的专用登录帐户。这将保护安装免受不负责数据库管理的用户的访问。设置此帐户的另外一个好处是,可以使用该帐户运行 MySQL 服务器,而不是从 Linux root 帐户运行服务器。具有 root 登录帐户权限的服务器拥有不必要的文件系统访问权限,从而成为一个安全风险。

注:本部分假定存在用户名和组名均为 mysql 的管理帐户。不过,创建登录帐户的详细信息因 Linux 版本而不同,并且不在讨论范围之内。请参阅适用于您操作系统的文档。

 

1.5.        数据安全

用户可通过多种方法来损坏数据。您必须采取措施以保护数据免受如 SQL 注入等攻击。

首先,请勿信任应用程序用户输入的任何数据。用户可以使用具有特殊意义的字符(如引号或转义字符)获取应用程序代码。如果用户输入类似于 DROP DATABASE mysql; 的内容,请确保应用程序保持安全。

其次,保护数值和字符串数据的值。否则,用户可以获取对安全数据的访问权限,然后提交可以销毁数据或导致服务器负载过高的查询。

最后,甚至需要保护公开可用的数据,如 Web 表单、 URL 名称、特殊字符等,因为攻击会浪费服务器资源。

如果用户输入值 234 时,应用程序生成一个类似于 SELECT * FROM table WHERE ID=234 的查询,则用户可以输入值 234 OR 1=1 使应用程序生成查询 SELECT * FROM table WHERE ID=234 OR 1=1 。因此,服务器将检索表中的每一行。这将公开每一行并导致服务器负载过高。为了防止这种类型的攻击,请使用不会将值解释为 SQL 表达式的存储过程或预处理语句。

您可能认为:如果数据库仅包含公开可用的数据,则该数据库不需要保护。这是错误的,即使允许显示数据库中的任何行,仍应该防止通过注入 INSERT UPDATE REPLACE DELETE 语句来进行 DdoS 攻击或修改数据的尝试。否则,数据将对合法用户不可用。

以下是一些用于检测此问题的技巧:

在所有 Web 表单中输入单引号或双引号(“ ' ”和“ " ”)。

修改动态 URL ,向其添加 %22 (“ " ”)、 %23 (“ # ”)和 %27 (“ ' ”)。

在数值字段中输入字符、空格和特殊符号而不是数字。应用程序应删除这些内容再将其传递给 MySQL ;否则,将生成错误。

1.6.        安全连接

默认情况下, MySQL 使用未加密的客户机 / 服务器连接。但是未加密连接可能无法满足在网络上安全传输数据的要求,因为未加密连接网络通信容易受到监控和攻击,客户机和服务器之间传输的数据可能会被更改。

通过使用加密算法可抵御大多数威胁,加密算法会使所有类型的数据无法读取,这可抵御多种类型的攻击。如果应用程序需要加密连接所提供的安全性,对于这些连接,必须考虑额外的计算资源。大家知道,数据加密是 CPU 密集型操作,需要计算机执行额外工作,因此可能推迟其他 MySQL 任务。

 

有关与 MySQL 的安全连接相关的更多信息,请参阅《 MySQL 参考手册》:

http://dev.mysql.com/doc/refman/5.6/en/ssl-connections.html

1.6.1.       SSL 协议

MySQL 支持 MySQL 客户机和服务器之间的 SSL secure sockets layer ,安全套接字层) 连接。 SSL 连接协议具有以下特点:

Ø   使用不同的加密算法确保公共网络上数据的安全

Ø   检测任何数据更改、丢失或重放

Ø   结合了使用 X509 标准提供身份验证的算法

MySQL 可以针对单个连接启用加密。根据各个应用程序的需要,您可以选择常规的未加密连接或安全的加密 SSL 连接。

安全连接基于 OpenSSL API ,可通过 MySQL C API 获取。复制时使用 C API ,因此可以在 master slave 之间使用安全连接。

X509 使得在 Internet 上进行身份识别成为可能。这主要用于电子商务应用程序中。基本上,应该有一个受信任的证书颁发机构 (Certificate Authority, CA) ,该机构将电子证书分配给任何需要它们的人。证书依赖于包含两个加密密钥(公钥和私钥)的非对称加密算法。

证书所有者可以向另一方提供证书作为身份证明。证书包含其所有者的公钥和其他详细信息,由可信任的 CA 签名。使用此公钥加密的任何数据都只能使用相应的私钥进行解密,私钥由证书所有者持有。

例如,访问安全的 (HTTPS) 电子商务站点时,该站点将向您的浏览器提供其证书。浏览器将根据其受信任 CA 列表验证该证书,并使用其中包含的公钥创建加密的会话信息,该信息只能由发起服务器解密。然后,浏览器和服务器可以进行安全通信。

1.6.2.       MySQL 服务器使用 SSL

MySQL 服务器使用 SSL 的要求:

Ø   系统必须支持 yaSSL (已随 MySQL 提供)或 OpenSSL 。为便于使用安全连接, MySQL 已附带了 yaSSL 。( MySQL yaSSL 采用相同的许可模型,但是 OpenSSL 使用 Apache 样式的许可证。)

Ø   使用的 MySQL 版本必须包含 SSL 支持。

要获取安全连接以便使用 MySQL SSL ,必须首先执行以下操作:

Ø   装入 OpenSSL (如果使用的不是预编译的 MySQL )。

Ø   MySQL 配置 SSL 支持。要获得 OpenSSL ,请访问 http://www.openssl.org 。使用 OpenSSL 构建 MySQL 需要一个共享的 OpenSSL 库;否则,将出现链接程序错误。要将 MySQL 源代码分发配置为使用 SSL ,请调用 CMake

shell> cmake . -DWITH_SSL=bundled

Ø   该操作会将分发配置为使用附带的 yaSSL 库。要改用系统 SSL 库,请将相应选项指定为 -DWITH_SSL=system

Ø   确保 mysql 数据库中的 user 表包含与 SSL 相关的列( ssl_* x509_* )。如果 user 表中没有与 SSL 相关的列(以 ssl_* x509_* 开头),则必须使用 mysql_upgrade 程序对其进行升级。

Ø   使用 --ssl 选项检查服务器二进制文件是否使用 SSL 支持进行编译。如果服务器不支持 SSL ,则会出现错误:

shell> mysqld --ssl --help

060525 14:18:52 [ERROR] mysqld: unknown option '--ssl'

最后,使用 SSL 的选项启动服务器。

1.6.3.       使用 SSL 启动 MySQL 服务器

通过以下选项,使 mysqld 服务器可以使用 SSL 进行连接:

Ø   --ssl-ca :确定要使用的证书颁发机构 (Certificate Authority, CA) 证书(加密必需)

Ø   --ssl-key :确定服务器公钥

Ø   --ssl-cert :确定服务器私钥

shell> mysqld --ssl-ca=ca-cert.pem --ssl-cert=server-cert.pem --ssl-key=server-key.pem

可以向客户机发送 --ssl-cert 并针对其正在使用的 CA 证书进行验证。

有关为 MySQL 设置 SSL 证书的信息,请参阅《 MySQL 参考手册》:

http://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html

1.6.4.       SSL 加密连接

要使用 SSL 支持建立与 MySQL 服务器的安全连接,必须指定的客户机选项取决于客户机所使用的用户帐户的 SSL 要求。除基于用户名和口令的常见验证之外, MySQL 还可以检查 X509 证书属性。要为 MySQL 帐户指定与 SSL 相关的选项,请使用 GRANT 语句的 REQUIRE 子句。使用 GRANT 语句的 REQUIRE SSL 选项可仅允许某个帐户使用 SSL 加密连接:

mysql>GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost' IDENTIFIED BY 'goodsecret' REQUIRE SSL;

通过使用 --ssl-ca 选项启动 mysql 客户机可获得加密连接。也可以为 X509 连接指定 --ssl-key --ssl-cert 选项:

shell> mysql --ssl-ca=ca-cert.pem --ssl-cert=server-cert.pem --ssl-key=server-key.pem

 

有很多方法可限制给定帐户的连接类型。本次只介绍三种选项:

Ø   REQUIRE NONE :指示帐户没有 SSL X509 要求。如果未指定与 SSL 相关的 REQUIRE 选项,则这是默认选项。如果用户名和口令有效,则允许未加密的连接。但是,如果客户机具有相应的证书和密钥文件,则客户机也可以通过指定一个选项来要求加密连接。即,客户机无需指定任何 SSL 命令选项,在这种情况下,连接是未加密的。

Ø   REQUIRE SSL :指示服务器仅允许帐户使用 SSL 加密连接。

Ø   REQUIRE X509 :客户机必须具有有效的证书,但具体的证书、颁发者和主题无关紧要。唯一的要求是,应该可以使用其中一个 CA 证书验证其签名。

1.6.5.       检查 SSL 状态

使用 have_ssl 系统变量的值检查正在运行的 mysqld 服务器是否支持 SSL

mysql> SHOW VARIABLES LIKE 'have_ssl';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| have_ssl | YES |

+---------------+-------+

使用 ssl_cipher 状态变量的值检查当前服务器连接是否使用了 SSL

mysql> SHOW STATUS LIKE 'ssl_cipher';

+---------------+--------------------+

| Variable_name | Value |

+---------------+--------------------+

| ssl_cipher | DHE-RSA-AES256-SHA |

+---------------+--------------------+

如果 have_ssl 的值为 YES ,则服务器支持 SSL 连接。如果值为 DISABLED ,则服务器支持 SSL 连接,但在启动时未提供相应的 --ssl-* 选项。

对于 mysql 客户机,可以使用 STATUS \s 命令并检查 SSL 行:

mysql> \s

...

SSL: Cipher in use is DHE-RSA-AES256-SHA

...

1.6.6.       使用 SSL 的优点和缺点

优点:

Ø   提高了有需求的应用程序的安全性

Ø   可以针对单个连接启用

Ø   可用于复制操作

缺点:

Ø   占用大量 CPU 资源

Ø   降低了客户机 / 服务器协议的速度

Ø   可能会推迟其他 SQL 任务

1.6.7.       MySQL 安全远程连接

MySQL 支持与远程 MySQL 服务器的 SSH secure shell ,安全 shell 连接。这一功能要求:

Ø   客户机上存在 SSH 客户机

Ø   通过 SSH 隧道进行从客户机到服务器的端口转发

Ø   具有 SSH 客户机的计算机上存在客户机应用程序

设置完成后,将有一个本地端口托管到 MySQL SSH 连接并使用 SSH 进行加密。

有关使用 SSH Windows 客户机远程连接到 MySQL 的信息,请参阅《 MySQL 参考手册》:

http://dev.mysql.com/doc/refman/5.6/en/windows-and-ssh.html

1.7.        MySQL 安全常见问题

要查找对许多常见安全问题的解答,请参阅《 MySQL 参考手册》的常见问题部分中有关安全的内容:

http://dev.mysql.com/doc/refman/5.6/en/faqs-security.html


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16976507/viewspace-2647255/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
数据库工程师,熟悉oracle,postgresql,mysql,DB2等主流关系型数据库运维,调优,一直活跃在运维一线。了解Python,django,简单自动化运维系统开发。

注册时间:2009-03-06

  • 博文量
    138
  • 访问量
    272404