如题,开始玩Linux的人,每次登陆的时候,肯定会遇到这个提示,好担心系统被人攻破,那怎么把这些试探的IP抓出来,并屏蔽呢,今天就记录一下我的做法,供大家参考
其实这个问题已经在系统级别支持解决,目前已有的解决办法如下:
1 使用 ssh-keygen,禁用密码登陆
2 使用PAM模块,参考HowTo: Configure Linux To Track and Log Failed Login Attempt Records,其实就是登陆尝试次数设置和延时
我的解决思路如下:
1 通过脚本获取尝试登陆失败的IP
2 将获取的IP写入到/etc/hosts.deny文件,进行屏蔽
3 使用inotify-tools,监控/var/log/secure文件,来实时更新/etc/hosts.deny文件
下面我详细说明操作过程和原理:
1 安装inotify-tools
inotify-tools 是为linux(内核2.6.1以上均支持)下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。 inotify-tools是用c编写的,除了要求内核支持inotify外,不依赖于其他。inotify-tools提供两种工具,一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数
安装过程 root.~:wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz --no-check-certificate #下载 root.~:tar zxvf inotify-tools-3.14.tar.gz #解压 root.~:cd inotify-tools-3.14 root.~:./configure&&make&&make install #安装
2 编写监控脚本
root.scripts:vi SecureLogWatch #!/bin/bash # #Description: #Use Inotify-tools to monitor the modify of /var/log/secure file #And add the illegal login ip to /etc/hosts.deny file # #Time:2015 Auther:Lee #1 初始化数值 export TotalLine=`cat /var/log/secure|wc -l` export LastLine=1 #2 监控/var/log/secure file 文件的修改 while inotifywait -e modify /var/log/secure; do if tail -n +$LastLine /var/log/secure|grep "Failed password";then #2.1 将非法 ip写入到 /etc/host.deny文件 cat /var/log/secure | tail -n +$LastLine | grep ‘Failed password‘|awk ‘$11~/\./ { print $11} $9~/invalid/{print $13}‘|sort|uniq| sed ‘s/$/,/g‘|tr -d "\n"|sed ‘s/^/sshd : /g‘|sed ‘s/,$/\n/g‘ 1>>/etc/hosts.deny #2.2 更新日志读取位置 TotalLine=`cat /var/log/secure|wc -l` LastLine=${TotalLine} fi sleep 2 #因为更新一次secure文件,inotify会短时间内监测到两次修改,为避免重复ip,无奈sleep会儿 done
注释:说一下脚本功能和其中用到的知识点
脚本功能:实时读取/var/log/secure文件的变化,然后把增量更新的内容进行查找,对于非法实验的ip,会加入到etc/hosts.deny文件中进行屏蔽。存在的问题有:由于失败一次就进行屏蔽,所以会误杀;会添加重复记录到etc/hosts.deny文件中
知识点:
1 inotify使用:inotifywait -e modify /var/log/secure #监测文件是否修改
2 awk字符串判断和打印:awk ‘$11~/\./ { print $11} $9~/invalid/{print $13} #判断是否存在IP地址中的”.”,存在则打印ip列,不存在则打印机另一列
3 tail外部变量使用:tail -n +$LastLine #每次读取上次读到的日志行 一直到日志尾部
4 sed字符替换和外部变量使用:sed ‘s/$/,/g‘ #替换换行符为逗号
5 tr 删除和替换,来合并多行:tr -d "\n" #删除每行尾部的换行符,合并多个行
6 sort|uniq 排序和删除重复行
7 关于sed外部变量的使用,下面这种情况应该就是不支持吧,支持的情况,看下面链接:
LastLine=0; TotalLine=120; root.~:sed -n "${LastLine},${TotalLine}p" ~/secure.bak;echo $TotalLine sed:-e 表达式 #1,字符 6:非法使用地址0 上面使用sed的变量,总是报错,各种方式尝试,都不行,换成下面也不行 呵呵 LastLine=0; TotalLine=120; cat ~/secure.bak | sed -n ‘/‘"$LastLine"‘,‘"$TotalLine"‘/p‘ ~/secure.bak
3 运行脚本
运行脚本有几种方式
1 直接运行 root.scripts:sh SecureLogWatch 2 在线后台运行 root.scripts:sh SecureLogWatch & 3 离线后台运行 root.scripts:nohup ./ecureLogWatch & 4 可以直接加入到开机自启动,自行实现吧
参考: