道路千万条,安全第一条——一次服务器安全处理经过
容器为何自动停止?
服务器为何操作卡顿?
进程的神秘连接到底指向何处?
发现——自动停止的容器
某日发现部署在服务器上的一个容器被停掉了,开始以为是同事误操作停止或删除了。
但登录服务器重新启动容器的时候发现一个奇怪的现象:容器启动后几秒钟便会自动停止。
一般来说这种情况可能是容器本身有问题。
但是查看容器日志并未得到任何错误信息,而且该容器镜像已在其它服务器稳定部署运行,应该不会有bug。
所以猜测是系统资源不足,例如磁盘、内存、CPU。
查看磁盘剩余量还比较多,但是在用top
命令查看CPU和内存的时候发现了异常:某个进程CPU使用率达到了99%。
当然这种情况对于我们公司的服务器来说也不是什么特别惊奇的事,因为我们通常会在服务器上执行一些计算任务,占用大量CPU也是很正常的事情。
但由于这台服务器除了我几乎没有其他同事使用,而且进程命令行看不到,所以引起了我的怀疑。
验证——异常不止一处
挖矿进程身份确认
如此高的CPU使用率,让我想到的是最近流行的挖矿病毒。
通过netstat -anp
命令查看该进程是否建立了外部网络连接。
果然建立一个连接,指向 5.196.26.96 这个IP地址。在 https://www.ipip.net/ip.html 查询一下该IP地址,指向国外某地。
进一步验证了我的猜测。因为国内的服务器有严格的备案管理机制,所以很多***者都会将服务器部署到国外。
为了进一步确认,再次到威胁情报平台进行查询 https://x.threatbook.cn/ip/5.196.26.96 。
平台也给出了威胁警告,可以大胆的推定这就是一个挖矿进程。
当然如果想进一步确认,可以提取执行文件的md5值到相关网站进行辨认。
挖矿程序从哪里来?
挖矿程序一般都是由***下载脚本然后执行,所以用history
命令检查一下下载行为。
没有找到可疑的下载,很可能***清除了操作记录或者是通过别的途径下载。
为了进一步排除可能有其它病毒程序作为守护进程定时启动或者开机启动挖矿进程,检查一下crontab配置信息。
也未找到新添加的可疑文件,所以***应该并没有设置定时任务。
同时也未找到可疑的开机启动项配置。
可疑的镜像与容器
到了这一步,线索中断。只能换个角度思考了~
据管理员说平时这台服务器很少使用,而且使用的是强密码,密码泄露的可能性很小。
再结合我部署的容器停止时间进行分析,应该是在我部署完成后几小时内服务器被***的。
所以怀疑很可能和我的操作有关系。
在使用docker命令进行查找的时候又发现了新的情况。
一些容器使用了未知镜像(heybb/theimg2)或者使用了非官方的镜像(zoolu/ubuntu)。
上docker hub上搜索这些镜像,都找不到Dockerfile,也无readme之类的说明。而且上传时间都很新,但是下载量增长却很快。
这就奇怪了,这种既无说明,命名也十分怪异的镜像竟然会被多次下载,所以可以推断就是***上传的携带***的镜像。
再利用docker inspect
命令查看这些容器,发现该容器并没有通过挂载目录的方式写入系统文件,而是会执行一个 mac.sh 的脚本文件。
用cat
命令查看该文件,只有一行命令
显然这是在挖门罗币。
小结
现在发现不止一个******了服务器,有的***部署了挖矿容器,有的***部署了挖矿进程并删除了记录。
处理——清除进程,关闭漏洞
首要任务当然是清除挖矿进程和容器,以及对应的执行文件和镜像。
当然这只是治标不治本的方法。
要从根本上解决问题需要进行溯源分析,避免服务器再次被***。
结合以上线索以及个人经验分析,很可能利用Docker的漏洞进行***的。
我在部署容器的时候启动 Docker remote API 服务,很可能这个服务暴露到了公网上,立即在浏览器中输入服务器IP地址和对应端口,果然可以访问!
原来服务器运营商并没有提供默认的防火墙服务,机器上的端口是直接暴露在公网上的。
******的途径也基本上可以猜测了,通过 Docker remote API 服务器操作容器,将带有挖矿进程的容器部署到服务器上。
或者将挖矿程序通过目录挂载的方式拷贝到服务器上,以某种方式触发并执行。
要修复这个漏洞也很简单,停止对外暴露服务。
建议
网络安全其实是一个很重要的课题,但是开发人员很多时候都缺乏对其足够重视。
针对这次事件,总结了几个经验:
除了一些 web 服务(http/https),不要使用默认端口。
***的***操作一般都是自动化的、批量的。
操作是使用端口扫描工具,对特定的默认端口扫描。
比如本例中肯定是扫描到本服务器的 2375 端口(2375是Docker remote API的默认端口)之后进行***的。
这个原理其实有点像打电话诈骗,用一些很低级的骗术把容易受骗的人群筛选出来。
所以我们平常在编写程序时尽量避免使用默认端口。
不要通过绑定 0.0.0.0 的方式暴露本不需要对外提供访问的服务。
之前在启动 Docker remote API 服务时监听 0.0.0.0 IP,是因为看到很多网上教程都是如此配置,但其实存在了很大的安全隐患。(把事情做好和把事情做完区别真的很大!)
其实该服务在使用中并不需要提供给外网,实际上只要监听子网IP就够了。比如 127.0.0.1、 172.17.0.1。
尽可能多的考虑非正常情况
在开发的时候我们除了考虑程序正常的输入输出之外,还需要假设一些特殊的情况来进行测试。
下面是开发者和***的思维方式区别:
开发者:A -> 程序 -> B ***:S -> 程序 -> ?
开发者考虑的是保证输入A,就可以得到B。***很多时候会输入开发者未考虑的S,从而发现bug或漏洞。
使用防火墙限制端口访问。
网络服务,防火墙很重要。
这次的***和云服务器厂商都会自带防火墙的思维定势有关系。
通过证书验证访问者的身份。
对于需要提供对外访问的服务,使用身份验证也是一种有效避免***的手段。
例如Docker就支持TLS证书来验证服务端和客户端的身份。
总结
排查******的过程很像扮演一个侦探,通过犯罪现场的蛛丝马迹找到凶手以及行凶手法。
还好当初在发现问题的时候并没有马上采取重装系统这种简单粗暴的方式解决问题,不然漏洞依旧存在,服务器依然会被***。
关于更多更权威网络安全的知识可以参考《OWASP TOP10 2017》,里面有最常见的10类漏洞以及防御措施。
像本文中的Docker远程未授权漏洞以及类似的redis未授权漏洞都属于 OWASP TOP 10 中的漏洞。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
用Go语言异常机制模拟TryCatch异常捕捉
有的同学看到Go和TryCatch一起出现,心里可能会说,难道Go语言升级了,加入了try...catch语句。哈哈,其实Go语言从创建之初就没打算加入try...catch语句,因为创建Go的那帮大爷认为try...catch挺烦人的,如果滥用,会造成程序混乱,所以就不打算加入try...catch(以后加不加入不好说)。 既然Go语言中并没有try...catch语句,那么为何文章标题说要使用TryCatch呢?其实Go语言中只是没有try...catch语句,并不是没有异常处理机制。Go语言中的异常处理机制就是著名的异常三剑客:panic、defer和recover。通过这3个家伙,是完全可以模拟出try...catch语句效果的,对了,后面还应该有个finally。在正式模拟try...catch语句之前,先来回顾下Go语言中的异常处理机制是如何玩的。 Go语言中的异常处理机制 在前面提到,Go语言通过panic、defer和recover来处理异常的,那么这3个东西是什么呢? 不管是什么异常处理机制,核心的原理都是一样的,通常来讲,一个完善的异常处理机制需要由下面3部分组成。...
- 下一篇
CentOS 7.6构建MariaDB MHA高可用集群,实现VIP漂移和邮件告警
一、MHA相关概念及原理: 1、MHA简介: MHA(Master High Availability)是开源的MariaDB高可用解决方案。MHA在监控master节点故障时,会提升其中拥有最新数据的slave节点成为新的master节点。MHA还提供了master节点的在线切换功能,即按需切换master/slave节点。构建MHA的前提条件是要先构建主从复制。MHA集群中的各节点彼此之间均需要基于SSH互信通信,以实现远程控制及数据管理功能。 2、MHA工作原理: MHA的目的在于维持MariaDB主从复制中master节点的高可用性,其最大特点是可以修复多个slave节点之间的差异日志,最终使所有slave节点保持数据一致,然后从中选择一个作为新的master节点,并将其它slave节点指向它。当master节点出现故障时,可以通过对比slave节点之间I/O线程读取master节点二进制日志的position事件位置,选取最接近的slave节点作为备选master节点,其它的slave节点可以通过与备选master节点对比生成差异的中继日志,在备选master节点上应用从原来...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Linux系统CentOS6、CentOS7手动修改IP地址
- Mario游戏-低调大师作品
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Red5直播服务器,属于Java语言的直播服务器
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8