前言:
当前姐妹们对“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捕捉异常