mirror of https://github.com/fail2ban/fail2ban
parent
c3909b8ec4
commit
120a1d9fbc
13
CHANGELOG
13
CHANGELOG
|
@ -4,9 +4,20 @@
|
|||
|_| \__,_|_|_/___|_.__/\__,_|_||_|
|
||||
|
||||
=============================================================
|
||||
Fail2Ban (version 0.5.0) 2005/07/12
|
||||
Fail2Ban (version 0.5.1) 2005/07/23
|
||||
=============================================================
|
||||
|
||||
ver. 0.5.1 (2005/07/23) - beta
|
||||
----------
|
||||
- Fixed bugs #1241756, #1239557
|
||||
- Added log targets in configuration file. Removed -l option
|
||||
- Changed iptables rules in order to create a separated chain
|
||||
for each section
|
||||
- Fixed static banList in firewall.py
|
||||
- Added an initd script for Debian. Thanks to Yaroslav
|
||||
Halchenko
|
||||
- Check for obsolete files after install
|
||||
|
||||
ver. 0.5.0 (2005/07/12) - beta
|
||||
----------
|
||||
- Added support for CIDR mask in ignoreip
|
||||
|
|
2
PKG-INFO
2
PKG-INFO
|
@ -1,6 +1,6 @@
|
|||
Metadata-Version: 1.0
|
||||
Name: fail2ban
|
||||
Version: 0.5.0
|
||||
Version: 0.5.1
|
||||
Summary: Ban IPs that make too many password failure
|
||||
Home-page: http://fail2ban.sourceforge.net
|
||||
Author: Cyril Jaquier
|
||||
|
|
25
README
25
README
|
@ -4,7 +4,7 @@
|
|||
|_| \__,_|_|_/___|_.__/\__,_|_||_|
|
||||
|
||||
=============================================================
|
||||
Fail2Ban (version 0.5.0) 2005/07/12
|
||||
Fail2Ban (version 0.5.1) 2005/07/23
|
||||
=============================================================
|
||||
|
||||
Fail2Ban scans log files like /var/log/pwdfail and bans IP
|
||||
|
@ -55,34 +55,36 @@ Installation:
|
|||
-------------
|
||||
|
||||
Require: python-2.3 (http://www.python.org)
|
||||
log4py-1.1 (http://sourceforge.net/projects/log4py)
|
||||
log4py-1.3 (http://sourceforge.net/projects/log4py)
|
||||
|
||||
To install, just do:
|
||||
|
||||
> tar xvfj fail2ban-0.5.0.tar.bz2
|
||||
> cd fail2ban-0.5.0
|
||||
> tar xvfj fail2ban-0.5.1.tar.bz2
|
||||
> cd fail2ban-0.5.1
|
||||
> python setup.py install
|
||||
|
||||
This will install Fail2Ban into /usr/lib/fail2ban. The
|
||||
fail2ban.py executable is placed into /usr/bin.
|
||||
This will install Fail2Ban into /usr/lib/fail2ban. The fail2ban
|
||||
executable is placed into /usr/bin.
|
||||
|
||||
Gentoo: an ebuild is available on the website.
|
||||
Debian: a package is available on the website.
|
||||
|
||||
Fail2Ban should now be correctly installed. Just type:
|
||||
|
||||
> fail2ban.py -h
|
||||
> fail2ban -h
|
||||
|
||||
to see if everything is alright. You can configure fail2ban
|
||||
with a config file. Copy config/fail2ban.conf.default to
|
||||
/etc/fail2ban.conf.
|
||||
|
||||
Gentoo users can use the initd script available in config/.
|
||||
Copy gentoo-initd to /etc/init.d/fail2ban and gentoo-confd
|
||||
to /etc/conf.d/fail2ban. You can start fail2ban and add it
|
||||
to your default runlevel:
|
||||
You can use the initd script available in config/. Copy
|
||||
<dist>-initd to /etc/init.d/fail2ban. Gentoo users must copy
|
||||
gentoo-confd to /etc/conf.d/fail2ban. You can start fail2ban:
|
||||
|
||||
> /etc/init.d/fail2ban start
|
||||
|
||||
Gentoo users can add it to the default runlevel:
|
||||
|
||||
> rc-update add fail2ban default
|
||||
|
||||
Configuration:
|
||||
|
@ -100,7 +102,6 @@ options:
|
|||
-h display this help message
|
||||
-i <IP(s)> IP(s) to ignore
|
||||
-k kill a currently running Fail2Ban instance
|
||||
-l <FILE> log messages in FILE
|
||||
-r <VALUE> allow a max of VALUE password failure
|
||||
-t <TIME> ban IP for TIME seconds
|
||||
-v verbose. Use twice for greater effect
|
||||
|
|
10
TODO
10
TODO
|
@ -7,9 +7,7 @@
|
|||
ToDo
|
||||
=============================================================
|
||||
|
||||
- cleanup fail2ban.py
|
||||
- improve configuration file and command line options
|
||||
handling
|
||||
- improve installation process
|
||||
- add init script
|
||||
- use FAM (inotify, gamin, ...)
|
||||
See Feature Request Tracking System at SourceForge.net
|
||||
|
||||
- improve installation process (better prefix support)
|
||||
- add better documentation (man page)
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
#! /bin/sh
|
||||
#
|
||||
# Fail2Ban init.d file - to be launched on boot
|
||||
#
|
||||
# Written by Miquel van Smoorenburg <miquels@cistron.nl>.
|
||||
# Modified for Debian
|
||||
# by Ian Murdock <imurdock@gnu.ai.mit.edu>.
|
||||
# Adjusted for Fail2Ban
|
||||
# by Yaroslav Halchenko <debian@onerussian.com>.
|
||||
#
|
||||
# Version: $Id: $
|
||||
#
|
||||
|
||||
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
||||
DAEMON=/usr/bin/fail2ban
|
||||
NAME=fail2ban
|
||||
DESC=fail2ban
|
||||
PIDFILE=/var/run/$NAME.pid
|
||||
|
||||
test -x $DAEMON || exit 0
|
||||
|
||||
# Include fail2ban defaults if available
|
||||
if [ -f /etc/default/fail2ban ] ; then
|
||||
. /etc/default/fail2ban
|
||||
fi
|
||||
DAEMON_OPTS=$FAIL2BAN_OPTS
|
||||
set -e
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
echo -n "Starting $DESC: "
|
||||
[ -f $PIDFILE ] && [ ! -d /proc/`cat $PIDFILE` ] && rm -f $PIDFILE
|
||||
start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
|
||||
-b --exec $DAEMON -- $DAEMON_OPTS
|
||||
echo "$NAME."
|
||||
;;
|
||||
stop)
|
||||
echo -n "Stopping $DESC: "
|
||||
start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid
|
||||
rm -f $PIDFILE
|
||||
echo "$NAME."
|
||||
;;
|
||||
restart|force-reload)
|
||||
#
|
||||
# If the "reload" option is implemented, move the "force-reload"
|
||||
# option to the "reload" entry above. If not, "force-reload" is
|
||||
# just the same as "restart".
|
||||
#
|
||||
echo -n "Restarting $DESC: "
|
||||
( $0 stop )
|
||||
sleep 1
|
||||
$0 start
|
||||
;;
|
||||
*)
|
||||
N=/etc/init.d/$NAME
|
||||
# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
|
||||
echo "Usage: $N {start|stop|restart|force-reload}" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
|
@ -1,6 +1,6 @@
|
|||
# Fail2Ban configuration file
|
||||
#
|
||||
# $Revision: 1.8.2.5 $
|
||||
# $Revision: 1.8.2.7 $
|
||||
#
|
||||
# 2005.06.21 modified for readability Iain Lea iain@bricbrac.de
|
||||
|
||||
|
@ -17,18 +17,18 @@ background = true
|
|||
#
|
||||
debug = false
|
||||
|
||||
# Option: logtargets
|
||||
# Notes.: log targets. Space separated list of logging targets.
|
||||
# Values: STDOUT STDERR SYSLOG file Default: STDOUT /var/log/fail2ban.log
|
||||
#
|
||||
logtargets = STDOUT /var/log/fail2ban.log
|
||||
|
||||
# Option: pidlock
|
||||
# Notes.: path of the PID lock file (must be able to write to file).
|
||||
# Values: FILE Default: /var/run/fail2ban.pid
|
||||
#
|
||||
pidlock = /var/run/fail2ban.pid
|
||||
|
||||
# Option: logfile
|
||||
# Notes.: logfile for logging fail2ban messages.
|
||||
# Values: FILE Default: /var/log/fail2ban.log
|
||||
#
|
||||
logfile = /var/log/fail2ban.log
|
||||
|
||||
# Option: maxretry
|
||||
# Notes.: number of retrys before IP gets banned.
|
||||
# Values: NUM Default: 3
|
||||
|
@ -45,9 +45,12 @@ bantime = 600
|
|||
# Notes.: space separated list of IP's to be ignored by fail2ban.
|
||||
# You can use CIDR mask in order to specify a range.
|
||||
# Example: ignoreip = 192.168.0.1/24 123.45.235.65
|
||||
# Values: IP Default: 192.168.0.0/24
|
||||
# Values: IP Default: empty
|
||||
# Examples
|
||||
# ignoreip = 192.168.0.0/24
|
||||
#
|
||||
ignoreip = 192.168.0.0/16
|
||||
ignoreip =
|
||||
|
||||
|
||||
# Option: cmdstart
|
||||
# Notes.: command executed once at the start of Fail2Ban
|
||||
|
@ -93,7 +96,8 @@ port = 25
|
|||
from = fail2ban
|
||||
|
||||
# Option: to
|
||||
# Notes.: e-mail address of the receiver.
|
||||
# Notes.: e-mail addresses of the receiver. Addresses are space
|
||||
# separated.
|
||||
# Values: MAIL Default: root
|
||||
#
|
||||
to = root
|
||||
|
@ -116,10 +120,10 @@ subject = [Fail2Ban] Banned <ip>
|
|||
# Values: TEXT Default:
|
||||
#
|
||||
message = Hi,<br>
|
||||
The IP <ip> has just been banned by Fail2Ban after
|
||||
<failures> attempts.<br>
|
||||
Regards,<br>
|
||||
Fail2Ban
|
||||
The IP <ip> has just been banned by Fail2Ban after
|
||||
<failures> attempts.<br>
|
||||
Regards,<br>
|
||||
Fail2Ban
|
||||
|
||||
# You can define a new section for each log file to check for
|
||||
# password failure. Each section has to define the following
|
||||
|
@ -143,13 +147,17 @@ logfile = /var/log/apache/access.log
|
|||
# Notes.: command executed once at the start of Fail2Ban
|
||||
# Values: CMD Default:
|
||||
#
|
||||
fwstart =
|
||||
fwstart = iptables -N FAIL2BAN-HTTP
|
||||
iptables -I INPUT -i eth0 -p tcp --dport http -j FAIL2BAN-HTTP
|
||||
iptables -A FAIL2BAN-HTTP -j RETURN
|
||||
|
||||
# Option: fwend
|
||||
# Notes.: command executed once at the end of Fail2Ban
|
||||
# Values: CMD Default:
|
||||
#
|
||||
fwend =
|
||||
fwend = iptables -D INPUT -i eth0 -p tcp --dport http -j FAIL2BAN-HTTP
|
||||
iptables -D FAIL2BAN-HTTP -j RETURN
|
||||
iptables -X FAIL2BAN-HTTP
|
||||
|
||||
# Option: fwban
|
||||
# Notes.: command executed when banning an IP. Take care that the
|
||||
|
@ -161,7 +169,7 @@ fwend =
|
|||
# Values: CMD
|
||||
# Default: iptables -I INPUT 1 -i eth0 -s <ip> -j DROP
|
||||
#
|
||||
fwban = iptables -I INPUT 1 -i eth0 -s <ip> -j DROP
|
||||
fwban = iptables -I FAIL2BAN-HTTP 1 -i eth0 -s <ip> -j DROP
|
||||
|
||||
# Option: fwunban
|
||||
# Notes.: command executed when unbanning an IP. Take care that the
|
||||
|
@ -172,7 +180,7 @@ fwban = iptables -I INPUT 1 -i eth0 -s <ip> -j DROP
|
|||
# Values: CMD
|
||||
# Default: iptables -D INPUT -i eth0 -s <ip> -j DROP
|
||||
#
|
||||
fwunban = iptables -D INPUT -i eth0 -s <ip> -j DROP
|
||||
fwunban = iptables -D FAIL2BAN-HTTP -i eth0 -s <ip> -j DROP
|
||||
|
||||
# Option: timeregex
|
||||
# Notes.: regex to match timestamp in Apache logfile.
|
||||
|
@ -211,13 +219,17 @@ logfile = /var/log/auth.log
|
|||
# Notes.: command executed once at the start of Fail2Ban
|
||||
# Values: CMD Default:
|
||||
#
|
||||
fwstart =
|
||||
fwstart = iptables -N FAIL2BAN-SSH
|
||||
iptables -I INPUT -i eth0 -p tcp --dport ssh -j FAIL2BAN-SSH
|
||||
iptables -A FAIL2BAN-SSH -j RETURN
|
||||
|
||||
# Option: fwend
|
||||
# Notes.: command executed once at the end of Fail2Ban
|
||||
# Values: CMD Default:
|
||||
#
|
||||
fwend =
|
||||
fwend = iptables -D INPUT -i eth0 -p tcp --dport ssh -j FAIL2BAN-SSH
|
||||
iptables -D FAIL2BAN-SSH -j RETURN
|
||||
iptables -X FAIL2BAN-SSH
|
||||
|
||||
# Option: fwbanrule
|
||||
# Notes.: command executed when banning an IP. Take care that the
|
||||
|
@ -229,7 +241,7 @@ fwend =
|
|||
# Values: CMD
|
||||
# Default: iptables -I INPUT 1 -i eth0 -s <ip> -j DROP
|
||||
#
|
||||
fwban = iptables -I INPUT 1 -i eth0 -s <ip> -j DROP
|
||||
fwban = iptables -I FAIL2BAN-SSH 1 -i eth0 -s <ip> -j DROP
|
||||
|
||||
# Option: fwunbanrule
|
||||
# Notes.: command executed when unbanning an IP. Take care that the
|
||||
|
@ -240,7 +252,7 @@ fwban = iptables -I INPUT 1 -i eth0 -s <ip> -j DROP
|
|||
# Values: CMD
|
||||
# Default: iptables -D INPUT -i eth0 -s <ip> -j DROP
|
||||
#
|
||||
fwunban = iptables -D INPUT -i eth0 -s <ip> -j DROP
|
||||
fwunban = iptables -D FAIL2BAN-SSH -i eth0 -s <ip> -j DROP
|
||||
|
||||
# Option: timeregex
|
||||
# Notes.: regex to match timestamp in SSH logfile.
|
||||
|
|
|
@ -2,12 +2,18 @@ fail2ban for Debian
|
|||
-------------------
|
||||
|
||||
This package is nearly 100% identical to the upstream version. It was
|
||||
merely packaged to be installed on a Debian system.
|
||||
merely packaged to be installed on a Debian system and due to tight
|
||||
collaboration with upstream author most of the Debian modifications
|
||||
penetrate into the next upstream.
|
||||
|
||||
Module log4py installed into lib/fail2ban directory because there is no
|
||||
package for not-developed-in-a-long-time fail2ban
|
||||
Currently the main difference with upstream: python libraries are
|
||||
placed under /usr/share/fail2ban insteadh of /usr/lib/fail2ban to
|
||||
comply with policy regarding architecture independent resources.
|
||||
|
||||
Module log4py installed along into fail2ban directory because there is
|
||||
no package for not-developed-in-a-long-time fail2ban
|
||||
|
||||
See the file TODO.Debian for more details, as well as the Debian Bug
|
||||
Tracking system.
|
||||
|
||||
-- Yaroslav Halchenko <debian@onerussian.com>, Tue, 4 Jul 2005 00:00:00 -1000
|
||||
-- Yaroslav O. Halchenko <debian@onerussian.com>, Sat Jul 23 09:09:51 2005
|
||||
|
|
|
@ -1,6 +1,13 @@
|
|||
fail2ban (0.5.1-1) unstable; urgency=low
|
||||
|
||||
* New upstream release
|
||||
|
||||
-- Yaroslav Halchenko <debian@onerussian.com> Sat, 23 Jul 2005 08:50:00 -1000
|
||||
|
||||
fail2ban (0.5.0-1) unstable; urgency=low
|
||||
|
||||
* New upstream release
|
||||
* Libraries placed under /usr/share/fail2ban instead of /usr/lib/fail2ban
|
||||
* Corrections to the description of the package
|
||||
|
||||
-- Yaroslav Halchenko <debian@onerussian.com> Tue, 12 Jul 2005 23:33:20 -1000
|
||||
|
|
|
@ -2,7 +2,5 @@
|
|||
# Run the "uscan" command to check for upstream updates and more.
|
||||
# Site Directory Pattern Version Script
|
||||
version=3
|
||||
http://sf.net/fail2ban/fail2ban-(.*)\.tar\.bz2
|
||||
#http://voxel.dl.sourceforge.net/sourceforge/fail2ban/ \
|
||||
# fail2ban-([0-9]+\.[0-9]+\.[0-9]*)\.tar\.bz2
|
||||
# debian uupdate
|
||||
|
||||
http://sf.net/fail2ban/fail2ban-(.*)\.tar\.bz2 debian svn-upgrade
|
||||
|
|
10
fail2ban
10
fail2ban
|
@ -18,21 +18,21 @@
|
|||
|
||||
# Author: Cyril Jaquier
|
||||
#
|
||||
# $Revision: 1.4.2.2 $
|
||||
# $Revision: 1.4.2.3 $
|
||||
|
||||
__author__ = "Cyril Jaquier"
|
||||
__version__ = "$Revision: 1.4.2.2 $"
|
||||
__date__ = "$Date: 2005/07/08 10:21:52 $"
|
||||
__version__ = "$Revision: 1.4.2.3 $"
|
||||
__date__ = "$Date: 2005/07/15 14:11:21 $"
|
||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||
__license__ = "GPL"
|
||||
|
||||
from sys import exit, path
|
||||
|
||||
#yoh: We do need to load this path first if we ship log4py with fail2ban
|
||||
# Appends our own modules path
|
||||
# Appends our own modules path. Added before log4py import
|
||||
# because log4py could be distributed with Fail2Ban.
|
||||
path.append('/usr/share/fail2ban')
|
||||
|
||||
|
||||
# Checks for required libs
|
||||
# Checks if log4py is present.
|
||||
try:
|
||||
|
|
57
fail2ban.py
57
fail2ban.py
|
@ -16,23 +16,24 @@
|
|||
|
||||
# Author: Cyril Jaquier
|
||||
#
|
||||
# $Revision: 1.20.2.5 $
|
||||
# $Revision: 1.20.2.8 $
|
||||
|
||||
__author__ = "Cyril Jaquier"
|
||||
__version__ = "$Revision: 1.20.2.5 $"
|
||||
__date__ = "$Date: 2005/07/12 13:11:58 $"
|
||||
__version__ = "$Revision: 1.20.2.8 $"
|
||||
__date__ = "$Date: 2005/07/22 21:13:19 $"
|
||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||
__license__ = "GPL"
|
||||
|
||||
import time, sys, getopt, os, string, signal, log4py
|
||||
from ConfigParser import *
|
||||
|
||||
from version import version
|
||||
from firewall.firewall import Firewall
|
||||
from logreader.logreader import LogReader
|
||||
from confreader.configreader import ConfigReader
|
||||
from utils.process import *
|
||||
from utils.mail import Mail
|
||||
from version import version
|
||||
from utils.dns import *
|
||||
from utils.process import *
|
||||
|
||||
# Gets the instance of log4py.
|
||||
logSys = log4py.Logger().get_instance()
|
||||
|
@ -56,7 +57,6 @@ def dispUsage():
|
|||
print " -h display this help message"
|
||||
print " -i <IP(s)> IP(s) to ignore"
|
||||
print " -k kill a currently running Fail2Ban instance"
|
||||
print " -l <FILE> log messages in FILE"
|
||||
print " -r <VALUE> allow a max of VALUE password failure"
|
||||
print " -t <TIME> ban IP for TIME seconds"
|
||||
print " -v verbose. Use twice for greater effect"
|
||||
|
@ -119,8 +119,6 @@ def getCmdLineOptions(optList):
|
|||
conf["background"] = True
|
||||
if opt[0] == "-d":
|
||||
conf["debug"] = True
|
||||
if opt[0] == "-l":
|
||||
conf["logfile"] = opt[1]
|
||||
if opt[0] == "-t":
|
||||
try:
|
||||
conf["bantime"] = int(opt[1])
|
||||
|
@ -153,7 +151,7 @@ def main():
|
|||
|
||||
# Reads the command line options.
|
||||
try:
|
||||
cmdOpts = 'hvVbdkc:l:t:i:r:p:'
|
||||
cmdOpts = 'hvVbdkc:t:i:r:p:'
|
||||
cmdLongOpts = ['help','version']
|
||||
optList, args = getopt.getopt(sys.argv[1:], cmdOpts, cmdLongOpts)
|
||||
except getopt.GetoptError:
|
||||
|
@ -171,8 +169,8 @@ def main():
|
|||
|
||||
# Options
|
||||
optionValues = (["bool", "background", False],
|
||||
["str", "logtargets", "STDOUT /var/log/fail2ban.log"],
|
||||
["bool", "debug", False],
|
||||
["str", "logfile", "/var/log/fail2ban.log"],
|
||||
["str", "pidlock", "/var/run/fail2ban.pid"],
|
||||
["int", "maxretry", 3],
|
||||
["int", "bantime", 600],
|
||||
|
@ -188,6 +186,31 @@ def main():
|
|||
getCmdLineOptions(optList)
|
||||
|
||||
# Process some options
|
||||
# Log targets
|
||||
# Bug fix for #1234699
|
||||
os.umask(0077)
|
||||
# Remove all the targets before setting our own
|
||||
logSys.remove_all_targets()
|
||||
for target in conf["logtargets"].split():
|
||||
if target == "STDOUT":
|
||||
logSys.add_target(log4py.TARGET_SYS_STDOUT)
|
||||
elif target == "STDERR":
|
||||
logSys.add_target(log4py.TARGET_SYS_STDERR)
|
||||
elif target == "SYSLOG":
|
||||
logSys.add_target(log4py.TARGET_SYSLOG)
|
||||
else:
|
||||
# Target should be a file
|
||||
try:
|
||||
open(target, "a")
|
||||
logSys.add_target(target)
|
||||
except IOError:
|
||||
logSys.error("Unable to log to " + target)
|
||||
|
||||
# Check if at least one target exists
|
||||
if len(logSys.get_targets()) == 0:
|
||||
logSys.add_target(log4py.TARGET_SYS_STDOUT)
|
||||
logSys.error("No valid logging target found. Logging to STDOUT")
|
||||
|
||||
# Verbose level
|
||||
if conf["verbose"]:
|
||||
logSys.warn("Verbose level is "+`conf["verbose"]`)
|
||||
|
@ -210,14 +233,6 @@ def main():
|
|||
if not retCode:
|
||||
logSys.error("Unable to start daemon")
|
||||
sys.exit(-1)
|
||||
# Bug fix for #1234699
|
||||
os.umask(0077)
|
||||
try:
|
||||
open(conf["logfile"], "a")
|
||||
logSys.set_target(conf["logfile"])
|
||||
except IOError:
|
||||
logSys.error("Unable to log to " + conf["logfile"])
|
||||
logSys.warn("Using default output for logging")
|
||||
|
||||
# Ignores IP list
|
||||
ignoreIPList = conf["ignoreip"].split(' ')
|
||||
|
@ -291,8 +306,10 @@ def main():
|
|||
element[1].addIgnoreIP("127.0.0.1")
|
||||
while len(ignoreIPList) > 0:
|
||||
ip = ignoreIPList.pop()
|
||||
for element in logFwList:
|
||||
element[1].addIgnoreIP(ip)
|
||||
# Bug fix for #1239557
|
||||
if isValidIP(ip):
|
||||
for element in logFwList:
|
||||
element[1].addIgnoreIP(ip)
|
||||
|
||||
logSys.info("Fail2Ban v"+version+" is running")
|
||||
# Execute global start command
|
||||
|
|
|
@ -16,11 +16,11 @@
|
|||
|
||||
# Author: Cyril Jaquier
|
||||
#
|
||||
# $Revision: 1.8.2.4 $
|
||||
# $Revision: 1.8.2.5 $
|
||||
|
||||
__author__ = "Cyril Jaquier"
|
||||
__version__ = "$Revision: 1.8.2.4 $"
|
||||
__date__ = "$Date: 2005/07/12 13:08:24 $"
|
||||
__version__ = "$Revision: 1.8.2.5 $"
|
||||
__date__ = "$Date: 2005/07/15 14:07:08 $"
|
||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||
__license__ = "GPL"
|
||||
|
||||
|
@ -37,12 +37,11 @@ class Firewall:
|
|||
the IP.
|
||||
"""
|
||||
|
||||
banList = dict()
|
||||
|
||||
def __init__(self, banRule, unBanRule, banTime):
|
||||
self.banRule = banRule
|
||||
self.unBanRule = unBanRule
|
||||
self.banTime = banTime
|
||||
self.banList = dict()
|
||||
|
||||
def addBanIP(self, aInfo, debug):
|
||||
""" Bans an IP.
|
||||
|
|
|
@ -16,11 +16,11 @@
|
|||
|
||||
# Author: Cyril Jaquier
|
||||
#
|
||||
# $Revision: 1.13.2.2 $
|
||||
# $Revision: 1.13.2.4 $
|
||||
|
||||
__author__ = "Cyril Jaquier"
|
||||
__version__ = "$Revision: 1.13.2.2 $"
|
||||
__date__ = "$Date: 2005/07/12 13:09:09 $"
|
||||
__version__ = "$Revision: 1.13.2.4 $"
|
||||
__date__ = "$Date: 2005/07/23 09:07:53 $"
|
||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||
__license__ = "GPL"
|
||||
|
||||
|
@ -186,6 +186,12 @@ class LogReader:
|
|||
"""
|
||||
date = list(time.strptime(value, self.timepattern))
|
||||
if date[0] < 2000:
|
||||
# There is probably no year field in the logs
|
||||
date[0] = time.gmtime()[0]
|
||||
# Bug fix for #1241756
|
||||
# If the date is greater than the current time, we suppose
|
||||
# that the log is not from this year but from the year before
|
||||
if time.mktime(date) > time.time():
|
||||
date[0] -= 1
|
||||
unixTime = time.mktime(date)
|
||||
return unixTime
|
||||
|
|
54
setup.py
54
setup.py
|
@ -18,25 +18,55 @@
|
|||
|
||||
# Author: Cyril Jaquier
|
||||
#
|
||||
# $Revision: 1.4.2.1 $
|
||||
# $Revision: 1.4.2.2 $
|
||||
|
||||
__author__ = "Cyril Jaquier"
|
||||
__version__ = "$Revision: 1.4.2.1 $"
|
||||
__date__ = "$Date: 2005/07/07 16:57:05 $"
|
||||
__version__ = "$Revision: 1.4.2.2 $"
|
||||
__date__ = "$Date: 2005/07/15 14:14:12 $"
|
||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||
__license__ = "GPL"
|
||||
|
||||
from distutils.core import setup
|
||||
from version import version
|
||||
from os.path import isfile, join
|
||||
from sys import exit, argv
|
||||
|
||||
setup(
|
||||
name = "fail2ban",
|
||||
version = version,
|
||||
description = "Ban IPs that make too many password failure",
|
||||
author = "Cyril Jaquier",
|
||||
author_email = "lostcontrol@users.sourceforge.net",
|
||||
url = "http://fail2ban.sourceforge.net",
|
||||
scripts = ['fail2ban'],
|
||||
py_modules = ['fail2ban', 'version','log4py'],
|
||||
packages = ['firewall', 'logreader', 'confreader', 'utils']
|
||||
name = "fail2ban",
|
||||
version = version,
|
||||
description = "Ban IPs that make too many password failure",
|
||||
author = "Cyril Jaquier",
|
||||
author_email = "lostcontrol@users.sourceforge.net",
|
||||
url = "http://fail2ban.sourceforge.net",
|
||||
scripts = ['fail2ban'],
|
||||
py_modules = ['fail2ban', 'version', 'log4py'],
|
||||
packages = ['firewall', 'logreader', 'confreader', 'utils']
|
||||
)
|
||||
|
||||
# Do some checks after installation
|
||||
# Search for obsolete files.
|
||||
obsoleteFiles = []
|
||||
elements = {"/usr/bin/": ["fail2ban.py"],
|
||||
"/usr/lib/fail2ban/firewall/": ["iptables.py", "ipfwadm.py",
|
||||
"ipfw.py"]}
|
||||
for dir in elements:
|
||||
for f in elements[dir]:
|
||||
path = join(dir, f)
|
||||
if isfile(path):
|
||||
obsoleteFiles.append(path)
|
||||
if obsoleteFiles:
|
||||
print
|
||||
print "Obsolete files from previous Fail2Ban versions were found on " \
|
||||
"your system."
|
||||
print "Please delete them:"
|
||||
print
|
||||
for f in obsoleteFiles:
|
||||
print "\t" + f
|
||||
print
|
||||
|
||||
# Update config file
|
||||
if argv[1] == "install":
|
||||
print
|
||||
print "Please do not forget to update your configuration file."
|
||||
print "Use config/fail2ban.conf.default as example."
|
||||
print
|
||||
|
|
18
utils/dns.py
18
utils/dns.py
|
@ -16,11 +16,11 @@
|
|||
|
||||
# Author: Cyril Jaquier
|
||||
#
|
||||
# $Revision: 1.7.2.1 $
|
||||
# $Revision: 1.7.2.2 $
|
||||
|
||||
__author__ = "Cyril Jaquier"
|
||||
__version__ = "$Revision: 1.7.2.1 $"
|
||||
__date__ = "$Date: 2005/07/12 13:10:14 $"
|
||||
__version__ = "$Revision: 1.7.2.2 $"
|
||||
__date__ = "$Date: 2005/07/22 21:11:42 $"
|
||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||
__license__ = "GPL"
|
||||
|
||||
|
@ -55,6 +55,15 @@ def searchIP(text):
|
|||
else:
|
||||
return []
|
||||
|
||||
def isValidIP(str):
|
||||
""" Return true if str is a valid IP
|
||||
"""
|
||||
try:
|
||||
socket.inet_aton(str)
|
||||
return True
|
||||
except socket.error:
|
||||
return False
|
||||
|
||||
def textToIp(text):
|
||||
""" Return the IP of DNS found in a given text.
|
||||
"""
|
||||
|
@ -62,7 +71,8 @@ def textToIp(text):
|
|||
# Search for plain IP
|
||||
plainIP = searchIP(text)
|
||||
for element in plainIP:
|
||||
ipList.append(element)
|
||||
if isValidIP(element):
|
||||
ipList.append(element)
|
||||
if not ipList:
|
||||
# Try to get IP from possible DNS
|
||||
dnsList = textToDns(text)
|
||||
|
|
|
@ -16,11 +16,11 @@
|
|||
|
||||
# Author: Cyril Jaquier
|
||||
#
|
||||
# $Revision: 1.1.2.1 $
|
||||
# $Revision: 1.1.2.2 $
|
||||
|
||||
__author__ = "Cyril Jaquier"
|
||||
__version__ = "$Revision: 1.1.2.1 $"
|
||||
__date__ = "$Date: 2005/07/07 16:53:47 $"
|
||||
__version__ = "$Revision: 1.1.2.2 $"
|
||||
__date__ = "$Date: 2005/07/15 14:08:17 $"
|
||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||
__license__ = "GPL"
|
||||
|
||||
|
@ -76,9 +76,6 @@ def createDaemon():
|
|||
# Ensure that the daemon doesn't keep any directory in use. Failure
|
||||
# to do this could make a filesystem unmountable.
|
||||
os.chdir("/")
|
||||
# Give the child complete control over permissions.
|
||||
# yoh: evil evil evil!
|
||||
# os.umask(0)
|
||||
else:
|
||||
os._exit(0) # Exit parent (the first child) of the second child.
|
||||
else:
|
||||
|
|
|
@ -16,12 +16,12 @@
|
|||
|
||||
# Author: Cyril Jaquier
|
||||
#
|
||||
# $Revision: 1.12.2.2 $
|
||||
# $Revision: 1.12.2.4 $
|
||||
|
||||
__author__ = "Cyril Jaquier"
|
||||
__version__ = "$Revision: 1.12.2.2 $"
|
||||
__date__ = "$Date: 2005/07/12 13:12:40 $"
|
||||
__version__ = "$Revision: 1.12.2.4 $"
|
||||
__date__ = "$Date: 2005/07/23 09:31:12 $"
|
||||
__copyright__ = "Copyright (c) 2004 Cyril Jaquier"
|
||||
__license__ = "GPL"
|
||||
|
||||
version = "0.5.0"
|
||||
version = "0.5.1"
|
||||
|
|
Loading…
Reference in New Issue