天干物燥,小心火烛;关门关窗,防偷防盗——linux服务器安全

前言

记得以前的年代,临近年底,各种偷盗的事情就会猖獗起来;
现在步入信息化的时代,实物偷盗的确实少了,但网络攻击、网络诈骗也络绎不绝的开始盛行了;
记得哪位专家说过一句话,任何一个行业都可以用信息化的方式重新做一遍,看来真的不假!!!~_^
这不又是年底将近,JAVA界在前几天就曝出一个惊天大漏洞【Log4j 2日志漏洞】,搞得各大行业、公司、产品,只要使用java语言的,都开始自检并出具应对方案,甚至还有已经中招的案例被曝出;
不管怎么样,还是听巡更人的话,万事小心为上。

起源

近期登录服务器,总会看到一些揪心的提示信息:“There were *** failed login attemps since the last successful login”
登录异常提醒
竟然达到111次之多,而且这些还是针对root用户的尝试,如果加上其他用户,估计数不胜数。
btmp行数统计
自月初到目前为止,尝试登录的数量,而且这还是在我已经自动禁用异常IP后的统计数据;
看到这些不法分子有想法的行为,我要努力做好自我保护!接下来就是过程了。。。

过程

1、查到有异常IP尝试破解登录后,就开始分析,能不能把这些IP禁用掉,于是上网搜索相关知识点,然后就了解了firewall-cmd防火墙的IP禁用规则设置。

知识点-防火墙规则

设置某些IP禁止访问服务器的方法:

firewall-cmd --permanent --new-ipset=blacklist --type=hash:ip
# 这是增加防火墙的黑名单文件
firewall-cmd --permanent --ipset=blacklist --add-entry=111.111.111.111
# 这是设置防火墙需要禁用的IP(111.111.111.111)
firewall-cmd --reload

在/etc/firewalld/ipsets/目录下,会看到新生成的blacklist.xml文件,里面包含新增加的禁用IP地址

cat /etc/firewalld/ipsets/blacklist.xml

<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:ip">
  <entry>111.111.111.111</entry>
</ipset>

关键一步:设置防火墙禁用规则

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source ipset="blacklist" drop'
firewall-cmd --reload
# 这一步操作是丢弃在blacklist.xml文件中的IP地址的连接信息

当然如果后期想删除这个规则,可以使用以下命令

firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source ipset="blacklist" drop'
firewall-cmd --reload

如果想删除黑名单blacklist.xml文件,可以通过以下命令:

firewall-cmd --permanent --delete-ipset=blacklist

如果有IP被误加进名单中,想去掉某个IP,可以通过以下命令:

firewall-cmd --permanent --ipset=blacklist --remove-entry=111.111.111.111

当然以上操作完成后,记得reload一下防火墙。

2、知道了防火墙可以设置规则,那异常的IP地址从哪里来呢?

知识点-登录信息日志

在linux系统中,btmp是专门记录登录失败的信息日志文件,具体位置在/var/log/btmp
查看方式有两种:

# 第一种查看方式
lastb
# 第二种查看方式
last -f /var/log/btmp

明显第一种查看简洁多了;
另外补充一下,登录成功的日志记录在wtmp文件中,具体位置在/var/log/wtmp
查看方式同样有两种:

# 第一种查看方式
last
# 第二种查看方式
last -f /var/log/wtmp

通过btmp日志文件就可以查到登录失败的IP信息,在结果的第3列中显示,如下图:
btmp查看结果
3、有了IP,知道如何设置防火墙了,那就做呗!
什么,做呗?怎么做?!
我用眼睛看这些文件?然后再一个一个复制IP,再手动录入blacklist.xml文件中?
开玩笑,怎么可能,不过我之前真干过这事,那时候还年轻。。。

知识点-linux三剑客(grep、sed、awk)

其实这里面只用到其中两把宝剑:grep和awk,另外再加些其他命令;
首先找出异常IP信息:

lastb |awk '{print $3}'

one-step
看到效果了吧,直接把IP信息显示出来了,去掉了其他无用的信息;我们继续往下:

lastb |awk '{print $3}' |sort |uniq -c|sort -n -r

two-step

上面这个命令,把IP地址进行了排序,并做了统计,把统计列放在了对应IP的前面,其中有空白的,可以不用考虑,是日志文件中有些信息不完整,不影响使用。
既然有了统计和IP,并且还是去重后的IP信息,那就可以根据尝试次数进行过滤IP地址了,不过我一般都是超过3次的就禁止掉,因为我是可以正常登录的,不会登录失败,就算有失败登录次数,被误封杀禁用,还是可以临时直接在服务器上解除,比起安全效果来讲,还是很值得的。
接下来获取重复登录次数大于100的IP地址信息:(我这数据比较多,为了演示出效果,只好将重复登录次数设置的大一些,实际还是改小一点为好!)

lastb |awk '{print $3}' |sort |uniq -c|sort -n -r|awk '{if ($1>100) print $2}'

three-step
各位看官这次可以用眼睛对比一下,过滤后的,应该是统计次数在100次以上的IP值;

以上便是从btmp文件获取异常IP信息的方法和步骤;
接下来,便是通过shell脚本来实现把查出来的IP加入到防火墙的blacklist.xml名单中;
直接上脚本:

#!/bin/bash
for LINE in `lastb |awk '{print $3}' |sort |uniq -c|sort -n -r|awk '{if ($1>100) print $2}'`;do
    if [[  `grep -i "${LINE}" /etc/firewalld/ipsets/blacklist.xml` ]]; then
        echo "The IP include !" ;
    else
        firewall-cmd --permanent --ipset=blacklist --add-entry="${LINE}";
    fi
done;
firewall-cmd --reload;

以上是简化脚本,不过我为了后期查看执行历史,在脚本中增加了日志输出命令,实际脚本如下:

#!/bin/bash
echo "auto_btmp.sh START $(date)" >> /path/to/auto_btmp.log;
for LINE in `lastb |awk '{print $3}' |sort |uniq -c|sort -n -r|awk '{if ($1>3) print $2}'`;do
    echo "${LINE}" >> /path/to/auto_btmp.log;
    if [[  `grep -i "${LINE}" /etc/firewalld/ipsets/blacklist.xml` ]]; then
        echo "The IP include !" >> /path/to/auto_btmp.log;
    else
        firewall-cmd --permanent --ipset=blacklist --add-entry="${LINE}";
    fi
done;
firewall-cmd --reload;

echo `lastb |awk '{print $3}' |sort |uniq -c|sort -n -r|awk '{if ($1>3) print $2}'` >> /path/to/auto_btmp.log;
echo "auto_btmp.sh END $(date)" >> /path/to/auto_btmp.log;

脚本中/path/to/auto_btmp.log可以改为实际的日志文件路径,auto_btmp.sh是我脚本的名称,也可以改为实际的脚本名称;

4、脚本有了,给脚本增加个执行权限

chmod +x auto_btmp.sh

然后执行脚本测试效果;
嗯,是减轻了很大的工作量,不过,难道要每次都登录一下服务器手动执行吗?
当然不是!

知识点-定时任务

使用linux自带的定时任务工具crond,就可以实现自动化运维:

# 进入定时任务编辑界面
crontab -e

输入如下内容,实现每小时执行一次,命令实现效果为每个时钟的20分执行一次。

20 * * * * /path/to/auto_btmp.sh

编辑定时任务
定时任务的命令及规则,可以网上搜索crontab或者crond关键字,很多详细教程。

终结

以上过程基本可以实现自动把异常IP列入防火墙的禁止访问列表中,以达到基本的安全防护效果,当然我学习使用的环境比较复杂,里面设置的规则更多一些,而且再加上日志切割工具logrotate配合nginx日志,实现web的安全防护,并把所有日志按天归类到文件夹中,也算初步做到了基本防护效果,不过就算这样,还是能看到每天的攻击或者尝试登录的信息,看的我心里发慌啊,算了,眼不见为净,以后少看点,也没什么可防的,我家没矿!!!^_^
在运维自动化的道路上尽心尽力,但这篇文章却是实实在在的手工码出来的。。。希望以上的知识能帮忙各位!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值