Apache walczy ze spamem

Pojęcie spamu znane jest chyba wszystkim administratorom, zazwyczaj spotykamy się z nim w przypadku poczty, ale spam to nie tylko e-maile, to również komentarze na forach, blogach, księgach gości czy stronach internetowych z formularzem kontaktowym. Jak zabrać się do walki ze spamem w przypadku stron WWW? Tradycyjny sposób to budowanie własnych mechanizmów i weryfikowanie źródłowych adresów IP użytkowników, jeśli widzimy, że z jakiegoś konkretnego IP notorycznie pojawiają się reklamy w komentarzach to dodajemy źródło do blacklisty i blokujemy ruch, ale nasza własna baza adresów będzie ograniczona i nie zawsze uda nam się powstrzymać natarczywe roboty, a nikt nie będzie długo prowadził walki z wiatrakami. Osobiście preferują drugą metodę, czyli skorzystać z gotowych mechanizmów.

Doskonałym przykładem narzędzia które pomoże nam w "utrzymaniu czystości" na naszych stronach jest dedykowany moduł dla Apache mod_spamhaus. Zasada działania modułu jest bardzo prosta, a przez to bardzo skuteczna. Moduł wykorzystuje już gotowe bazy DNSBL zawierającą adresatów spamu i przy żądaniach do serwera WWW, weryfikuje IP nadawcy w bazie i podejmuje odpowienią akcję, przepuszcza request lub go blokuje.

Jak wygląda proces sprawdzenia danego IP? Wystarczy odpytać o IP odpowiedniego hosta. Bazy DNSBL jak sama nazwa wskazuje, działają w oparciu o serwery DNS:

Sprawdzane IP: 80.54.97.4, odpytujemy o IP w notacji odwróconej: 4.97.54.80 i dodajemy nazwę bazy DNSBL.

jamzed@makufka:~$ host 4.97.54.80.combined.abuse.ch
4.97.54.80.combined.abuse.ch has address 127.0.0.3
4.97.54.80.combined.abuse.ch has address 127.0.0.2

Jeśli w odpowiedzi na takie zapytanie otrzymamy hosty z przedziału: 127.0.0.0 - 127.0.0.255, oznacza to, że adres występuje w bazie DNSBL i jest zgłoszony jako nadawca spamu.

Instalacja modułu spamhaus sprowadza się do pobrania paczki tar.gz ze strony domowej projektu i jej kompilacji:

root@yoursite:/home/jamzed/Sources# tar zxvf mod-spamhaus-0.7.tar.gz
mod-spamhaus/
mod-spamhaus/ReadMe.txt
mod-spamhaus/LICENSE
mod-spamhaus/Makefile
mod-spamhaus/src/
mod-spamhaus/src/mod_spamhaus.c

Rozpakowane źródła należy teraz skompilować (wymagany jest apxs2, w Ubuntu należy doinstalować paczkę apache2-prefork-dev):

root@yoursite:/home/jamzed/Sources# cd mod-spamhaus
root@yoursite:/home/jamzed/Sources/mod-spamhaus# make

apxs2 -Wc, -Wc,-DDST_CLASS=3 -c src/mod_spamhaus.c
/usr/share/apr-1.0/build/libtool --silent --mode=compile --tag=disable-static i486-linux-gnu-gcc -prefer-pic -DLINUX=2 -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -D_REENTRANT -I/usr/include/apr-1.0 -I/usr/include/openssl -I/usr/include/xmltok -pthread     -I/usr/include/apache2  -I/usr/include/apr-1.0   -I/usr/include/apr-1.0   -DDST_CLASS=3  -c -o src/mod_spamhaus.lo src/mod_spamhaus.c && touch src/mod_spamhaus.slo
/usr/share/apr-1.0/build/libtool --silent --mode=link --tag=disable-static i486-linux-gnu-gcc -o src/mod_spamhaus.la  -rpath /usr/lib/apache2/modules -module -avoid-version    src/mod_spamhaus.lo

write "make install" to install module

root@yoursite:/home/jamzed/Sources/mod-spamhaus# make install
apxs2 -Wc, -Wc,-DDST_CLASS=3 -i -a -n spamhaus src/mod_spamhaus.la
/usr/share/apache2/build/instdso.sh SH_LIBTOOL='/usr/share/apr-1.0/build/libtool' src/mod_spamhaus.la /usr/lib/apache2/modules
/usr/share/apr-1.0/build/libtool --mode=install cp src/mod_spamhaus.la /usr/lib/apache2/modules/
libtool: install: cp src/.libs/mod_spamhaus.so /usr/lib/apache2/modules/mod_spamhaus.so
libtool: install: cp src/.libs/mod_spamhaus.lai /usr/lib/apache2/modules/mod_spamhaus.la
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/sbin" ldconfig -n /usr/lib/apache2/modules
----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib/apache2/modules

Nasz moduł został zainstalowany w lokalizacji: /usr/lib/apache2/modules, teraz należy go skonfigurować i włączyć.

Konfiguracja modułu sprowadza się do stworzenia pliku /etc/apache2/mods-available/spamhaus.conf i umieszczenia w nim następujących informacji:

<IfModule mod_spamhaus.c>
MS_METHODS POST,PUT,OPTIONS,CONNECT
MS_CacheSize 256
</IfModule>

  • MS_METHODS - określamy dla których metod żądań moduł ma sprawdzać IP
  • MS_WhiteList - opcjonalnie możemy podać ścieżkę do pliku z whitelist'ą, adresy IP w nim zamieszczone zawsze będą przepuszczane
  • MS_CacheSize - ilość adresów która będzie w cache i nie będzie konieczności odpytywania za każdym razem baz DNSBL

po stworzeniu konfiguracji, pora dodać moduł do Apache2 (Ubuntu way):

root@yoursite:/etc/apache2/mods-available# echo "LoadModule spamhaus_module /usr/lib/apache2/modules/mod_spamhaus.so" > /etc/apache2/mods-available/spamhaus.load

root@yoursite:/etc/apache2/mods-available# a2enmod

szukamy czy na liście modułów jest spamhaus jeśli jest to wszystko ok, wpisujemy spamhaus i potwierdzamy enterem.

Which module(s) do you want to enable (wildcards ok)?
spamhaus
Enabling module spamhaus.
Run '/etc/init.d/apache2 restart' to activate new configuration!

Pozostaje już zrestartować Apache, jeśli wszystkie powyższe kroki zostały przeprowadzone, nasz moduł powinien działać prawidłowo i odsiewać większość robotów (źródłem informacji jest error_log serwera WWW):

[Fri Feb 26 00:09:05 2010] [crit] [client 80.54.97.4] mod_spamhaus: address 4.97.54.80.sbl-xbl.spamhaus.org is blacklisted. Deny connection to www.varlog.pl/xxxxxx.php, referer: http://www.varlog.pl/yyyyyy.php

Powodzenia w walce ze złem ;-)