金歌 发表于 2024-10-16 20:20:26

终于轮到我了,服务器mysql被黑客攻陷了

本日,我服务器上的mysql被攻击了,其他数据库全没了,多了一个数据库recover_data数据库,我点开数据库看了一下,里面存了一句勒索的话,假如要规复数据,访问某网址支付比特币,大概是要勒索我18000块左右的人民币。刹时人麻了,顿时给我敲响了一个警钟,数据安全不是等开辟好项目上线后才考虑,而是在项目落地的那一刻起就要器重起来,打战粮草先行,开辟安全先做。话不多说,解决题目!
第一步:规复数据



[*]执行我们原来备份好的数据库脚本
假如MySQL数据没有备份,以下有几种比力有效的方法:


[*] 使用MySQL的二进制日志:
假如你启用了MySQL的二进制日志(binlog),你可以使用这些日志文件来规复数据。二进制日志记录了全部对数据库的更改,你可以将这些日志应用到当前数据库中来规复数据。详细步骤包括:

[*]找到符合的二进制日志文件。
[*]使用mysqlbinlog工具将日志应用到数据库中。
[*]根据需要举行数据规复。

[*] 使用InnoDB的undo日志:
对于使用InnoDB存储引擎的表,InnoDB会在内部维护undo日志。虽然这些日志重要用于事务回滚,但在一些环境下,也大概用于规复数据。这种方法非常复杂且不总是有效,通常需要借助专业工具或技能支持。
[*] 规复数据的第三方工具:
有一些第三方数据规复工具可以实验从破坏的数据库文件中规复数据。比如:
MySQL Recovery Tools:这些工具可以分析破坏的数据库文件,实验规复表数据。
Percona Data Recovery Tools:Percona 提供了一些用于数据规复的工具和方法。
[*] 查抄操纵系统的文件系统快照:
假如你使用的是文件系统支持快照功能(如ZFS、Btrfs等),可以查抄是否有快照可用于规复数据。
[*] 寻求专业团队资助:
假如数据非常重要且上述方法无法解决题目,考虑寻求专业的数据规复服务,他们大概会有更多的工具和技能来实验规复数据。
为了避免数据丢失题目,发起定期备份数据库,并将备份保存在安全的地方。设置自动备份机制可以显着低落数据丢失的风险。
以下演示没有备份的环境下,通过binlog日志规复数据,其他方式自行相识,这里不做过多的赘述



[*]通过binlog日志规复数据的条件是你的mysql必须开启binlog功能,如何开启?在mysql的配置文件中配置即可,即在my.cnf中配置

[*]在【mysqld】下添加配置
log-bin=/usr/local/log/mysql-bin
binlog_format=mixed
server-id = 1

[*]参数解释:
log-bin=binlog日志的存放路径
binlog_format有三种方式分别为:
STATEMENT: 记录 SQL 语句,文件较小,但大概规复不划一。
ROW: 记录每行数据,包管划一性,但日志文件较大。
MIXED: 自动选择模式,兼顾性能和划一性。
server-id = 1:server-id是 MySQL 配置中的一个参数,用于唯一标识每个 MySQL 服务器实例。设置 server-id = 1 的意思是将当前 MySQL 服务器的 ID 设置为 1。
1. 唯一标识: 确保每个 MySQL 服务器在主从复制或集群中有唯一 ID。
2. 复制配置: 在设置主从复制时,每个服务器都必须有差别的 server-id。
3. 格式: 必须是一个正整数,且在同一复制环境中必须唯一。
[*]更多关于binlog_format的方式请自行相识这里简单介绍,不做过多的解释
开始规复数据:


[*]找到binlog文件,一样平常为mysql-bin.0000xx,
[*]提取最新的binlog日志,看看做了哪些操纵,我们需要规复到谁人时间节点?
[*]提取指令:
mysqlbinlog --stop-datetime=“2024-08-12 19:17:59” /www/server/data/mysql-bin.000034 > /tmp/recovery.sql
然后打开recovery.sql检察我们需要规复到哪个时间节点
https://i-blog.csdnimg.cn/direct/7972a89ee7384507ba3785dfc11434d1.png
显然我们可以看到删除数据库的时间是20240812 19:16:11开始,那么我们只需要提取20240812 19:16:11这个节点之前的数据即可。


[*]执行语句:mysqlbinlog --stop-datetime=“2024-08-12 19:16:10” /www/server/data/mysql-bin.000034 > /tmp/recovery.sql
[*]接着在/temp/目录下我们会得到一个提取后的recovery.sql脚本,最好是打开来看看是否有包罗了删除删除数据库的语句,有的话自行删掉即可。如下图所示:
https://i-blog.csdnimg.cn/direct/717a92c9c4c64fc4bee46ec1efee0234.png
[*]规复数据前:
https://i-blog.csdnimg.cn/direct/7165f4385bda43a18b14b50ccd96a804.png
接着我们规复数据:mysql -u root -p < /tmp/recovery.sql 回车输入mysql的密码即可规复乐成!!!
[*]数据规复后:
https://i-blog.csdnimg.cn/direct/228f1aded0ba46ceb0008d89c11ef42f.png
执行mysqlbinlog --stop-datetime=“2024-08-12 19:16:10” /www/server/data/mysql-bin.000034 > /tmp/recovery.sql假如报错mysqlbinlog: command not found 有两个缘故原由导致:


[*]没有安装mysql-client
检察mysql的bin目录下是否存在mysqlbinlog,假如存在就是没有配置环境变量导致的,假如不存在则是由于没有安装msyql-client
[*]没有配置环境变量,配置如下:
一样平常环境下linux的profile文件存在于/etc目录下,打开vim /etc/profile 然后添加配置项export PATH=$PATH:/mysqlbinlog的存放路径例如export PATH=$PATH:/usr/local/mysql/bin/mysqlbinlog 然后esc :wq保存并退出
接着执行 source 你的profile路径 例如:source /etc/profile 即可使配置见效,验证:输入mysqlbinlog出现如下图所示即为配置乐成!
https://i-blog.csdnimg.cn/direct/6e0bcaa3c08c450d823a779f8c8ecdc1.png
第二步:数据安全



[*]备份刚刚规复的数据,然后卸载mysql,重新安装,由于我们不清楚黑客入侵后是否植入了病毒或其他脚本,为他再次攻击提供便利,以是 为了安全起见和避免一些不须要的贫困,我们卸载msyql,以免夜长梦多。
[*]修改mysql数据的用户名和密码,密码发起英文大小写加数字加特别符号,不要用纯数字。这样容易被黑客通过端口扫描工具获取端口并暴力破解。
[*]将远程连接授权关闭。即将msyql配置文件中的bind-address=0.0.0.0改为127.0.0.1或者其他地址,然后将user表中的host 的%改为localhost,这样我们就关闭了远程连接。这样我们的端口不至于袒露在公网上被端口扫描工具扫到。
[*]开启防火墙: sudo systemctl start firewalld启动 firewalld 服务。sudo systemctl enable firewalld 设置开机自启动。
然后通过放行端口的方式将需要开放的端口开放,开放指令:例如开放80端口sudo firewall-cmd --permanent --add-port=80/tcp
重新加载配置sudo firewall-cmd --reload,检察确认规则已添加 sudo firewall-cmd --list-all如下图所示即为你开放的端口https://i-blog.csdnimg.cn/direct/484c01937ce046dd9f89252bb628b61a.png
[*]将服务器中不需要用到的端口号关闭,只开需要用到的端口号,这样通过防火墙和服务器的安全组双重防护,我们的数据安全又多了一份保障
第三步:解决远程连接



[*]我们虽然关闭了远程连接,但是我们可以通过本地跟远程服务器创建起一个隧道,通过隧道举行远程连接
配置隧道



[*]下载隧道配置工具putty,下载地址putty
https://i-blog.csdnimg.cn/direct/89995d7b8acc44899c3c41aca20af9dc.png
https://i-blog.csdnimg.cn/direct/b6b854fec8a649f6b34fc0a22e23ab72.png
[*]下载好了之后我们打开putty配置
https://i-blog.csdnimg.cn/direct/8ac54e5afe1b476e8374a8595dff2edd.png
https://i-blog.csdnimg.cn/direct/7b0e75a822c54564813be80ceb63defa.png
留意!这里是填localhost:远端端口 ,例如我的远端mysql是13309,这里配置就是localhost:13309,而不是服务器ip:13309,
source port 填本地端口,恣意填,这里我填3307.解释一下为啥这里是loaclhost,这里的localhost并不是我们以为的localhost(127.0.0.1)而是远端的ip地址,putty隧道会默认将destination中的localhost解析为远端服务器ip地址。别的强调一点,source port 不要用3306由于大概你本地有数据库而且端口为3306那么就会连接到你本地的mysql。以是发起配置除了3306以外的其他端口,避免和本地mysql冲突。隧道买通之后我们就可以用任何数据库用户连接数据库了。
[*]做好以上配置后需要回到session中保存配置,给这个配置取个名,即填写Saved Sessions这里我叫msql,保存后我们就不消每次要连接都要配置一下,直接双击我们配置好的名称即可连接远端如下图所示:
[*]https://i-blog.csdnimg.cn/direct/77fbd27fc838451dace3531055c01948.png
[*]https://i-blog.csdnimg.cn/direct/3e49690fe8224f85a13641a649177547.png
-双击或者点击Open举行连接,第一次连接会有这个弹框点击accept就可以了以后不会再弹框。如下图所示
https://i-blog.csdnimg.cn/direct/ddb33877055c4b358e8a53a95c96b3be.png
[*]登录服务器 填写服务器的用户名和密码,用户名一样平常为root,如下图所示
https://i-blog.csdnimg.cn/direct/e447bbbc60e74689a428ce5ff53880d9.png
https://i-blog.csdnimg.cn/direct/0954de0d31b14ee7b62c723d199b99fc.png
[*]登录好之之后接着用navicat测试连接如下图所示
https://i-blog.csdnimg.cn/direct/d231a5428039466c8e6946f122ed3452.png
https://i-blog.csdnimg.cn/direct/0481375cbf164ee8af8c2f90e55e03b7.png
[*]到此我们实现了远端连接,避免了将端口号袒露在公网上,给黑客有可乘之机。
数据备份



[*]但我们解决好上述题目后,我们还需要做的是做好数据备份,定期备份,最好是有全量和增量的定期备份开启定时任务每天备份到安全的地方,这样我们可以自己多一份保障,并不是任何时候都能通过binlog规复数据的,以是只要我们能够想到的办法都要用上,不给黑客一点攻击的大概。
[*]以下是我备份的示例
[*]创建一个工具类
public class MysqlBackupUtil {
    public static void backupData(String host, int port, String username, String password, String database,
                                  String backupDirectoryPath) throws IOException {

      String command = String.format("mysqldump -h %s -P %d -u %s -p%s %s -r %s", host, port, username, password,
                database, backupDirectoryPath);
      Process process = Runtime.getRuntime().exec(command);
      int exitCode;
      try {
            exitCode = process.waitFor();
      } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new IOException("备份过程被中断", e);
      }

      if (exitCode != 0) {
            throw new IOException("备份 MySQL 数据失败");
      }
    }

    public static void backupTableData(String host, int port, String username, String password, String database,
                                       String backupDirectoryPath,String tables ) throws IOException {

      String command = String.format("mysqldump -h %s -P %d -u %s -p%s %s -r %s %s", host, port, username, password,
                database, backupDirectoryPath,tables);
      Process process = Runtime.getRuntime().exec(command);
      int exitCode;
      try {
            exitCode = process.waitFor();
      } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new IOException("备份过程被中断", e);
      }

      if (exitCode != 0) {
            throw new IOException("备份 MySQL 数据失败");
      }
    }
}
数据库备份的定时任务实现方法
public void MysqlBackupTask(String host,Integer port,String username, String password,String database,String backupDirectoryPath)
    {
      try {
            MysqlBackupUtil.backupData(host, port, username, password, database, backupDirectoryPath);
            try {
                uploadFile(backupDirectoryPath);
                deleteTableFile(backupDirectoryPath,-2);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
      } catch (IOException e) {
            throw new RuntimeException(e);
      }

    }

    public void MysqlBackupTableTask(String host,Integer port,String username,String password,String database, String backupDirectoryPath,String tables)
    {
      try {
            MysqlBackupUtil.backupTableData(host, port, username, password, database, backupDirectoryPath,tables);
            try {
                uploadFile(backupDirectoryPath);
                deleteTableFile(backupDirectoryPath,-1);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
      } catch (Exception e) {
            throw new RuntimeException(e);
      }

    }
    public void uploadFile(String backupDirectoryPath) throws Exception {
      String endpoint ="服务器endpoint";// 例如:http://oss-cn-hangzhou.aliyuncs.com
      String accessKeyId = "这里填你自己的服务器accessKeyId";
      String accessKeySecret ="这里填你自己的服务器accessKeySecret";
      String bucketName = "服务器bucket桶名称";
      String objectName = backupDirectoryPath+"/"+ DateUtils.datePath()+"/"+backupDirectoryPath;// 上传到 OSS 后的文件名
      String localFilePath = backupDirectoryPath;// 本地文件路径
      // 创建 OSSClient 实例
      OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
      // 上传文件到服务器oss
      ossClient.putObject(bucketName, objectName, new File(localFilePath));
      // 关闭 OSSClient
      ossClient.shutdown();
    }


[*]获取accessKeyId和accessKeySecret 如下图所示
https://i-blog.csdnimg.cn/direct/1e10ca8bfb234f949e1c4a8898f97ef2.png
[*]接着创建一个bucket桶
https://i-blog.csdnimg.cn/direct/9fb46a1696324fd7a3fe13a2356ae62e.png
https://i-blog.csdnimg.cn/direct/295ef1b58c0d45c4a04fa536ce3871d8.png
https://i-blog.csdnimg.cn/direct/1c98c09ed55d4c26b04c4fd83635bc46.png
[*]填写完以上信息即可完成bucket创建接着实现数据备份
备份的文件是按日期每天一个文件夹举行备份的,您可以自行修改,如图所示
https://i-blog.csdnimg.cn/direct/f69cbf411a82497b82bcc886872f082a.png
[*]每天都有一个sql文件的备份,即使我们的binlog规复不了我们还能通过备份的方式,规复我们的数据,备份规复也更加直接方便快捷,赶紧备份起来吧!!!
https://i-blog.csdnimg.cn/direct/8aa4da58039a4465bc674655f40463f9.png
总结

当我们发现数据库被黑时


[*]第一步:规复数据

[*]binlog 规复
[*]备份文件规复

[*]第二步:做数据安全防护

[*]卸载mysql,重装
[*]修改用户名密码(字母大小写数据加特别符号)
[*]关闭安全组不消的端口号
[*]开启防墙
[*]关闭msyql远程访问授权(修改bind-address=0.0.0.0)
[*]修改mysql用户的host为%的改为localhost或者其他地址。
[*]需要远程连接可以通过隧道的方式举行连接

[*]第三步:数据备份

[*]开启定时任务,定时备份全量和增量数据
[*]开启msyql的binlog日志功能。

最后

假如某一天你也很不幸数据库被黑客攻击了,不要慌,我们起首要做的就是把丧失降到最低,先把数据规复,然后备份数据,在清理环境,做数据安全防护步伐,千万不要点击黑客的连接,对其付款举行规复数据,这不是解决题目的办法,黑客大概还会继续勒索。继续黑你数据库。我们被黑了数据库是不幸的同时也是幸运的,由于他的攻击只会让我们变得更强,最后我想说,让暴风雨来得更剧烈些吧!!!!


[*]关主我不迷路,愁哥带你上高速!
https://i-blog.csdnimg.cn/direct/e8de2f7039504f38bb5ff0562d6b3314.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 终于轮到我了,服务器mysql被黑客攻陷了