前言

最近客户服务器运营商给他发了邮件,说在他的服务器上有恶意脚本执行。邮件内容是服务器被检测到往外发送邮件。立即想到的是,我之前帮他装过收发邮件的 postfix 和 dovecot 软件。难道我安装的软件本身就是恶意软件,它自己没事往外发邮件?看了之前的安装记录 在vps上搭建邮件服务器(linux centos7),当时用的 yum 进行安装的,如果出问题,那么就是 yum 有问题,而这可能性不大。那么就是其他脚本调用了 postfix 往外发的邮件。不讨论发邮件的原因,只想要搞清楚是谁发的邮件,执行了什么脚本。常规检查 ps aux | grep sshd 中发现,出现了多个 sshd 进程。

正常的 sshd 进程列表(我打开了两个终端):

sshd 正常账号密码登录进程列表
sshd 正常账号密码登录进程列表

不正常的 sshd 进程列表:

不正常的 sshd 进程列表
不正常的 sshd 进程列表

区别在于登录的用户名和执行指令内容部分。除 sshd 服务和 grep sshd 以外,执行指令主要是这几种 sshd: root@pts/x (x 表示连接的终端号,多个连接会存在多个终端号)、sshd: root [net]sshd: root [priv]sshd: root [accepted]。第一种就是正常的账号密码登录的情形,后面几种不确定实际意义,但肯定不正常。

解决方案

在 bing 上找到了一个帖子 云服务器出现大量 sshd 进程,网友 besto 提出了以下几种方法:

老生常谈的服务器安全问题,前 2 项是一定要做的,后面选做。

  1. 只允许非 root,非 sudo 用户登陆。
  2. 换端口。
  3. Key 登陆,密码不可登陆。
  4. CHROOT 监狱。
  5. 阿里云这种,平时关闭 ssh/或是封掉 SS 端口,要用的时候打开。
  6. fail2ban

一下豁然开朗。之前处理这种不正常登录的情况,一般采用堵的方法:linux 限制(禁止) IP 通过 ssh 远程登录。通过 tail -f /var/log/secure 监测服务器 ssh 登录记录,如果出现错误账号密码登录,或者授权失败,就将 log 记录中的 ip 地址存放的 /etc/hosts.deny 中。

sshd: 222.186.175.155,27.153.180.239,49.88.112.68,176.9.89.73,157.230.129.73,123.58.33.18,176.159.245.147,23.95.101.206,175.203.106.252,34.93.229.63,103.51.153.235,129.204.58.180,115.159.65.195,5.249.144.206,58.254.132.156,150.109.6.70,222.186.175.202,121.157.82.222,188.131.179.87,222.186.175.169,223.202.201.210,189.123.1.106,117.121.38.113,222.186.173.154,103.228.112.45,159.203.190.189,149.56.97.251,101.71.2.111,222.186.175.150,162.243.158.185,51.38.238.87,45.55.86.19,222.186.175.215,222.186.175.154,

以上指令代表禁止这些地址通过 ssh 访问服务器,直接拦截。拦截成功后(若这些被禁 ip 再次尝试登录时)提示消息:Oct 31 15:25:45 tk2-249-34465 sshd[3327]: refused connect from 157.230.129.73 (157.230.129.73)

但这个方法有个致命的缺陷,就是黑名单需要自己一个一个填写,比较麻烦。

第 1,2 个方法,主要目的就是修改默认的用户名 root 和默认的端口 22,从而使一般的暴力破解失效。为了应对暴力破解,设置的密码应该具有高强度。如果 sshd 进程列表所在的用户都是 root,就需要考虑是当前否是弱密码,考虑已被被暴力破解的可能性。

第 3 个方法,是设置 ssh key。通过配置 RSA 公钥,跳过账号密码登录。

第 4 个方法,叫做 CHROOT 监狱,通过 chroot 机制限制 SSH 用户访问指定目录,这样权限被限制在指定目录内,执行一些敏感操作都需要 su 权限,从而保证了服务器的安全。推荐参考教程:使用 chroot 监狱限制 SSH 用户访问指定目录

第 5 个方法是通过服务器运营商携带的安全组功能,配置准入规则,需要用的时候添加相应端口规则,不需要的时候删除相关规则。可以参考,但如果有需求需要频繁登录服务器,这条就不太实用了。

最后一个方法是使用软件 fail2ban, 将 判定为 SSH 密码爆破或者恶意扫描的 IP 地址添加到防火墙的 SSH 规则链上。fail2ban 由 python 语言开发,需要服务器安装了 iptables,使用时与 iptables 联动生效。推荐参考教程:CentOS7下安装和使用Fail2ban

iptables SSH 规则链:

iptables SSH 规则链
iptables SSH 规则链