当你作为一个独立开发者的时候总要面临这样那样的问题,以前认为的小概率事件也总是某个时间点蜂拥而至考验你的耐心,前一阵阵刚刚经历了一次木马惊魂 (参见文章猎豹清理大师值得我们信任么? ),这次又遇到了服务器被黑。
部署服务器及一般的服务配置管理对于一个写代码的人自然不在话下,但是相对专业的运维人员程序员确少的却是一个安全意识,总以为服务器被攻击是一个小概率的事件。以前是这么考虑的“互联网上的主机那么多偏偏你的主机被骇客盯上? 这不跟重大奖一样么,我有那么幸运么?”虽然前一段时间自己的产品被当成木马已经是中了一次大奖了。所以心存侥幸心理,能省事就省事,先把服务部署起来能用就行,这也倒是符合我的极简主义行事风格。只有经历才能成长,这句话说的一点没错,感谢这个不太聪明的骇客给我上了一课,从此在做任何服务器部署和管理的时候我的脑袋里也多了一根弦儿“安全意识"。 事情是这样的 。。。
前几日像往常一样,访问我的产品网站 http://xbrowser.me , 突然页面出现了404页面未找到。奇怪,怎么会这样?我有检查了一下输入的域名,没错确实是自己的网站。这时我心理突然一惊,倒吸一口冷气,莫非是因为前几天发布了一篇文章纪念我要废弃的产品功能这么快就被GFW注意到了? 给我来了一个DNS劫持? 为了验证这一想法我马上打开了电脑的VPN程序,通过VPN再次访问我的网站(这样可以避免GFW的DNS劫持) 。网页呈现出来的依然是“404页面未找到”,这说明不是DNS劫持的问题,GFW并没有注意到我。这时候我不知道是喜还是忧,但是这究竟是什么原因造成的呢?为了查找真相我立刻登录了自己的服务器。
首先我进入到了webserver根目录查看,果然看到网站文件被删掉了。还好我的程序有备份,这点损失我还是能够承受的,关键骇客的意图是什么呢?篡改主页?没有道理啊,对于我这个一没有知名度二没有影响力的小站点没有意义啊。好吧,不猜测原因了,这个哥们动作那么大我反而要庆幸,否则就凭我那点儿安全意识被当成肉鸡肯定毫无察觉。这时候我赶紧看看都有谁登录了服务器
$ last | more
chengkai pts/0 111.199.208.96 Mon May 18 14:41 still logged in
chengkai pts/4 192.154.200.61 Mon May 18 12:39 still logged in
chengkai pts/4 111.199.208.96 Sun May 10 02:40 - 14:39 (1+11:59)
chengkai pts/4 111.199.208.96 Sat May 9 14:02 - 14:03 (00:00)
chengkai pts/9 111.199.208.96 Sat May 9 00:15 - 02:31 (02:15)
从日志上看,都是我自己的用户名,但是很明显有一个不一样的IP地址来源,我赶紧查了一下ip地址来源, 处理了北京网通的IP另外一个不同的IP来着台湾。很显然骇客已经攻破了我的root密码然后为了掩人耳目使用我的用户名进行线上操作,但是更让人惊愕的是此时这哥们竟然正在线上。
chengkai pts/4 192.154.200.61 Mon May 18 12:39 still logged in
尼玛这真是大姑娘出嫁头一遭啊,这是要现场对决啊。第一闪念我要先把这下家伙给踢下去,可是又一想不行,这家伙已经拿到了我的root权限,被我踢下去很可能会气急败坏的重新登录破坏系统,还是先修改root密码及看看有没有留下什么后门再说,先看看对方有没有启动什么特殊的服务进程。
$ netstat -nl
80、22、1723 这些端口是我知道的webserver,ssh和vpn。剩下的几个大端口号尤其值得怀疑.
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:48988 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:52732 0.0.0.0:* LISTEN
那么接下来我用"lsof" 命令来看看这几个大的端口号是什么进程启动的?
lsof -i :48988
ruby 13727 chengkai 9u IPv4 98307068 0t0 TCP localhost:58185 (LISTEN)
lsof -i :52732
ruby 18258 chengkai 9u IPv4 97802878 0t0 TCP localhost:52732 (LISTEN)
还好都是ruby进程,我猜想应该是passenger 转发http请求到rails的监听端口,为了证明我的猜想我停掉了nginx服务,果然ruby进程占用的端口号没有了。
排除了骇客监听端口的嫌疑后,接下来看看会不会拿我的服务器当"肉鸡"使用,检测这一问题的最好办法就是查看外面的流量出口,这时候我想到了iftop命令。
$ sudo iftop -np
195kb 391kb 586kb 781kb 977kb
└──────────────────────────────────┴───────────────────────────────────┴──────────────────────────────────┴───────────────────────────────────┴───────────────────────────────────
96.126.127.11:7000 => 101.219.21.98:50726 30.1kb 6.03kb 1.51kb
<= 1.12kb 230b 57b
96.126.127.11:ssh => 111.199.216.183:63446 5.09kb 5.91kb 6.13kb
<= 416b 291b 250b
96.126.127.11:7000 => 101.219.21.98:54488 25.3kb 5.06kb 1.27kb
<= 1.12kb 230b 58b
96.126.127.11:7000 => 101.219.21.98:36312 24.3kb 4.87kb 1.22kb
<= 1.12kb 230b 58b
96.126.127.11:ssh => 222.186.21.250:56628 5.20kb 2.61kb 668b
<= 3.14kb 1.44kb 368b
96.126.127.11 => 187.184.246.118 8.39kb 3.65kb 3.65kb
<= 0b 0b 0b
96.126.127.11:7000 => 101.219.21.98:34993 15.8kb 3.17kb 811b
<= 1.13kb 231b 58b
96.126.127.11:7000 => 103.254.203.177:58825 8.54kb 1.71kb 437b
在这里面,并没有发现什么异常的流量和往外的出口连接,又进行了一些常规检查,也没有发现特别异常的问题。
# 查看有无异常进程
$ ps aux
......
# 查看系统资源占用有无异常
$ top
......
# 有没有新增异常用户
$ cat /etc/passwd
......
#查看了root用户的命令历史记录,当然这个对稍有经验家伙是没有意义的,拿到了root权限后可以清理任何痕迹
# history
......
我知道接下来需呀做的两件事情,修改root及我当前用户的用户名密码及把入侵者踢下去。在修改了服务器的密码后,我在终端上输入了下面两个命令.
$ write chengkai pts/4
what are you fucking about
#结束消息
ctrl+d
# 踢掉在线终端
$ pkill -kill -t pts/4
第一个命令是向入侵者发送一条信息“what are you fucking about”,而第二条命令紧接着把入侵者踢了下去。这时候不免有了一丝满足感,可以想象对方收到消息并被我踢下终端时的表情,当然我想他可能不会这么容易善罢甘休。(其实我知道这种挑衅是蛮危险的,对方曾经拿到了root用户权限,如果在某个地方设置了一些后门会非常难以发现,系统很容易会被再次攻破)。 我打开了认证日志静静等待对方的再次破解登录,果然对方很快就来了,而且是发动了不同的主机进行ssh暴力破解。
$ sudo tail -f /var/log/auth.log
Received disconnect from 222.186.21.243: 11: [preauth]
May 18 14:36:52 localhost sshd[16428]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243 user=root
May 18 14:36:54 localhost sshd[16432]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243 user=root
May 18 14:36:56 localhost sshd[16432]: Failed password for root from 222.186.21.243 port 56722 ssh2
May 18 14:37:01 localhost sshd[16432]: message repeated 2 times: [ Failed password for root from 222.186.21.243 port 56722 ssh2]
May 18 14:37:01 localhost sshd[16432]: Received disconnect from 222.186.21.243: 11: [preauth]
May 18 14:37:01 localhost sshd[16432]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243 user=root
May 18 14:37:03 localhost sshd[16438]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.243 user=root
May 18 14:37:05 localhost sshd[16438]: Failed password for root from 222.186.21.243 port 45780 ssh2
May 18 14::42:26 localhost sshd[18573]: Received disconnect from 222.186.21.244: 11: [preauth]
May 18 14::42:26 localhost sshd[18573]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244 user=root
May 18 14::42:29 localhost sshd[18579]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244 user=root
May 18 14::42:30 localhost sshd[18579]: Failed password for root from 222.186.21.244 port 38062 ssh2
May 18 14::42:35 localhost sshd[18579]: message repeated 2 times: [ Failed password for root from 222.186.21.244 port 38062 ssh2]
May 18 14::42:35 localhost sshd[18579]: Received disconnect from 222.186.21.244: 11: [preauth]
May 18 14::42:35 localhost sshd[18579]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244 user=root
May 18 14::42:39 localhost sshd[18585]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=222.186.21.244 user=root
May 18 14::42:41 localhost sshd[18585]: Failed password for root from 222.186.21.244 port 50864 ssh2
May 18 14::42:47 localhost sshd[18585]
某种意义上来讲这是好事,因为这说明对方并还没有来得及安置后门程序,只能采取暴力破解的方式。那么接下来我要做的事情就是把对方IP加入到 "hosts.deny"
$ sudo vi /etc/hosts.deny
ALL:110.164.67.47
ALL:222.89.166.12
ALL:221.229.166.30
ALL:58.218.205.69
ALL:58.218.204.239
ALL:58.218.211.155
ALL:222.186.21.236
ALL:58.218.204.225
ALL:58.218.204.241
.......
由于暴力破解骇客首先会尝试root 用户,所以还要禁止root ssh登录,修改sshd_conf文件。
$ sudo vi /etc/ssh/sshd_config
#把PermitRootLogin 属性 yes 改为 no
PermitRootLogin no
到此,我能想到的检测及阻止对方的手段已经差不多了,是时候对一个最起码的安全意识做个总结了。
- 设置用户名密码一定要大小写字母数字及一些特殊符号的组合,增加暴力破解的难度,有可能的话可以定期更换密码。
- 禁止ssh root 登录
- 定期维护hosts.deny文件,可以选择安装一些第三方的工具自动根据一些规则维护hosts.deny 比如 "DenyHosts"
- 为了避免骇客扫描已知服务器程序端口漏洞,修改服务程序的默认端口好,比如ssh服务不使用22端口
- 设置 iptables 开启一些通用的防火墙规则,ubuntu系统可以使用 ufw
以下为一些网友建议及补充:
- 禁止密码登陆,同样修改 sshd_config 设置属性“PasswordAuthentication no” ,然后公钥和私钥的方式进行登陆。
- 使用fail2ban ,fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是调用防火墙屏蔽),如:当有人在试探你的SSH、SMTP、FTP密码,只要达到你预设的次数,fail2ban就会调用防火墙屏蔽这个IP,而且可以发送e-mail通知系统管理员,是一款很实用、很强大的软件!
还好这次事件也没有给我造成太大的影响和损失,反而让我加强了一些安全意识,对于菜鸟级的骇客还是能够抵挡一阵子的。欢迎跟帖讨论,你了解的一些入侵监测手段和防范方法,谢谢。
相关推荐
在面对“Linux服务器被黑怎么办”的问题时,首先要理解的是,即使采取了所有必要的安全措施,如安装补丁、设置防火墙和入侵检测系统,如果疏忽了日常维护,仍然可能遭受攻击。黑客通常利用root kit来获取服务器的...
在网络安全管理中,保护系统日志的安全至关重要,因为日志相当于系统的"黑匣子",记录了系统运行过程中的各种事件。对于Linux系统来说,日志文件以明文形式存在,使得其容易遭受攻击,如被篡改或删除,这将严重影响...
6. **设备驱动开发**:讲解如何编写和调试设备驱动,以便让Linux系统识别和控制硬件设备。 7. **实时性与嵌入式性能优化**:讨论如何在Linux环境下实现硬实时性和性能优化,这对于资源受限的嵌入式系统尤其重要。 ...
在IT领域,代理服务器是一种重要的网络工具,它作为客户端与目标服务器之间的中介,可以实现数据转发、访问控制、隐私保护等功能。在这个主题中,我们将深入探讨"简单的代理服务器",特别是针对Linux系统的实现。 ...
"实现远程控制linux系统和实现linux系统文件共享" 远程控制Linux系统和实现Linux系统文件共享是非常重要的主题,尤其是在企业或个人需要远程访问和管理Linux系统时。在这种情况下,需要一种安全可靠的远程控制方式...
在IT领域,Linux服务器的配置和管理是一项至关重要的技能,尤其对于系统管理员和技术专家来说。本次实验涵盖了多种关键服务的配置,包括DHCP、DNS、FTP、Samba、Apache以及邮件服务器,这些服务构成了现代网络基础...
描述中提到,“用java写的远程控制电脑的服务器端”,这表明这个项目是基于Java编程语言开发的,Java因其跨平台特性,使得这个服务器可以在多种操作系统上运行,如Windows、Linux或Mac OS。"解压后双击startup.bat就...
中国科技大学利用BGP协议配合IP黑名单技术,有效拦截不良IP,同时计划利用Linux的版本控制系统,如Git,来追踪和管理服务器上的网页文件,以便及时发现和修复被恶意篡改的行为。 其次,中国农业大学强调了服务器...
搭建Linux FTP服务器是一个常见的任务,...总的来说,搭建Linux FTP服务器需要理解并配置vsftpd的相关参数,以满足安全性、用户访问控制和日志记录等需求。正确配置FTP服务器可以为用户提供安全、高效的文件传输环境。
为了保证数据的安全性,Linux提供了权限控制机制和加密选项,可以限制对敏感数据的访问,防止未授权的修改或窃取。同时,通过设置日志记录和审计功能,可以追踪系统活动,增强系统的可审计性。 在实际应用中,文章...
在深入探讨Linux FTP服务搭建的过程中,我们将会详细解析如何在Linux环境下配置并运行FTP(File Transfer Protocol)服务器,尤其适合初学者。FTP是一种用于在网络上进行文件传输的标准协议,广泛应用于互联网上的...
云环境下 Linux 视窗协议研究和实现是指在云计算时代,桌面虚拟化技术的发展和应用,通过将用户的桌面操作系统集中运行在服务器端,使用虚拟化技术,在一台物理服务器上同时运行多个桌面操作系统;用户使用个人瘦...
【在Linux下搭建FTP服务器】 在Linux系统中,搭建FTP服务器通常选择使用vsftpd(Very Secure FTP Daemon)。这是一个广泛使用的FTP服务器软件,因为它提供了高度的安全性和灵活性。以下是在Linux系统中安装和配置...
为了确保数据存储的可靠性和性能,Linux系统引入了多路径技术,这是一种能够实现对同一物理存储设备的多个独立路径访问的技术。通过多路径技术,即使某个路径发生故障,系统仍能通过其他路径继续访问数据,从而提高...
压缩包内的文件“linuxServer_vcClient”可能包含两个部分:Linux服务器端的源代码和WinXP客户端的源代码。服务器端代码可能使用C或C++编写,利用了Linux的套接字API。客户端代码可能是用Visual C++开发的,因为...
通过以上知识点的学习和实践,开发者将能够构建一个可靠的Linux服务器黑名单管理系统,利用C语言API与数据库交互,以及进行有效的TCP/IP通信。这个过程涵盖了系统配置、数据库操作、网络编程等多个层面,对提升IT...
在Linux中,文件不仅仅是文本和二进制数据的容器,还可以代表设备、网络套接字等抽象概念。掌握open(), close(), read(), write()等函数以及chmod()和chown()等改变文件属性的函数,是成为熟练Linux程序员的基础。 ...
在Linux中,通过套接字我们可以建立客户端和服务器之间的连接,传输数据。这涉及到TCP/IP协议族,包括TCP(传输控制协议)用于确保数据的可靠传输,以及UDP(用户数据报协议)用于快速但不可靠的数据交换。 "linux ...
- **UCE控制**: Postfix提供了丰富的UCE(非请求商业邮件)控制机制,如黑名单、RBL查询以及HELO/发送者DNS验证等,有效防止垃圾邮件的泛滥。 #### Postfix体系结构及其与Sendmail的比较 - **体系结构**: Postfix...
通过在Linux系统中部署Squid代理服务器并结合SquidGuard实现互联网过滤功能,可以有效地管理和控制校园网内的网络资源访问。这种方案不仅能够提高网络安全性,还能增强网络管理的灵活性,为用户提供更加安全可靠的...