在工作中,我发现只要开放到公网的主机,都会受到各种攻击的威胁,常见的就是ssh暴力破解,以下是一个python脚本,对/var/log/secure登录日志中的ssh记录进行简单分析,并将一周内多次进行破解试探的ip地址,存入到/etc/hosts.deny中拒绝其连接,代码于centos6.5下测试正常工作。如需定期执行,可以配合crond使用。
#! / usr/ bin/ env python
# Hackers try to login in servers by ssh too much times, in / var/ log/ secure you can find it . The script will add hackers's ip to /etc/hosts.deny last a week
#by hank 2015-03-27
import re
from datetime import date
logfile = r'/ var/ log/ secure'
denyfile = r'/ etc/ hosts. deny'
months_31 = ['Jan',' Mar',' May',' Jul',' Aug',' Oct',' Dec']
months_30 = ['Apr',' Jun',' Sep',' Nov']
month_28or29 = 'Feb'
months = {
'Jan':1,' Feb':2,' Mar':3,' Apr':4,' May':5,' Jun':6,
'Jul':7,' Aug':8,' Sep':9,' Oct':10,' Nov':11,' Dec':12
}
month_days = {}
for mon in months_31:
month_days[mon] = 31
for mon in months_30:
month_days[mon] = 30
if date.isocalendar(date.today())[0] % 4 == 0:
month_days[month_28or29] = 29
else:
month_days[month_28or29] = 28
def search_source():
t = date.today()
month = t.strftime('% b')
day = t.strftime('% d')
pat = re.compile('. + sshd. + Failed password. + ( \ d{ 1, 3} \ . \ d{ 1, 3} \ . \ d{ 1, 3} \ . \ d{ 1, 3} ) . + ')
lines = []
f = open(logfile,'r')
for line in f:
if line.split()[0] == month and (int(day) - int(line.split()[1])) < 7 and (int(day) - int(line.split()[1])) >= 0:
if re.search(pat,line):
lines.append(line)
elif (months[month] - months[line.split()[0]]) == 1 or (months[month] - months[line.split()[0]]) == -11:
if (int(day) + month_days[line.split()[0]] - int(line.split()[1])) < 7 and re.search(pat,line):
lines.append(line)
return lines
def count_ips(lines):
count = {}
if len(lines) == 0:
print 'No one use ssh and failed. '
raise SystemExit
pat = re.compile(' ( \ d{ 1, 3} \ . \ d{ 1, 3} \ . \ d{ 1, 3} \ . \ d{ 1, 3} ) ')
for line in lines:
ip = re.findall(pat,line)[0]
if ip in count:
count[ip] += 1
else:
count[ip] = 1
return count
def deny_ips(count):
f = open(denyfile,'w')
valve = 50
for ip in count:
if count[ip] >= valve:
word = 'ALL: % s #failed % d times in a week. \ n' % (ip,count[ip])
f.write(word)
f.close()
def main():
lines = search_source()
count = count_ips(lines)
deny_ips(count)
if __name__ == '__main__
main()
如果使用非root账户,那么得对这两个文件具有读(/var/log/secure)写(/etc/hosts.deny)权限方可进行。
使用方法:
#cp /etc/hosts.deny /etc/hosts.deny.bak #备份源文件
#vim much_failed_ssh_deny.py #添加代码
#chmod +x much_failed_ssh_deny.py #授予执行权限
#./much_failed_ssh_deny.py #执行脚本
#cat /etc/hosts.deny #查看结果
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com