这几天登录阿里云服务器发现有几次异常登录信息。都是来自一个固定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)