龙空技术网

愤怒,mysql被疯狂攻击,我做了这几件事!

Java机械师 1047

前言:

当前姐妹们对“mysql事件100”大体比较讲究,各位老铁们都想要剖析一些“mysql事件100”的相关文章。那么小编也在网上网罗了一些对于“mysql事件100””的相关内容,希望小伙伴们能喜欢,各位老铁们快快来了解一下吧!

mysql被疯狂攻击描述问题系统登录不上,因为数据库的原因分析问题mysql数据库被攻击了思考如何解决问题启动mysql,并改密码修改mysql默认端口mysql不对外连接开启防火墙环境数据库:Mysql服务器:Mysql数据库是在Docker中运行一、描述问题

系统登录不上,首先先看一下f12调试工具,发现登录接口返回“登录失败”。

得知,node后端服务并没有挂,因为接口可正常返回信息,那么登录失败有两种情况:

❌ node服务本身出现bug,但之前登录一直用得好好的,可排除。✔️ node服务连接的mysql数据库出现异常,导致登录失败。二、分析问题

于是,我们前往服务器查看node服务,究竟是什么情况?

果然,是mysql数据库出现异常。

用navicat连接一下mysql,发现也连接不上。

我们赶紧查看mysql日志。

mysql数据库被攻击了,好小子,还用不同ip来攻击。

我成功不用写文章了,一大早来解决问题,还好我那不到10位用户还没有起床,干活吧!

三、思考如何解决问题?3.1 启动mysql,并改密码

我想第一步,肯定是先让mysql数据库先正常启动,并且修改密码。以此让程序可正常访问。

密码最好包含:大小写字母、数字、特殊字符,长度长点。

3.2 修改mysql默认端口

正常mysql端口都是3306,把默认端口给改了,让别人去猜去,要计算到底是哪个端口,也是需要时间,起码可以增加一点点安全性。

3.3 mysql不对外连接

像我的mysql数据库,都是外网是可以直接用工具可以连接的,但其实这样子很不安全,一般公司是不会直接对外开放数据库,一般都是内网才可连接。

于是我们不对外开放数据库的端口。

那问题来了,我想查数据,怎么查?

‍♂️ 你可以在服务器上查数据呀,但我想说,太麻烦了,而且可视化效果很不友好。

那怎么办呢?

这个时候,“隧道”就派上用场了。

相信大家看了图片,应该不难猜到“隧道”的作用。

上面我们说把数据库对应的端口不对外开放,但面临一个问题,我们自己想通过navicat连接查数据,就用隧道的方式,用我本地的端口去映射服务器的端口,这样子我们自己的电脑就可以连接服务器里任意端口服务。

如上图,服务器3306端口和我本地的3305端口做映射,这样子,我在navicat用localhost的3305连接,实则是访问我服务器的3306端口。

还不错吧,今天又✔️GET到一个技能点了吧。

这招下去,有心人想搞你,又多了一层防护安全罩,别人就算在厉害能拿到你的密码,也无法远程连接你的数据库了,更别想疯狂攻击你的数据库了,因为他,根本连接不了。

魔高一尺,道高一丈。

四、开启防火墙

曾想起,公司的防火墙也一直都是关闭状态的。这可是比较危险的事情。但因为公司做了内网才可连接服务器、服务,那防火墙开不开倒是无所谓了。

那我们的,可基本都是外网的,所以建议还是开启防火墙,毕竟又多了一层安全保护罩。

友情提示:

以下对没接触的朋友,可能理解起来稍微费劲一点,因为用到Linux和Docker,所以稍微复杂一丢丢,小泽已经很大白话给大家讲解了,先大概看下去,把流程走通,再理解。

建议先收藏,以后用到,想必就很自然的理解了。

看到这里的朋友,本身就很棒棒啦!

4.1 Linux开启防火墙

查看防火墙状态:

systemctl status firewalld复制代码

inactive表示防火墙为关闭状态。

开启防火墙:

systemctl start firewalld复制代码

启动后无任何提示,再次查看防火墙状态,可以看到变成active,成功启动。

关闭防火墙:

systemctl stop firewalld复制代码

关闭防火墙也无提示,查看状态变成inactive表示成功关闭。

4.2 重启防火墙

我们的防火墙已经成功开启。

防火墙开启之后,需要重启防火墙才可生效。

我们对指定端口服务进行开启防火墙。

添加:

# --permanent永久生效,没有此参数重启后失效firewall-cmd --zone=public --add-port=80/tcp --permanent    复制代码

查看:

firewall-cmd --zone=public --query-port=80/tcp复制代码

删除:

firewall-cmd --zone=public --remove-port=80/tcp --permanent复制代码

重新载入:

firewall-cmd --reload复制代码

同理,我们服务上需要开放的端口,都添加进去哦。

firewall-cmd --zone=public --add-port=3306/tcp --permanent8088808790529000...复制代码

切记:需重新载入才可生效哦~

4.3 docker容器与linux建立连接失败

现在,我们的数据库已经开启防火墙了,来连接一下测试一下。

Node服务,连接不上mysql了。

4.3.1 Docker容器与目标主机之间因为防火墙的阻拦不能建立连接

于是百度了一下报错,说是:Docker容器与目标主机之间因为防火墙的阻拦不能建立连接。

我的mysql是运行在docker上的,所以我们要先让docker容器与linux建立连接。

配置 docker 容器内允许访问外部网络(需重启 firewalld、docker 以生效)

firewall-cmd --permanent --zone=trusted --change-interface=docker0复制代码

但运行该语句后,docker容器内无法重启。

4.3.2 centos 中,启用了 firewalld 防火墙,docker 内的容器无法访问外网

docker服务'启动之后'会自动在'防火墙中添加一些规则',但是'防火墙重启之后'经常会导致docker容器重启失败,需要在'重启下docker 服务'就好了。

❌ 关闭防火墙(就是为了开启防火墙,才有这么多故事,现在让我关了???)✔️ 将firewalld换成iptables

我们docker重启用的是firewalld,结果导致docker重启失败,于是我们换做iptables来。

安装iptables-services服务:

#此处可以使用 yum install -y  iptables-s* 来查询以“iptables-s”开头的安装包yum install iptables-services  复制代码

查询是否安装成功

yum list installed | grep iptables*复制代码

确认这两个安装包均已成功安装。

启动iptables服务并设置开机自启。

systemctl start iptables && systemctl enable iptables复制代码

查看状态

重新启动服务器,检查设置开机自启是否生效

service iptables status复制代码
4.3.3 linux中用iptables开启指定端口

centos默认开启的端口只有22端口,专供于SSH服务,其他端口都需要自行开启。

修改/etc/sysconfig/iptables文件,增加如下一行:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 10000 -j ACCEPT  -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10000 -j ACCEPT复制代码

重启 iptables

service iptables restart复制代码

重启防火墙,这里有两种方式重启防火墙

service iptables start复制代码

或者用menu-system-administration-firewall ,去添加用户需要的端口。

netstat -tanp 去显示端口状态

/usr/sbin/lsof -i 复制代码
telnet ipaddr port
to check if ip and port is available before making connection. 复制代码

LINUX通过下面的命令可以开启允许对外访问的网络端口:

/sbin/iptables -I INPUT -p tcp --dport 8000 -j ACCEPT #开启8000端口/etc/rc.d/init.d/iptables save #保存配置/etc/rc.d/init.d/iptables restart #重启服务/etc/init.d/iptables status # 查看端口是否已经开放 复制代码

Linux中如何开启8080端口供外界访问。

修改文件/etc/sysconfig/iptables

[root@bogon ~]# cd /etc/sysconfig[root@bogon sysconfig]# vi iptables复制代码

文件内容如下,倒数第三行是新加的,目的是对外界开放8080端口

这行文字实际是从上一行拷贝修改而来,在VI中拷贝一行用yy,拷贝多行用yyn,粘贴用p。

将iptables服务重启

如若不想修改iptables表,可以直接输入下面命令:

# linux iptables开放端口命令iptables -I INPUT -p tcp --dport 8080 -j ACCEPT  复制代码

这方法在后面,经常使用!

✔️ 使用之后,重启docker,成功!

4.4 访问linux nginx失败

因为我们使用了iptables开启指定端口,并没有开启linux端口,所以我们要对其他家端口权限。

iptables -A INPUT -p tcp --dport 22 -j ACCEPTiptables -A OUTPUT -p tcp --sport 22 -j ACCEPTservice iptables save复制代码

Linux访问成功了。

接着我们继续对3000端口进行开放。

iptables -A INPUT -p tcp --dport 3000 -j ACCEPTiptables -A OUTPUT -p tcp --sport 3000 -j ACCEPT复制代码

发现外网并不能访问3000端口,怎么回事,上面开放22端口都成功了的呀!步骤一模一样的。

Nginx上的80端口也访问不了,于是想先试一下80端口先开放出来。

iptables -I INPUT -p tcp --dport 80 -j ACCEPT复制代码

80端口成功开放了,也可以访问,神奇的是:3000端口也可访问了。

这就是蝴蝶效应?代码出bug,明天就好了?

我带着侥幸的心理、一脸懵逼的心态继续开放我的服务。

同理啊,像还有前端的nginx、oracle数据库、java服务等等,这些端口也要做下相应的开启防火墙端口。

于是我们继续开放9052。

iptables -A INPUT -p tcp --dport 9052 -j ACCEPTiptables -A OUTPUT -p tcp --sport 9052 -j ACCEPT复制代码

发现开放了,但访问不了,这不就是和3000端口现象一样吗?

为什么3000一开始不行,80开放好了之后,就3000可以了?

细心的我们,想必发现了,因为3000用的是-A,而80是-I(忘记了的朋友,可以往上看看)

遇到drop 后面是不生效的。

所以一开始3000可能是在drop后面,然后80-I插入在前面就改变了他们的排列顺序,所以3000可以访问。

所以我9052用-A,不能访问,是因为他插入在后面的,我用-I就可以访问,插在前面才可以。

记得添加端口后,要save保存一下哦~

4.5 nginx在配置iptables注意问题

通常我们的服务器为了安全,都不会打开太多端口,只要需要的时候,才开放端口。

iptables可以很好解决我们的问题,一般步骤:

先保存我们ssh端口的访问权限,不然会让我们ssh链接不上。

#我们常用的ssh端口是22,大家要根据实际情况处理。iptables -I INPUT -p TCP --dport 22 -j ACCEPT复制代码

Xshell上查看ssh端口方法:

关闭所有端口的访问

iptables -P INPUT DROP复制代码

打开80端口的访问权限

iptables -I INPUT -p TCP --dport 80 -j ACCEPT复制代码

如果ngnix和web服务器是同一台机器,配置规则ip白名单的转发,不然会导致ngnix转发不成功。

# 192.168.3.24就是本机的ip地址iptables -A INPUT -p tcp -s 192.168.3.24 -j ACCEPT  复制代码

这是因为ngnix跟web服务器同一台机器的iptables默认DROP策略导致。

小插话:我用的是centos7,然后iptables是版本6的,而firewalld是版本7的。

后记

还好,今天起得早,赶上我那不到10个用户睡醒之前,把在线音乐可正常访问,让他们能安心听歌是我最大的满足。

经过这件mysql被攻击事件,我学到了程序的安全性一定一定要做好,也让大家放心听歌,只要我还在,这个在线音乐就不会死!!!

共勉:打击我的,只会让我变得更强。

标签: #mysql事件100 #mysql启动异常 #mysql日志太大打不开 #mysql捕捉异常