系统环境
- cento7
故障现象
这几天同事找到我,说服务器好像被挂马了,让我去检查一下
ssh到服务器之后,输入lastb命令看了一下,出来出来一大堆的ip正在尝试破解服务器的密码
完全没有运维的服务器,是多么的脆弱,为了避免被对方用字典暴力破解了服务器
那么接下来就要对服务器的安全性进行加强了
解决过程
因为字典暴力破解都是猜用户名,然后用生成好的字典不断的对服务器进行尝试,然后获得shell权限
而且linux大多数服务器都有root用户,所以root用户的尝试次数必定是最多的,
为了增加对方的攻击成本,那么我们首先要做这样设置
- 创建普通用户
-
设置普通用户的sudoer权限
- 禁止root账户远程ssh登录
用普通用户来远程登录,并且sudo已经可以解决大多数问题了,实在需要root来执行某些任务的时候,再使用su root来切换到root执行,这样做的话,对方就需要猜测用户名,然后再猜测密码,攻击难度瞬间就提升了一大截
- 创建普通用户并设置密码
useradd someuser && passwd someuser
- 设置sudoer权限
打开/etc/sudoers
chmod u+w /etc/sudoers
vim /etc/sudoers
找到root ALL=(ALL) ALL 然后加上新创建的普通用户
root ALL=(ALL) ALL
someuser ALL=(ALL) ALL
- 禁止root账户远程登录
打开ssh的配置文件 /etc/ssh/sshd_config
vim /etc/ssh/sshd_config
找到 PermitRootLogin改成no,如果没有找到 那么添加一行
PermitRootLogin no
接着重启sshd服务
/bin/systemctl restart sshd.service
如果不是centos服务器,使用的命令一般是service sshd restart
这样做就提高了很大的安全性了,但是这只是一个简单的隐藏而已,并不能真正的解决根本性的问题,只要给对方时间,猜测到账户和密码还是有可能的,为了一劳永逸,我们还需要把这些恶意的ip全都封掉,但是手动封肯定是不现实的,所以我们需要一个自动化的脚本,这个脚本的作用如下
检测10分钟内,尝试失败登录次数超过5次的ip,然后使用iptables把这些ip地址全都禁掉,然后把这个脚本设置为每十分钟执行一次 就可以自动的封禁这些ip了,至于这个脚本怎么写就很随意了,你可以用php python bash等任何一种脚本语言来实现这个过程,这里是我用bash写的一个简单的例子
#!/bin/bash
now=`date +'%H%M'`
start=`date +'%H%M' -d '-10min'`
lines=100000
iptables=/sbin/iptables
blacklist=./blacklist
limitnum=5
ipList=`lastb | head -n ${lines} | awk '{ gsub(/:/,"",$7); if($7>='${start}' && $7<='${now}') { tmpData[$3]++} } END{ for(i in tmpData){if(tmpData[i]>=7){print i}} }'`
if [ ! -f ${blacklist} ];then
echo "" > ${blacklist}
fi
for ip in ${ipList};do
if [ `cat ${blacklist} | grep ${ip} | wc -l` -eq 0 ];then
echo ${ip} >> ${blacklist}
${iptables} -D INPUT -s ${ip} -p tcp --dport 22 -j DROP
fi
done
尾语
我发现很多公司基本都不注重linux服务器的安全性,我大概看了一下攻击我方服务器的大部分ip,基本上都是别人的肉鸡,而且都是自动化批量式的扫描。像这种扫描,一旦你的服务器被命中并且破解成功,就变成一台新的肉鸡了,然后就会继续去感染其他的机器,如此这样反复的感染下去,最后被感染的机器就越来越多,整个网络里都充满了无用的数据包。所以为了整个网络环境的安全性,我希望所有使用linux服务器的人,都应该掌握一点点基本的linux的防范,不要让自己珍爱的服务器变成了其他人手中的武器。