mirror of https://github.com/fail2ban/fail2ban
don't remove MLFID from cache (can recognize multiple attempt within the same connection)
parent
f13fac5ae9
commit
1971fd4bd3
|
@ -220,8 +220,8 @@ class JailReader(ConfigReader):
|
||||||
if self.__filter:
|
if self.__filter:
|
||||||
stream.extend(self.__filter.convert())
|
stream.extend(self.__filter.convert())
|
||||||
for opt, value in self.__opts.iteritems():
|
for opt, value in self.__opts.iteritems():
|
||||||
if opt == "logpath" and \
|
if opt == "logpath":
|
||||||
not self.__opts.get('backend', None).startswith("systemd"):
|
if self.__opts.get('backend', None).startswith("systemd"): continue
|
||||||
found_files = 0
|
found_files = 0
|
||||||
for path in value.split("\n"):
|
for path in value.split("\n"):
|
||||||
path = path.rsplit(" ", 1)
|
path = path.rsplit(" ", 1)
|
||||||
|
|
|
@ -550,26 +550,22 @@ class Filter(JailThread):
|
||||||
|
|
||||||
def _mergeFailure(self, mlfid, fail, failRegex):
|
def _mergeFailure(self, mlfid, fail, failRegex):
|
||||||
mlfidFail = self.mlfidCache.get(mlfid) if self.__mlfidCache else None
|
mlfidFail = self.mlfidCache.get(mlfid) if self.__mlfidCache else None
|
||||||
|
# if multi-line failure id (connection id) known:
|
||||||
if mlfidFail:
|
if mlfidFail:
|
||||||
mlfidGroups = mlfidFail[1]
|
mlfidGroups = mlfidFail[1]
|
||||||
# if current line not failure, but previous was failure:
|
# update - if not forget (disconnect/reset):
|
||||||
if fail.get('nofail') and not mlfidGroups.get('nofail'):
|
if not fail.get('mlfforget'):
|
||||||
del fail['nofail'] # remove nofail flag - completed with fid (host, ip)
|
mlfidGroups.update(fail)
|
||||||
self.mlfidCache.unset(mlfid) # remove cache entry
|
|
||||||
# if current line is failure, but previous was not:
|
|
||||||
elif not fail.get('nofail') and mlfidGroups.get('nofail'):
|
|
||||||
del mlfidGroups['nofail'] # remove nofail flag - completed as failure
|
|
||||||
self.mlfidCache.unset(mlfid) # remove cache entry
|
|
||||||
else:
|
else:
|
||||||
# cache this line info (if not forget):
|
self.mlfidCache.unset(mlfid) # remove cached entry
|
||||||
if not fail.get('mlfforget'):
|
# merge with previous info:
|
||||||
mlfidFail = [self.__lastDate, fail]
|
|
||||||
self.mlfidCache.set(mlfid, mlfidFail)
|
|
||||||
else:
|
|
||||||
self.mlfidCache.unset(mlfid) # remove cache entry
|
|
||||||
return fail
|
|
||||||
fail2 = mlfidGroups.copy()
|
fail2 = mlfidGroups.copy()
|
||||||
fail2.update(fail)
|
fail2.update(fail)
|
||||||
|
if not fail.get('nofail'): # be sure we've correct current state
|
||||||
|
try:
|
||||||
|
del fail2['nofail']
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
fail2["matches"] = fail.get("matches", []) + failRegex.getMatchedTupleLines()
|
fail2["matches"] = fail.get("matches", []) + failRegex.getMatchedTupleLines()
|
||||||
fail = fail2
|
fail = fail2
|
||||||
elif not fail.get('mlfforget'):
|
elif not fail.get('mlfforget'):
|
||||||
|
|
|
@ -239,3 +239,5 @@ Nov 26 13:03:30 srv sshd[45]: fatal: Unable to negotiate with 192.0.2.2 port 554
|
||||||
Nov 26 15:03:30 host sshd[22440]: Connection from 192.0.2.3 port 39678 on 192.168.1.9 port 22
|
Nov 26 15:03:30 host sshd[22440]: Connection from 192.0.2.3 port 39678 on 192.168.1.9 port 22
|
||||||
# failJSON: { "time": "2004-11-26T15:03:31", "match": true , "host": "192.0.2.3", "desc": "Multiline - no matching key exchange method" }
|
# failJSON: { "time": "2004-11-26T15:03:31", "match": true , "host": "192.0.2.3", "desc": "Multiline - no matching key exchange method" }
|
||||||
Nov 26 15:03:31 host sshd[22440]: fatal: Unable to negotiate a key exchange method [preauth]
|
Nov 26 15:03:31 host sshd[22440]: fatal: Unable to negotiate a key exchange method [preauth]
|
||||||
|
# failJSON: { "time": "2004-11-26T15:03:32", "match": true , "host": "192.0.2.3", "desc": "Second attempt within the same connect" }
|
||||||
|
Nov 26 15:03:32 host sshd[22440]: fatal: Unable to negotiate a key exchange method [preauth]
|
|
@ -200,13 +200,13 @@ def testSampleRegexsFactory(name, basedir):
|
||||||
self.assertEqual(len(ret), 1,
|
self.assertEqual(len(ret), 1,
|
||||||
"Multiple regexs matched %r" % (map(lambda x: x[0], ret)))
|
"Multiple regexs matched %r" % (map(lambda x: x[0], ret)))
|
||||||
|
|
||||||
# Fallback for backwards compatibility (previously no fid, was host only):
|
|
||||||
if faildata.get("host", None) is not None and fail.get("host", None) is None:
|
|
||||||
fail["host"] = fid
|
|
||||||
# Verify match captures (at least fid/host) and timestamp as expected
|
# Verify match captures (at least fid/host) and timestamp as expected
|
||||||
for k, v in faildata.iteritems():
|
for k, v in faildata.iteritems():
|
||||||
if k not in ("time", "match", "desc"):
|
if k not in ("time", "match", "desc"):
|
||||||
fv = fail.get(k, None)
|
fv = fail.get(k, None)
|
||||||
|
# Fallback for backwards compatibility (previously no fid, was host only):
|
||||||
|
if k == "host" and fv is None:
|
||||||
|
fv = fid
|
||||||
self.assertEqual(fv, v)
|
self.assertEqual(fv, v)
|
||||||
|
|
||||||
t = faildata.get("time", None)
|
t = faildata.get("time", None)
|
||||||
|
|
Loading…
Reference in New Issue