PDA

Bekijk Volledige Versie : Webserver-logvervuiling + (Linux) oplossing



Richard Rasker
29/12/02, 14:49
Hallo,

Waarschijnlijk kennen meer beheerders van webservers het probleem dat=20
slechts enkele met Nimda of Code Red besmette hosts dagelijks vele=20
honderden keren contact maken met hun server (in mijn geval Apache).
Dit heeft onder meer tot gevolg dat het error-log al snel duizenden=20
entry's van dezelfde hosts bevat, zodat het handmatig bekijken van het=20
log op onregelmatigheden vrijwel zinloos wordt. Bovendien vormen deze=20
scans een ongewenste extra belasting van mijn niet niet al te ruim=20
bemeten server.

Om hier wat aan te doen heb ik een bash-scriptje geschreven dat genoemde=
=20
hosts na een tiental scans automatisch geheel blokkeert op een=20
iptables-firewall, en dat geblokkeerde hosts na een bepaalde tijd ook=20
weer automatisch toegang verleent.

Nu weet ik niet wat de policy is ten aanzien van scripts in deze=20
nieuwsgroep, dus ik zal het hier niet meteen meesturen. Het is ook geen =

meesterwerk op programmeergebied, maar het werkt goed, is redelijk=20
eenvoudig en kan gemakkelijk worden aangepast aan allerlei=20
omstandigheden. Is hier sowieso belangstelling voor? En zijn er nog=20
andere idee=EBn op dit gebied?

Richard Rasker


--
http://www.linetec.nl/

Rene Pijlman
29/12/02, 15:09
Richard Rasker:
[webserver virussen]
>Om hier wat aan te doen heb ik een bash-scriptje geschreven dat genoemde
>hosts na een tiental scans automatisch geheel blokkeert op een
>iptables-firewall, en dat geblokkeerde hosts na een bepaalde tijd ook
>weer automatisch toegang verleent.
[...]
>Is hier sowieso belangstelling voor?

Hé, wat leuk! Ik heb er zelf weleens over gedacht zoiets te
maken.

Misschien kun je het ergens onder een OSS-licentie ter download
aanbieden, bijvoorbeeld op http://www.sourceforge.net.

>Het is ook geen meesterwerk op programmeergebied, maar het werkt
>goed, is redelijk eenvoudig en kan gemakkelijk worden aangepast
>aan allerlei omstandigheden.

Het mooiste zou natuurlijk zijn om de database met geinfecteerde
servers world wide te delen, want heel veel zin heeft het niet
om een server pas te blokkeren nadat hij zijn knock-knock al
heeft gedaan. Zou er niet al zoiets zijn?

--
René Pijlman

"What we call little things are merely the causes of great
things; they are the beginning, the embryo, and it is the point
of departure which, generally speaking, decides the whole future
of an existence. One single black speck may be the beginning of
a gangrene, of a storm, of a revolution."
- Henri Frederic Amiel

Alain
29/12/02, 16:35
"Richard Rasker" <rasker@linetec.nl> wrote in message
news:20021229.13490600@techno.linetec.nl...
> Nu weet ik niet wat de policy is ten aanzien van scripts in deze
> nieuwsgroep, dus ik zal het hier niet meteen meesturen.

Je kunt gewoon de source plakken in een berichtje. Niet als attachment...

Richard Rasker
29/12/02, 20:07
Op 12/29/02, 3:09:59 PM, schreef Rene Pijlman <reageer.in@de.nieuwsgroep=
>=20
over het thema Re: Webserver-logvervuiling + (Linux) oplossing:

> Richard Rasker:
> [webserver virussen]
> >Om hier wat aan te doen heb ik een bash-scriptje geschreven dat genoe=
mde
> >hosts na een tiental scans automatisch geheel blokkeert op een
> >iptables-firewall, en dat geblokkeerde hosts na een bepaalde tijd ook=

> >weer automatisch toegang verleent.
> [...]
> >Is hier sowieso belangstelling voor?

> H=E9, wat leuk! Ik heb er zelf weleens over gedacht zoiets te
> maken.

> Misschien kun je het ergens onder een OSS-licentie ter download
> aanbieden, bijvoorbeeld op http://www.sourceforge.net.

Hierbij in ieder geval de NL-versie van het script. Ik wil tzt ook wel=20
een Engelse versie via SourceForge verspreiden, maar dan wil ik eerst=20
eens kijken of er hier misschien nog belangrijke opmerkingen op komen.=20
Verder bestaat het grootste deel van het script uit commentaar, dus het =

zou allemaal redelijk duidelijk moeten zijn.

> Het mooiste zou natuurlijk zijn om de database met geinfecteerde
> servers world wide te delen, want heel veel zin heeft het niet
> om een server pas te blokkeren nadat hij zijn knock-knock al
> heeft gedaan. Zou er niet al zoiets zijn?

Op http://www.dshield.org/ vind je een dergelijk project op basis van=20
firewall-logs.

Nog =E9=E9n (waarschijnlijk overbodige) opmerking bij het script blockch=
eck:=20
let even op dat de eerste for-opdracht (regel 68) langer is dan 80 teken=
s=20
en hier over twee regels is weergegeven; deze opdracht moet op =E9=E9n r=
egel=20
terechtkomen. Ik weet dat de conventie voor het afbreken dan een \ aan=20
het einde van de regel voorschrijft, maar juist die regel staat al=20
redelijk bol van de (back)slashes, dus dat heb ik om ergere verwarring t=
e=20
voorkomen maar achterwege gelaten.

Richard Rasker


blockcheck:


#!/bin/bash
#
# blockcheck v. 1.0 copyright (c) 2002 R.E.Rasker
# Laatste wijziging: 28-12-2002
# http://www.linetec.nl/
#
# Dit script mag vrij gekopieerd, aangepast en verspreid worden
# onder de voorwaarden van de GNU General Public License,
# zoals gepubliceerd op http://www.gnu.org/licenses/gpl.html.
#
# Opmerkingen, vragen en suggesties kunt u sturen naar
# rasker@linetec.nl
#
# blockcheck kan automatisch grote vervuilers van bijvoorbeeld
# webserver-logbestanden identificeren, in een blocklist opslaan
# en via een iptables-firewall blokkeren. In de blocklist wordt
# tevens de datum opgeslagen waarop een host is toegevoegd, zodat
# deze na een bepaalde expire-tijd ook weer automatisch uit de
# blocklist verwijderd kan worden.
#
# Het firewall-script zelf moet de volgende code bevatten om de
# blocklist automatisch te verwerken; deze code moet natuurlijk
# voorafgaan aan regels die toegang verlenen:
#
# for i in `grep -v "^#" /usr/local/etc/blocklist.db | cut -d : -f 1`; d=
o
# iptables -A INPUT -i eth0 -s $i -j block
# done
#
# Hierbij wordt ervan uitgegaan dat het firewall-script een chain met
# de naam 'block' heeft voor het blokkeren van hosts. Let er verder
# op dat de naam en de locatie van de blocklist overeen moeten komen
# met die in dit script.
#
#
# Variabelen en vaste waarden:
# ERRMIN geeft aan hoe vaak een bepaald verdacht IP-adres minimaal
# in het error-log moet voorkomen om automatisch geblokkeerd te worden.
# EXPIRE geeft aan na hoeveel tijd een IP-adres weer toegang krijgt
# (de honderdtallen geven de maanden aan).
# ERRLOG geeft de locatie aan van het Apache error-log.
# BLOCKLIST geeft de locatie aan van de blocklist; let op dat deze
# locatie ook in het firewall-script wordt gebruikt (zie boven).
# FIREWALL geeft de locatie aan van het firewall-script.
# De variabele FIRESTART geeft aan of de firewall uiteindelijk
# opnieuw gestart moet worden.
#

ERRMIN=3D10
EXPIRE=3D100
ERRLOG=3D/var/log/httpd/error_log
BLOCKLIST=3D/usr/local/etc/blocklist.db
FIREWALL=3D/usr/local/bin/init_firewall
FIRESTART=3Dfalse

#
# Allereerst wordt de huidige datum bepaald.
#

DATENOW=3D`date +%y%m%d`

#
# Met de volgende opdracht wordt gezocht naar hosts die pogen requests
# uit te voeren voor Windows-systeembestanden (zoals bij Nimda) of
# buffer-overflows (zoals bij CodeRed).
# De genoemde worms zijn momenteel de grootste logvervuilers:
#

for i in `grep "winnt.*exe\|NNNNNNNNNN" $ERRLOG | sed -e 's/^.*\[client =

//g' -e 's/\].*$//g' | sort -u`; do

#
# Als een host al in de blocklist voorkomt, moet dit gesignaleerd worden=
:
#

MATCH=3Dfalse
for j in `grep -v "^#" $BLOCKLIST | cut -d : -f 1`; do
if [ $i =3D $j ]; then
MATCH=3Dtrue
fi
done

#
# Als een host niet in de blocklist voorkomt, kijk dan of deze minstens =

het
# opgegeven aantal keren in ERRLOG voorkomt; zo ja, voeg de host dan toe=

# aan de blocklist, samen met de datum, en signaleer dat de firewall=20
opnieuw
# gestart moet worden:
#

if [ $MATCH =3D false ]; then
if [ `grep -c $i $ERRLOG` -gt $ERRMIN ]; then
echo $i":"$DATENOW >> $BLOCKLIST
FIRESTART=3Dtrue
fi
fi
done

#
# Voor de automatische expire van hosts in de blocklist wordt alleen=20
gekeken
# naar de datum. Zodra een expired host wordt gevonden, wordt dit=20
gesignaleerd
# om de firewall te kunnen aanpassen. Hosts die niet expired zijn, komen=
=20
in een
# tijdelijk bestand terecht, dat na de for-lus BLOCKLIST vervangt.
# Met de eerste grep-opdracht worden eventuele commentaarregels behouden=
..
#

grep "#" $BLOCKLIST > $BLOCKLIST.tmp
for HOST in `grep -v "^#" $BLOCKLIST`; do
BLOCKDATE=3D`echo $HOST | cut -d : -f 2`
if [ `expr $DATENOW - $BLOCKDATE` -gt $EXPIRE ]; then
FIRESTART=3Dtrue
else
echo $HOST >> $BLOCKLIST.tmp
fi
done
mv $BLOCKLIST.tmp $BLOCKLIST

#
# Als hosts aan de blocklist zijn toegevoegd dan wel hieruit zijn=20
verwijderd,
# moet de firewall opnieuw worden gestart:
#

if $FIRESTART =3D true; then
$FIREWALL
fi

Rene Pijlman
30/12/02, 10:55
Richard Rasker:
>Hierbij in ieder geval de NL-versie van het script.

Dank!

--
René Pijlman

Wat wil jij leren? http://www.leren.nl