如题,开始玩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: Auther:Lee

# 初始化数值
export TotalLine=`cat /var/log/secure|wc -l`
export LastLine=

# 监控/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|\
        >>/etc/hosts.deny  

#2.2 更新日志读取位置
        TotalLine=`cat /var/log/secure|wc -l`
        LastLine=${TotalLine}
    fi
  #因为更新一次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=;
TotalLine=;
root.~:sed -n "${LastLine},${TotalLine}p" ~/secure.bak;echo $TotalLine
,字符 :非法使用地址0

上面使用sed的变量,总是报错,各种方式尝试,都不行,换成下面也不行 呵呵
LastLine=;
TotalLine=;
cat ~/secure.bak | sed -n '/'"$LastLine"','"$TotalLine"'/p' ~/secure.bak

sed当中使用变量替换以及执行外部命令

3 运行脚本

运行脚本有几种方式

 直接运行
root.scripts:sh SecureLogWatch
 在线后台运行
root.scripts:sh SecureLogWatch &
 离线后台运行
root.scripts:nohup ./ecureLogWatch &
 可以直接加入到开机自启动,自行实现吧

参考:

inotify 安装

inotify-tools使用方法介绍

There were X failed login attempts since the last successful login的更多相关文章

  1. Number of failed login attempts exceeds threshold value

    OEM发出好多告警,Number of failed login attempts exceeds threshold value. profile当前配置10次失败就会锁定user 查看下,dba_ ...

  2. phoenix连接hbase数据库,创建二级索引报错:Error: org.apache.phoenix.exception.PhoenixIOException: Failed after attempts=36, exceptions: Tue Mar 06 10:32:02 CST 2018, null, java.net.SocketTimeoutException: callTimeou

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  3. 【异常】org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=36, exceptions:

    1 Phoenix远程无法连接但是本地可以连接,详细异常 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found bindin ...

  4. GET: https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login? loginicon=true &uuid=odcptUu2JA==&tip=0

    GET: https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login? loginicon=true &uuid=odcptUu2JA==&am ...

  5. JAVA API访问Hbase org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=32

    Java使用API访问Hbase报错: 我的hbase主节点是spark1   java代码访问hbase的时候写的是ip 结果运行程序报错 不能够识别主机名 修改主机名     修改主机hosts文 ...

  6. Fail2ban 防止暴力破解centos服务器的SSH或者FTP账户

    次尝试登陆root账户失败的情况.[说明服务器被攻击了]   logtarget = SYSLOG  #我们需要做的就是把这行改成/var/log/fail2ban.log,方便用来记录日志信息 so ...

  7. Shell跳板机sshstack

    笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 源码地址: https://github.com/sshstack/sshstack 为什么要写shell跳板机? ...

  8. 3-3 Hadoop集群完全分布式配置部署

    Hadoop集群完全分布式配置部署 下面的部署步骤,除非说明是在哪个服务器上操作,否则默认为在所有服务器上都要操作.为了方便,使用root用户. 1.准备工作 1.1 centOS6服务器3台 手动指 ...

  9. xshell连接ubuntu系统

    1.登录虚拟机 2.关闭本机所有防火墙和杀毒软件 sudo ufw status 查看防火墙状态 sudo ufw disable 关闭防火墙 sudo ufw enable 打开防火墙 3.安装ss ...

随机推荐

  1. TabHost用法

    tabhost用两种方法 方法一:Activity继承TabActivity后用getTabHost()方法来获取tabhost(前提:Activity的setContentView要删除,这样布局才 ...

  2. mydumper

    Mydumper介绍 Mydumper是一个针对MySQL和Drizzle的高性能多线程备份和恢复工具.开发人员主要来自MySQL,Facebook,SkySQL公司.目前已经在一些线上使用了Mydu ...

  3. JAVA 将图片转换为Base64编码

    这里使用的jar包是commons-codec-1.10.jar; 示例代码 import java.io.FileInputStream; import java.io.FileOutputStre ...

  4. C/C++知识点清单01

    第一章 C/C++程序基础 一.一般赋值语句: 考察一般赋值语句的概念和方法. 1.程序: #include<stdio.h> int main(void) { ,y,z; x*=(y=z ...

  5. JaveScript数组(JS知识点归纳五)

    1.概念 a)作用--用于保存多个数据,便于对数据的使用 b)数组元素--数组中的数据 c)索引--数组中的元素按照下标(数值)的方式排列(从0 开始),依次递增(也有可能是字符串的类型--不用) d ...

  6. 运用C语言将图片转换成16进制的字符串(base64)

    最近在写手机端的性能测试脚本的时候,发现手机在上传图片数据时,先将图片转换成一堆16进制的字符,将字符传输过去,服务器再将字符解码成图片 我们在loadrunner中测试时,就需要用C语言将图片编码. ...

  7. CVE-2017-8635复现

    在最近几个月里,我花了一些时间深入了Device Guard以及如何实现用户模式代码完整性(UMCI).如果您对Device Guard不熟悉,您可以 在这里阅读更多信息.通常情况下,UMCI可防止未 ...

  8. BZOJ 3038: 上帝造题的七分钟2【线段树区间开方问题】

    3038: 上帝造题的七分钟2 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1469  Solved: 631[Submit][Status][Dis ...

  9. Codeforces Round #415 (Div. 2)(A,暴力,B,贪心,排序)

    A. Straight «A» time limit per test:1 second memory limit per test:256 megabytes input:standard inpu ...

  10. JAVA爬虫实践(实践三:爬虫框架webMagic和csdnBlog爬虫)

    WebMagic WebMagic是一个简单灵活的Java爬虫框架.基于WebMagic,你可以快速开发出一个高效.易维护的爬虫. 采用HttpClient可以实现定向的爬虫,也可以自己编写算法逻辑来 ...