开发一个考试系统——数据库被人删了,只好重新来一遍了,今天讲讲如何重新部署数据库并做点防范措施

151 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第32天,点击查看活动详情

昨天没有更新,写文章的时候发现服务器数据库被人攻陷,数据库里面的表也被删除了,还留了个勒索邮件地址,真是让人尴尬。

现在想想以前过情人节,做了个电子礼物给我老婆,为了方便她使用,开了部分端口的全部允许访问还是不太安全的。

这一篇就教大家重新部署下数据库吧。

一、     重新部署数据库

我是阿里云的服务器,服务器管理的界面也是官网的界面。

(一)      重新安装系统

因为怕他们攻破了其他后门,索性换个系统,正好原来的CentOS已经停止维护了,我就不用它了,还是用用最新的Ubuntu吧。

 

在实例控制台中,先停止服务器,在页面中我们找到更换操作系统的位置,这个地方必须电源关闭才能用。

image.png  

一路配置后启动这个服务器。自己电脑的话那就和重新安装系统一样。

(二)      安全组设置

再到安全组设置,去除全部登录的规则,给他调整到自己的ip上。不知道自己ip的可以百度搜索ip,会有跳出来的显示,ip可能会因为运营商的策略不固定,所以可以配置一个网段。

image.png  

修改成功后我们重新进入服务器中

 

(三)      安装docker软件

根据官网操作教程操作。因为不是很重要的项目,所以开发的状态下数据库就隔离在容器里了。大家真实部署的时候千万别放这里面。

docs.docker.com/engine/inst…

第一步删除过去的安装包,20.04版本的Ubuntu我试了下不需要这步骤,大家可以忽略,不放心的也可以运行一下,没这些软件,卸载的话也没啥影响。

sudo apt-get remove docker docker-engine docker.io containerd runc

image.png

我们选择教程中自己对应的操作系统的储存库安装。将这个页面的命令都输入到我们的服务器窗口。

再进入下一个栏目配置我们的用户和开机启动

image.png

 

image.png 后面的命令我就不抄了,怕系统认为我抄袭。

其中增加组的步骤可能是没必要的,我在本地提示已经有这个组了。

(四)      拉取mysql容器镜像

使用 docker pull mysql命令拉取

 

(五)      创建容器

使用下面的命令创建并后台启动容器,并设置了密码

docker run -dit -p 3307:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=sa123456 mysql

-dit设置容器是在后台启动运行,-p设置对应的端口号,前面的是宿主机,也就是本机的端口,后面的是容器内部的端口。

使用docker ps -a命令查看运行状态,显示正常运行状态即可。

image.png

(六)      恢复系统项目数据库

数据没啥数据想要恢复的,但是整个项目的表格还需要额外生成。

在django中运行前先在mysql中创建数据库

再运行 migrate操作即可重新生成表格。

接着createsuperuser可以创建管理员账号,后续可以登录后台。

  image.png

执行命令后启动这个网站服务,并在后台添加我们的数据,即可恢复过来了。

数据库本身并不建议大家部署到容器中,性能瓶颈是一方面。被攻破了数据恢复也比较困难。

二、     设置备份策略

因为被删库了,想来想去应该给自己做个定时备份任务

如果你也像我一样使用容器中的mysql,那么执行docker exec -it mysql1 bash 进入这个容器内部。其中的mysql1是我自己设置的容器名称。

设置数据库每日定时备份进行数据库的维护,主要调用的是mysqldump命令来备份文件。

先编写脚本back.sh,将这一天的数据库备份成文件,并赋予该文件可执行权限a+x:

chmod a+x back.sh

文件内容如下

#!/bin/bash
date_name=$(date +%Y%m%d%H%m)
back_dir="/root/mysql_backup/"
## 判断文件夹是否存在,不存在创建当日文件夹
if [ ! -d "$back_dir" ]; then
        mkdir "$back_dir"
fi
mysqldump -h 127.0.0.1 -p3306 -uroot -psa123456 -B my_test_system> "$back_dir/test_db_$date_name.sql"

这个步骤参考了:MySQL数据库备份脚本:blog.csdn.net/u010192145/…。关键命令中的-B参数即是指定数据库的库名。

  

再配置定时任务,如果系统没有定时任务工具,安装crontab:

apt-get install cron

使用crontab -e编写定时任务保存退出,设置为每日0点0分保存上一日的数据:

0 0 * * * /bin/bash /root/back.sh 后面的/root/back.sh是脚本文件的位置,中间的/bin/bash是执行脚本的软件,前面的是定时任务的格式。

一开始可以设置的定时早一些,方便测试能不能完成这个操作。

此时这些文件是在容器里,如果你想把这个文件备份到宿主机上,可以执行容器的拷贝文件命令。类似:

docker cp mysql1:/root/mysql_backup/file.sql /opt/mysql_backup

mysql1是容器的名称,他名称冒号后面的是文件在容器内部的地址,接着的空格后面的是宿主机上的文件夹地址。 docker cp与普通cp本身没太大区别,只是容器会有个冒号在中间。 反过来复制和容器间复制也是一样的。

此时可以在宿主机创建定时任务,执行复制文件的操作即可,时间就可以放的晚于备份时间一段。

经过此次处理,让我对网络安全更为看重了。

希望大家不要像我一样粗心。