服务器如果暴露在公网上会被人暴力扫描,如果有些端口必须暴露,此时一定要留存访问日志。所有的网络程序都可以很容易地获取到访问者的 IP 和端口信息,同时也可以把访问者 IP 信息写到日志中。这个难度不大,只要是使用 socket 套接字的网络程序获取访问者的 IP 信息就一行代码,把会话信息存到日志中可以分析客户来源,并可以做入侵分析。
对于 Linux 操作系统,所有的系统登陆信息都会写日志。Ubuntu 系统的认证日志位置在 /var/log/auth.log,CentOS 类似的日志位置在 /var/log/secure,如果存在入侵或非法登陆,系统如果还没被攻陷的话,在日志中可以查看到暴力破解、撞库等尝试。
$ tail -1000 /var/log/auth.log| grep -v CRON | grep "Failed password"
如果在日志中发现有外部 IP 的入侵尝试,一方面可以联系网络管理员对暴力破解IP进行封堵,另一方面也需要加强主机的安全防护,启动主机防火墙,封禁不必要的端口,或只对受信IP开放端口。
因为日志量巨大并且日志格式不规整,没有办法使用 awk 、sort、uniq 对日志中的IP信息进行过滤。如果需要从日志中将IP信息过滤出来再做处理,可以使用 Python 正则表达式。
我说一下处理流程,将日志中的信息以行为单位进行处理,将 IP 过滤出来,然后使用 Python 的集合,集合数据结构自身就带去重功能,最后将获取的 IP 信息结合 iptables 拼成命令,方便批量添加防火墙策略。以下是实现代码:
# /usr/bin/python3
import re
def regex(pattern, line):
match = pattern.findall(line)
if not match:
return
return(match)
pattern1 = re.compile(r'((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))')
f = open('/var/log/auth.log',encoding='UTF-8')
line = f.readline()
ipset = set()
while line:
line = f.readline()
a = regex(pattern1, line)
if not a:
continue
for ip in a:
ipset.add(ip)
f.close()
ss = 'iptables -I INPUT -s %s -j REJECT;'
for ip in ipset:
print( ss % ip)
最近执行效果如下:
对于得到的风险 IP,如果是网络防火墙,可以通过防火墙的 IP 对象组,通过命令批量添加,内部威胁可以溯源整改,外部威胁主要还是封堵,除了这个办法你也拿对方没有办法。
文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。