云服务器禁用登录失败的IP python脚本实现

    这几天登录阿里云服务器发现有几次异常登录信息。都是来自一个固定IP的连接,分析应该是有脚本在扫描我的服务器。为了安全起见,用python脚本写个服务,发现登录失败记录就将这个IP加入到黑名单,禁止这个IP登录。

    过程记录

    1.首先查询一下 /var/log/secure 文件,这个文件是所有ssh连接的登录日志文件,里面可以查询到所有登录记录。查询记录时发现有n多次来自一个IP的ssh连接失败记录,而且发生的时间一秒之内。因此判定是有脚本在尝试登录我的服务器。

    2.将自己常用IP段放入到 /etc/hsots.allow 文件中,这步比较关键!hsots.allow的判定优先级高于hsots.deny,所以就算自己输入密码错误,脚本将自己放置到hsots.deny中也不会出现自己登录不上去的问题。

    3.将访问异常的IP加入到 /etc/hosts.deny 文件中禁止该IP再尝试登录。

ps: 有一种更加简洁的方案,将自己常用的IP放入到hsots.allow中,然后在hsots.deny中设置成 ALL:ALL 即拒绝所有白名单中的ip访问任意服务。我没有采用这种方式的原因是我不确定我自己的IP能够固定下来,如果我IP换成不在白名单中的IP就没办法登录服务器了~

编写python脚本

脚本如下:

# encoding=utf-8
import logging
import re
import os
import time


def findIpInStr(string):
    pattern = r"\b(?:(?: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]?)\b"
    result = re.findall(pattern, string)
    if result:
        return result[0]
    else:
        return None


# 获取已经在黑名单的ip
def initLst():
    lst = []
    with open("/etc/hosts.deny", "r") as f:
        while True:
            line = f.readline()
            if line == "":
                break
            ip = findIpInStr(line)
            if ip:
                lst.append(ip)
    return lst


# 将新的登录失败的IP写入黑名单
def main():
    lst = []
    beforeLst = initLst()
    cmd = "cat /var/log/secure | grep 'Failed'"
    result = os.popen(cmd).read()
    l = result.split("\n")
    for i in l:
        ip = findIpInStr(i)
        if ip is not None and ip not in beforeLst:
            lst.append(ip)
    setLst = set(lst)
    if setLst:
        logging.info("add filter ip: {}".format(setLst))
        with open("/etc/hosts.deny", 'a') as f:
        # with open("1.txt", 'a') as f:
            for arg in setLst:
                s = "sshd:" + arg + ":deny\n"
                f.write(s)

def initLog():
    mylogger = logging.getLogger()
    mylogger.setLevel(logging.INFO)
    streamHandler = logging.StreamHandler()
    formatter = logging.Formatter(
        "%(asctime)s - %(filename)s[line:%(lineno)d][%(threadName)s] - %(levelname)s: %(message)s")
    streamHandler.setFormatter(formatter)
    mylogger.addHandler(streamHandler)


if __name__ == '__main__':
    initLog()
    while True:
        main()
        time.sleep(60)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值