您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

七步让您的MySQL服务器更安全

时间:2023-01-12 14:18:14  来源:51CTO  作者:

译者 | 陈峻

不知您是否发现一种现象,那些初学渗透测试的人员往往过于关注应用的安全性,而对数据库的安全性不太重视。他们殊不知,没有数据库的配置与安全测试,应用的安全性也就无法得到充分的验证。在此,我将以最常见的数据库管理系统——MySQL为例,向您介绍如何通过七步骤来安全加固数据库服务器。

1、使用SSH隧道代替远程连接

默认情况下,MySQL服务运行在3306号端口上。在安装MySQL时,您会注意到3306号端口持续对所有连接都进行侦听。就目前而言,由于MySQL的端口是对外开放的,因此您应该将MySQL的服务设置为,仅侦听本机地址的模式。

由于服务器通常是运行在linux的各种发行版上的,因此下面我将选取基于Debian发行版来进行演示。首先,为了使用SSH隧道,而不是远程连接,您需要在/etc/mysql/my.cnf文件中,关闭由内向外的默认端口。在该文件中,您需要开启一个名为[mysqld]的字段,并输入如下命令:

复制

[mysqld]

bind-address=127.0.0.1

完成之后,请不要忘记保存该文件,并使用如下命令去重新启动该服务:

复制

sudo systemctl restart mysqld

# or

sudo systemctl restart mariadb.service

至此,MySQL服务将只会监听本机地址了。如果您使用的是MariaDB,那么可以查看/etc/mysql/mariadb.conf.d/50-server.cnf,并检查是否有关于bind-address的定义。

至此,您已将绑定地址设置为127.0.0.1,即localhost。您可以运行Nmap进行扫描,并能检查到如下输出:

由于127.0.0.1代表了本地主机,因此您可以看到MySQL的端口。现在,您可以尝试着再次更改绑定的地址,以确保其已经生效:

复制

[mysqld]

bind-address=127.5.5.

在保存了/etc/mysql/my.cnf文件,并重启了MySQL服务后,您可以再次执行Nmap扫描。此时,您应该不会在本地主机上再看到该绑定地址了。

在确认了此类修改是奏效的后,请不要忘了回到第一步的设置中,将绑定地址改回127.0.0.1,并再次保存。

2、设置本地文件访问的屏障

MySQL默认可以与本地文件系统通信。例如,通过使用查询,您可以在本地文件系统中,查看到文本内容,并将查询结果写到磁盘上。而为了防止恶意攻击者使用此功能,您必须阻止MySQL直接与本地文件系统进行通信。

在实践中,您可以使用名为local-infile的函数,来采取预防措施。例如,假设您有一个名为“/etc/secretfile.txt”的文件,并且您在该文件中存放了密码。那么,如果您的/etc/mysql/my.cnf文件中的local-infile函数值在为1时,就意味着访问权限是开启的。您可以基于此去检查secretfile.txt文件。

出于验证目的,您可以使用如下命令连接到MySQL上,并检查其是否可以看到

复制

secretfile.txt文件:

SELECT LOAD_FILE("/etc/secretfile.txt");

不难看出,它成功地捕获了计算机上的文件信息。如下所示,请更改/etc/mysql/my.cnf文件中的local-infile值:

复制

[mysqld]

local-infile=0

请重启MySQL服务,并重新连接MySQL。再次执行上述步骤,您会发现自己已不能看到文件内容了。

当然,如果用户本身就没有对本地文件的读写权限,那么他们同样无法看到该文件。不过,这不应该成为您忽略的理由。它仍然是您应该在渗透测试和数据库安全性中需要检查的内容之一。

3、设置应用用户和密码

值得注意的是,数据库的管理用户和访问数据库的MySQL用户必须互不相同。换句话说,如果您直接使用root用户,将应用连接到MySQL上,则是极其危险的。如果可能的话,请定义那些无法单独执行UPDATE或INSERT操作的用户,并分配给应用。

除了用户,我们再来考虑用户的密码。与其他领域类似,MySQL用户的密码也需要具有复杂且不可预测的特性。如果您在此方面缺乏经验的话,可以使用现成的密码生成器系统。

4、删除匿名用户

您在保持默认设置情况下去安装MySQL时,会产生一些匿名用户。显然,您需要删除或阻止他们对于数据库的访问。对于MySQL服务器的安全而言,您应该留意从如下查询中获得的响应:

复制

SELECT * FROM mysql.user WHERE USER="";

# Example Output

Empty set (0.001 sec)

对于查询到的结果,您应当立即删除这些匿名用户。例如,如果在名为“localhost”的数据库环境中有一个名为“anonuser”的匿名帐户,那么您就可以使用如下命令来删除之:

复制

DROP USER 'anonuser'@'localhost';

5、检查MySQL的本地文件权限

假设您是一名数据库管理员,想检查一周前的数据。您可能必须通过SSH,连接到数据库服务器,并更改所需的MySQL文件。在执行此操作的过程中,如果您使用Linux的root用户权限,那么数据文件的所有权和查询权限就发生了更改。

为了避免此类情况,您需要查看/var/lib/mysql目录,以检查授予权限的状态,并通过如下命令,审查所有文件的所有者是否为MySQL用户。

复制

sudo ls -al /var/lib/mysql

显然,此类文件的读写权限应该只被分配给MySQL用户,而其他用户不应具有任何权限。

6、使用MySQL SSL

想象一下,在ABC地区,有许多不同的服务器,其中一台服务器一旦被恶意黑客接管了。那么黑客将在ABC区域进行内部扫描。通过这种方式,他可以收集到各个服务器的信息。

如果他在此过程中检测到MySQL服务器,那么就可以对目标服务器发起中间人攻击(MitM)。这意味着他们可以窃取连接到该服务器的应用和用户之间的会话信息。避免这种情况的一种最佳方法是在MySQL服务器上启用SSL。

7、日志和历史文件

您可以使用MySQL日志来分析和查找各类错误。如下所示,您可以通过进入my.cnf文件,来编辑日志的保存位置。

复制

# /etc/mysql/my.cnf

[mysqld]

log =/var/log/mylogfiles

您可以按需更改mylogfiles的名称或位置。而当您在Linux终端上连接到MySQL服务器,并键入各种命令时,各种查询将被保存在mysql_history文件中。如果运行以下命令,您将可以在MySQL终端中看到正在使用的查询信息:cat ~/.mysql_history。

如果您不想提供有关自己在服务器内部进行查询的类型等信息,则可以通过如下命令删除该文件的内容。

复制

sudo echo "cleaned" > ~/.mysql_history

在完成后,您可以通过再次运行上述命令,去检查文件的内容。

8、得数据库者得系统

无论属于哪个领域的应用,由于数据库里可能存放着包括:客户信息、银行帐户和账号密码等数据,它们都是恶意攻击者想尽一切办法要获得的信息。因此,无论是数据库开发人员、还是管理人员,都至少需要了解他们在渗透测试中可能涉及到的基础知识。希望上述向您介绍的七步加固MySQL服务器安全的建议,能够助您一臂之力。

原文链接:https://www.makeuseof.com/mysql-database-security-checklist/

译者介绍

陈峻 (Julian Chen),51CTO社区编辑,具有十多年的IT项目实施经验,善于对内外部资源与风险实施管控,专注传播网络与信息安全知识与经验。



Tags:MySQL   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
MySQL 核心模块揭秘
server 层会创建一个 SAVEPOINT 对象,用于存放 savepoint 信息。binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里。 InnoDB 会维护自己的 savepoint...【详细内容】
2024-04-03  Search: MySQL  点击:(7)  评论:(0)  加入收藏
MySQL 核心模块揭秘,你看明白了吗?
为了提升分配 undo 段的效率,事务提交过程中,InnoDB 会缓存一些 undo 段。只要同时满足两个条件,insert undo 段或 update undo 段就能被缓存。1. 关于缓存 undo 段为了提升分...【详细内容】
2024-03-27  Search: MySQL  点击:(14)  评论:(0)  加入收藏
MySQL:BUG导致DDL语句无谓的索引重建
对于5.7.23之前的版本在评估类似DDL操作的时候需要谨慎,可能评估为瞬间操作,但是实际上线的时候跑了很久,这个就容易导致超过维护窗口,甚至更大的故障。一、问题模拟使用5.7.22...【详细内容】
2024-03-26  Search: MySQL  点击:(12)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  Search: MySQL  点击:(28)  评论:(0)  加入收藏
MySQL自增主键一定是连续的吗?
测试环境:MySQL版本:8.0数据库表:T (主键id,唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不...【详细内容】
2024-03-10  Search: MySQL  点击:(12)  评论:(0)  加入收藏
准线上事故之MySQL优化器索引选错
1 背景最近组里来了许多新的小伙伴,大家在一起聊聊技术,有小兄弟提到了MySQL的优化器的内部策略,想起了之前在公司出现的一个线上问题,今天借着这个机会,在这里分享下过程和结论...【详细内容】
2024-03-07  Search: MySQL  点击:(31)  评论:(0)  加入收藏
MySQL数据恢复,你会吗?
今天分享一下binlog2sql,它是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。主要...【详细内容】
2024-02-22  Search: MySQL  点击:(53)  评论:(0)  加入收藏
如何在MySQL中实现数据的版本管理和回滚操作?
实现数据的版本管理和回滚操作在MySQL中可以通过以下几种方式实现,包括使用事务、备份恢复、日志和版本控制工具等。下面将详细介绍这些方法。1.使用事务:MySQL支持事务操作,可...【详细内容】
2024-02-20  Search: MySQL  点击:(54)  评论:(0)  加入收藏
为什么高性能场景选用Postgres SQL 而不是 MySQL
一、 数据库简介 TLDR;1.1 MySQL MySQL声称自己是最流行的开源数据库,它属于最流行的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。LAMP...【详细内容】
2024-02-19  Search: MySQL  点击:(39)  评论:(0)  加入收藏
MySQL数据库如何生成分组排序的序号
经常进行数据分析的小伙伴经常会需要生成序号或进行数据分组排序并生成序号。在MySQL8.0中可以使用窗口函数来实现,可以参考历史文章有了这些函数,统计分析事半功倍进行了解。...【详细内容】
2024-01-30  Search: MySQL  点击:(55)  评论:(0)  加入收藏
▌简易百科推荐
MySQL 核心模块揭秘
server 层会创建一个 SAVEPOINT 对象,用于存放 savepoint 信息。binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里。 InnoDB 会维护自己的 savepoint...【详细内容】
2024-04-03  爱可生开源社区    Tags:MySQL   点击:(7)  评论:(0)  加入收藏
MySQL 核心模块揭秘,你看明白了吗?
为了提升分配 undo 段的效率,事务提交过程中,InnoDB 会缓存一些 undo 段。只要同时满足两个条件,insert undo 段或 update undo 段就能被缓存。1. 关于缓存 undo 段为了提升分...【详细内容】
2024-03-27  爱可生开源社区  微信公众号  Tags:MySQL   点击:(14)  评论:(0)  加入收藏
MySQL:BUG导致DDL语句无谓的索引重建
对于5.7.23之前的版本在评估类似DDL操作的时候需要谨慎,可能评估为瞬间操作,但是实际上线的时候跑了很久,这个就容易导致超过维护窗口,甚至更大的故障。一、问题模拟使用5.7.22...【详细内容】
2024-03-26  MySQL学习  微信公众号  Tags:MySQL   点击:(12)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  字节跳动技术团队    Tags:ByteHouse   点击:(28)  评论:(0)  加入收藏
MySQL自增主键一定是连续的吗?
测试环境:MySQL版本:8.0数据库表:T (主键id,唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不...【详细内容】
2024-03-10    dbaplus社群  Tags:MySQL   点击:(12)  评论:(0)  加入收藏
准线上事故之MySQL优化器索引选错
1 背景最近组里来了许多新的小伙伴,大家在一起聊聊技术,有小兄弟提到了MySQL的优化器的内部策略,想起了之前在公司出现的一个线上问题,今天借着这个机会,在这里分享下过程和结论...【详细内容】
2024-03-07  转转技术  微信公众号  Tags:MySQL   点击:(31)  评论:(0)  加入收藏
MySQL数据恢复,你会吗?
今天分享一下binlog2sql,它是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。主要...【详细内容】
2024-02-22  数据库干货铺  微信公众号  Tags:MySQL   点击:(53)  评论:(0)  加入收藏
如何在MySQL中实现数据的版本管理和回滚操作?
实现数据的版本管理和回滚操作在MySQL中可以通过以下几种方式实现,包括使用事务、备份恢复、日志和版本控制工具等。下面将详细介绍这些方法。1.使用事务:MySQL支持事务操作,可...【详细内容】
2024-02-20  编程技术汇    Tags:MySQL   点击:(54)  评论:(0)  加入收藏
MySQL数据库如何生成分组排序的序号
经常进行数据分析的小伙伴经常会需要生成序号或进行数据分组排序并生成序号。在MySQL8.0中可以使用窗口函数来实现,可以参考历史文章有了这些函数,统计分析事半功倍进行了解。...【详细内容】
2024-01-30  数据库干货铺  微信公众号  Tags:MySQL   点击:(55)  评论:(0)  加入收藏
mysql索引失效的场景
MySQL中索引失效是指数据库查询时无法有效利用索引,这可能导致查询性能显著下降。以下是一些常见的MySQL索引失效的场景:1.使用非前导列进行查询: 假设有一个复合索引 (A, B)。...【详细内容】
2024-01-15  小王爱编程  今日头条  Tags:mysql索引   点击:(87)  评论:(0)  加入收藏
站内最新
站内热门
站内头条