MySql 一般安全问题汇总

同学们,发福利了,感兴趣的请前往官网!

一、安全准则

  任何在连接到互联网的计算机上使用MySQL的人都应该阅读本节,以避免最常见的安全错误。
在讨论安全性时,有必要考虑充分保护整个服务器主机(而不仅仅是MySQL服务器)免受所有类型的适用攻击:窃听、更改、播放和拒绝服务。我们在这里没有涵盖可用性和容错的所有方面。
MySQL对用户可以尝试执行的所有连接、查询和其他操作使用基于访问控制列表(ACL)的安全性。MySQL客户端和服务器之间还支持SSL加密连接。这里讨论的许多概念根本不是MySQL特有的;相同的一般思想适用于几乎所有的应用程序。
运行MySQL时,请遵循以下准则:

  • 永远不要让任何人(MySQL 帐户除外)访问 mysql 系统数据库中的用户表!这一点至关重要。

  • 了解MySQL访问权限系统的工作原理。使用GRANT和REVOKE语句来控制对MySQL的访问。不要授予超过必要权限的权限。从不向所有主机授予特权。

    Checklist

    • 试试mysql-u root。如果您能够在不需要密码的情况下成功连接到服务器,任何人都可以作为MySQL根用户以完全权限连接到您的MySQL服务器!查看MySQL安装说明,特别注意有关设置根密码的信息。

    • 使用SHOW GRANTS语句检查哪些帐户可以访问什么。然后使用REVOKE语句删除那些不必要的特权。

  • 不要在数据库中存储明文密码。如果你的电脑被泄露,入侵者可以获取完整的密码列表并使用它们。相反,使用SHA2()或其他单向哈希函数并存储哈希值。
    为了防止使用rainbow 表恢复密码,不要在普通密码上使用这些功能;相反,选择一些字符串用作salt,并使用hash(hash(password)+salt)值。

  • 假设所有密码都将使用已知密码列表进行自动破解,并使用有关您的公开信息(如社交媒体帖子)进行有针对性的猜测。不要选择由容易破解或猜测的项目组成的密码,如字典单词、专有名称、运动队名称、首字母缩写或常见短语,尤其是与您相关的密码。如果以可预测的方式使用大写字母、数字替换和添加以及特殊字符,则这些都没有帮助。此外,不要选择您在任何地方看到的用作示例的任何密码,或其变体,即使它是作为强密码的示例出现的。
    相反,选择尽可能长且不可预测的密码。这并不意味着组合需要是一个难以记忆和复制的随机字符串,尽管这是一个很好的方法,例如,如果你有密码管理软件,可以生成和填充这些密码并安全存储它们。包含多个单词的密码短语易于创建、记忆和复制,并且比由单个修改的单词或可预测的字符序列组成的典型用户选择的密码安全得多。要创建安全的密码短语,请确保其中的单词和其他项目不是已知的短语或引号,不会以可预测的顺序出现,并且最好彼此之间没有以前的关系。

  • 投资防火墙。这可以保护您免受至少 50% 的 任何软件中的所有类型的漏洞利用。把 MySQL 抛在后面 防火墙或位于非军事区 (DMZ) 中。

    Checklist

    • 尝试使用这样的工具从互联网扫描您的端口 如。MySQL 通过以下方式使用端口 3306 违约。不应从不受信任的端口访问此端口 主机。作为检查您的MySQL端口是否 打开,从某些远程计算机尝试以下命令, server_host是主机的地方 MySQL 服务器所在的主机的名称或 IP 地址 运行:nmap

      $> telnet server_host 3306

      如果 telnet 挂起或连接 拒绝,端口被阻止,这就是您想要的方式 是。如果您获得连接和一些垃圾字符, 端口已打开,应在防火墙上关闭或 路由器,除非你真的有充分的理由保留它 打开。

  • 访问MySQL的应用程序不应信任任何数据 由用户输入,并应使用适当的防御性编写 编程技术。

  • 不要通过互联网传输纯(未加密)数据。 每个有时间的人都可以访问此信息 以及拦截它并将其用于自己的目的的能力。 相反,请使用加密协议,例如SSL或SSH。MySQL 支持内部 SSL 连接。另一种技术是使用 SSH 端口转发以创建加密(和压缩) 用于通信的隧道。

  • 学习使用 tcpdump 和字符串实用程序。在大多数情况下,您可以 通过发出 命令如下所示:

    $> tcpdump -l -i eth0 -w - src or dst port 3306 | strings

    这在 Linux 下工作,应该适用于小 在其他系统下进行修改。

二、确保密码安全

1、确保密码安全

MySQL用户应该使用以下准则来保护密码的安全。
当您运行客户端程序以连接到MySQL服务器时,不建议以将密码暴露给其他用户发现的方式指定密码。此处列出了运行客户端程序时可以用于指定密码的方法,以及对每种方法的风险评估。简而言之,最安全的方法是让客户端程序提示输入密码,或者在受适当保护的选项文件中指定密码。

  • 使用mysql_config_editor实用程序,可以将身份验证凭据存储在名为.mylogin.cnf的加密登录路径文件中。mysql客户端程序稍后可以读取该文件,以获取连接到mysql Server的身份验证凭据。
  • 在命令行中使用--password=password或-password选项。例如:
$> mysql -u francis -pfrank db_name

       如果您的操作环境设置为在终端窗口的标题栏中显示当前命令,则只要该命令正在运行,即使该命令已在窗口内容区域中滚动到视图之外,密码仍然可见。

  • 在没有指定密码值的情况下,在命令行中使用--password或-p选项。在这种情况下,客户端程序以交互方式请求密码:
    $> mysql -u francis -p db_name
    Enter password: ********

*字符表示您输入密码的位置。输入密码时不会显示该密码。
这样输入密码比在命令行中指定密码更安全,因为其他用户看不到密码。但是,这种输入密码的方法仅适用于交互式运行的程序。如果要从非交互运行的脚本中调用客户端,则无法通过键盘输入密码。在某些系统上,您甚至可能发现脚本的第一行被读取并被(错误地)解释为您的密码。

  • 将您的密码存储在选项文件中。例如,在Unix上,您可以在主目录.my.cnf文件的[client]部分列出您的密码:
    [client]
    password=password

    为了确保密码的安全,除了你自己,任何人都不应该访问该文件。要确保这一点,请将文件访问模式设置为400或600。例如:

    $> chmod 600 .my.cnf

    要从命令行命名包含密码的特定选项文件,请使用--defaults file=file_name选项,其中file_name是文件的完整路径名。例如:

    $> mysql --defaults-file=/home/francis/mysql-opts

    在Unix上,mysql客户端将已执行语句的记录写入历史文件(请参阅第4.5.1.3节“mysql客户端日志记录”)。默认情况下,此文件名为.mysql_history,并在主目录中创建。密码可以在CREATE USER和ALTER USER等SQL语句中以纯文本形式编写,因此,如果使用这些语句,它们将记录在历史文件中。为了确保此文件的安全,请使用限制访问模式,与前面对.my.cnf文件所述的方式相同。
    如果您的命令解释器维护历史记录,则保存命令的任何文件都包含在命令行上输入的MySQL密码。例如,bash使用~/.bash_history。任何这样的文件都应该具有限制访问模式。

2、密码安全管理员准则

数据库管理员应使用以下准则来确保密码的安全。
MySQL将用户帐户的密码存储在MySQL.user系统表中。不应将对此表的访问权限授予任何非管理帐户。
帐户密码可能已过期,因此用户必须重置这些密码。
validate_password插件可用于强制执行可接受密码的策略。
有权修改插件目录(plugin_dir系统变量的值)或指定插件目录位置的my.cnf文件的用户可以替换插件并修改插件提供的功能,包括验证插件。
应该保护可能写入密码的日志文件等文件。

3、密码和日志记录

密码可以写成纯文本形式写在 SQL 语句中,例如 CREATE USER、GRANT 和 SET PASSWORD。如果这样的陈述 由MySQL服务器记录为写入,密码在其中 对有权访问日志的任何人可见。 语句日志记录避免将密码写入 以下声明:

CREATE USER ... IDENTIFIED BY ...
ALTER USER ... IDENTIFIED BY ...
SET PASSWORD ...
START SLAVE ... PASSWORD = ...
START REPLICA ... PASSWORD = ...
CREATE SERVER ... OPTIONS(... PASSWORD ...)
ALTER SERVER ... OPTIONS(... PASSWORD ...)

这些语句中的密码将被重写,使其不会在写入常规查询日志、慢速查询日志和二进制日志的语句文本中出现。重写不适用于其他语句。特别是,mysql.user系统表中引用文字密码的INSERT或UPDATE语句会按原样记录,因此应避免使用此类语句。(无论如何,不鼓励直接修改拨款表。)
对于常规查询日志,可以通过使用--log raw选项启动服务器来抑制密码重写。出于安全原因,不建议将此选项用于生产用途。出于诊断目的,查看服务器接收到的语句的确切文本可能很有用。
默认情况下,审核日志插件生成的审核日志文件的内容未加密,并且可能包含敏感信息,例如SQL语句的文本。出于安全原因,审核日志文件应写入一个只有MySQL服务器和有正当理由查看日志的用户才能访问的目录。

如果安装了查询重写插件,服务器接收到的语句可能会被重写(请参阅查询重写插件)。在这种情况下,--log raw选项对语句日志记录的影响如下:

  • 如果没有--log-raw,服务器将记录查询重写插件返回的语句。这可能与收到的声明不同。
  • 使用--log-raw,服务器会记录收到的原始语句。

密码重写的一个含义是,无法解析(例如,由于语法错误)的语句不会写入常规查询日志,因为它们不可能是无密码的。需要记录所有语句(包括有错误的语句)的用例应该使用--log raw选项,记住这也可以绕过密码重写。
只有当需要纯文本密码时,才会进行密码重写。对于具有期望密码哈希值的语法的语句,不会发生重写。如果为这种语法错误地提供了纯文本密码,则会按照给定的方式记录密码,而无需重写。
要保护日志文件不被不必要的暴露,请将它们放在限制服务器和数据库管理员访问的目录中。如果服务器登录到mysql数据库中的表,则只向数据库管理员授予对这些表的访问权限。
副本将复制源服务器的密码存储在其连接元数据存储库中,默认情况下,该存储库是mysql数据库中名为slave_master_info的表。现在不赞成将数据目录中的文件用于连接元数据存储库,但仍然可以(请参阅第17.2.4节“中继日志和复制元数据存储库”)。确保只有数据库管理员才能访问连接元数据存储库。将密码存储在连接元数据存储库中的另一种方法是使用START REPLICA(或MySQL 8.0.22之前的START SLAVE)或START GROUP_REPLICATION语句来指定连接到源的凭据。
使用限制访问模式来保护包括日志表或包含密码的日志文件的数据库备份。

三、使 MySQL 免受攻击者的攻击

当您连接到MySQL服务器时,您应该使用密码。密码不会以明文形式通过连接传输。
所有其他信息都以文本形式传输,任何能够观看连接的人都可以阅读。如果客户端和服务器之间的连接通过不受信任的网络,并且您对此感到担忧,则可以使用压缩协议使流量更难解密。您还可以使用MySQL的内部SSL支持,使连接更加安全。
或者,使用 SSH 到 在 MySQL 服务器和 MySQL 客户端。

为了确保MySQL系统的安全,您应该强烈考虑以下建议:

  • 要求所有MySQL帐户都有密码。客户端程序不一定知道运行它的人的身份。对于客户端/服务器应用程序来说,用户可以为客户端程序指定任何用户名是很常见的。例如,如果other_user没有密码,任何人都可以使用mysql程序以mysql-uother_user db_name的形式调用它,从而以其他人的身份进行连接。如果所有帐户都有密码,那么使用另一个用户的帐户进行连接将变得更加困难。
  • 确保在数据库目录中唯一具有读或写权限的Unix用户帐户是用于运行mysqld的帐户。
  • 永远不要以Unix root用户的身份运行MySQL服务器。这是非常危险的,因为任何拥有FILE权限的用户都可以导致服务器以root身份创建文件(例如~root/.bashrc)。为了防止这种情况,mysqld拒绝以root身份运行,除非使用--user=root选项明确指定。
    mysqld可以(也应该)作为一个普通的、没有特权的用户运行。您可以创建一个名为mysql的独立Unix帐户,使一切更加安全。仅将此帐户用于管理MySQL。要以不同的Unix用户身份启动mysqld,请在my.cnf选项文件的[mysqld]组中添加一个指定用户名的用户选项,在该组中您可以指定服务器选项。例如:
    [mysqld]
    user=mysql

    这将导致服务器以指定用户身份启动,无论是手动启动还是使用mysqld_safe或mysql.server启动。以非root用户身份运行mysqld并不意味着您需要更改用户表中的root用户名。MySQL帐户的用户名与Unix帐户的用户名无关。

  • 不要将FILE权限授予非管理用户。任何拥有此权限的用户都可以使用mysqld守护进程的权限在文件系统中的任何位置写入文件。这包括服务器的数据目录,其中包含实现特权表的文件。为了使FILE特权操作更安全,使用SELECT生成的文件。。。INTO OUTFILE不会覆盖现有文件,并且每个人都可以写入。
    FILE权限还可用于读取服务器所运行的Unix用户在世界范围内可读或可访问的任何文件。使用此权限,您可以将任何文件读取到数据库表中。这可能会被滥用,例如,使用LOAD DATA将/etc/passwd加载到一个表中,然后可以使用SELECT来显示该表。
    要限制文件的读写位置,请将secure_file_priv系统设置为特定目录。

  • 加密二进制日志文件和中继日志文件。加密有助于保护这些文件及其包含的潜在敏感数据不被外部攻击者滥用,也不被存储这些文件的操作系统用户未经授权查看。通过将binlog_encryption系统变量设置为on,可以在MySQL服务器上启用加密。

  • 不要将PROCESS或SUPER权限授予非管理用户。mysqladmin processlist和SHOW processlist的输出显示当前正在执行的任何语句的文本,因此任何被允许查看服务器进程列表的用户都可以查看其他用户发布的语句。
    mysqld为具有connection_ADMIN或SUPER权限的用户保留了一个额外的连接,这样MySQL根用户即使所有正常连接都在使用中,也可以登录并检查服务器活动。
    SUPER权限可用于终止客户端连接、通过更改系统变量的值来更改服务器操作以及控制复制服务器。

  • 不允许使用指向表的符号链接。(此功能可以通过--skip符号链接选项禁用。)如果您以root身份运行mysqld,这一点尤其重要,因为任何对服务器数据目录具有写访问权限的人都可以删除系统中的任何文件!

  • 如果你不信任你的DNS,你应该在授权表中使用IP地址而不是主机名。在任何情况下,使用包含通配符的主机名值创建授予表条目时都应该非常小心。

  • 如果您想限制单个帐户允许的连接数,可以通过在mysqld中设置max_user_connections变量来实现。CREATE USER和ALTER USER语句还支持用于限制帐户允许的服务器使用范围的资源控制选项。

  • 如果插件目录可由服务器写入,则用户可以使用SELECT…将可执行代码写入目录中的文件。。。进入垃圾堆。这可以通过使plugin_dir对服务器只读或将secure_file_priv设置为可以安全进行SELECT写入的目录来防止。

你可能感兴趣的:(mysql,mysql,安全,数据库)