piątek, 23 października 2009

Jak zablokować dostęp do strony WWW dla poszczególnych krajów? [.htaccess]

Czasem zdarza się, że chcemy, aby nasza strona internetowa była np. dostępna tylko dla internautów z Polski. Mogliśmy na przykład podpisać umowę z dostawcami treści, którzy zakazują nam udostępniania ich materiałów poza Rzeczpospolitą. Jak rozwiązać taki problem?

Dla osób korzystających z serwera Apache, pomocą okaże się odpowiednie przygotowanie pliku .htaccess. Ręcznie tego raczej jednak nie zrobimy: przygotowanie odpowiedniego ciągu zablokowanych adresów IP to niezwykle nużące zadanie. Dlatego możemy skorzystać z API geolokalizacji IP, dostarczanego przez serwis blogama.org oraz specjalnego skryptu, który wygeneruje nam plik dostępowy.

Wpierw jednak należy zrozumieć, jak działają reguły w pliku .htaccess. Jeśli ustawimy własność allow dla krajów "PL, DE" (Polska i Niemcy), dopuszczony będzie tylko ruch przychodzący z Polski i Niemiec. Jeśli ustawimy własność deny dla "US, CA", zablokowany będzie tylko ruch przychodzący ze Stanów Zjednoczonych i Kanady.

Wygenerowanie pliku .htaccess za pomocą API geolokalizacji IP jest bardzo proste – usługa dostępna jest pod adresem iplocationtools.com. Przykładowo wygenerowany plik .htaccess może wyglądać następująco:

iplocationtools.com/country_query.php?country=PL&output=htaccess_allow

gdzie parametr country określa listę kodów krajów, oddzielonych od siebie przecinkami, zaś output to typ blokowania.

W rezultacie otrzymamy plik wyglądający następująco:

#COUNTRY_BLOCK_START



order deny,allow
allow from 57.66.162.0/24
allow from 57.66.195.0/26
allow from 57.66.195.64/27
allow from 57.66.195.96/28

[…]

deny from all



#COUNTRY_BLOCK_END



Jednak bloki IP często przechodzą z rąk do rąk. Generowanie za każdym razem pliku .htaccess mogłoby się okazać niewygodne. Pomóc może nam skrypt, stworzony przez autorów mechanizmu geolokalizacji z blogama.org.

Zanim go uruchomimy, należy w katalogu roboczym z którego korzystamy stworzyć plik htaccessfile.txt, do którego wprowadzamy wszystkie ścieżki dostępowe do plików .htacces, które chcemy zmieniać. Na przykład:

/var/www/mojblog.pl/.htaccess
/var/www/mojafirma.pl/.htaccess

W samym skrypcie na początku można znaleźć parametry konfiguracyjne:

WORKDIR="/var/www/" – katalog z prawami zapisu, w którym umieszczony jest skrypt,
HTACCESSFILE="htaccessfile.txt" – plik ze ścieżkami dostępu do plików .htaccess,
HTACCESSBLOCK="htaccess-blocklist.txt" – plik roboczy,
TEMPFILE="htaccess.temp" – plik roboczy,
COUNTRIES="PL" – lista krajów,
TYPE="allow" – typ dostępu: ekskluzywny (allow) lub inkluzywny (deny).

Następnie należy nadać skryptowi prawa wykonawcze:
chmod +x nazwaskryptu.sh


i dodać go do crontabu

* * * * * /ścieżka/nazwaskryptu.sh >/dev/null 2>&1



Dzięki temu będziemy mogli regularnie aktualizować bazę zablokowanych (bądź dopuszczonych) adresów.

A oto wspomiany skrypt:
#!/bin/bash
###BLOGAMA.ORG###
###MODIFY THIS SECTION###
WORKDIR="/var/www/"
HTACCESSFILE="htaccessfile.txt"
HTACCESSBLOCK="htaccess-blocklist.txt"
TEMPFILE="htaccess.temp"
COUNTRIES="PL"
TYPE="allow"
#########################
#####DO NOT MAKE MODIFICATIONS BELOW#####
cd $WORKDIR
#Get the file from blogama.org API
wget -c --output-document=$HTACCESSBLOCK "http://blogama.org/country_query.php?country=$COUNTRIES&output=htaccess_$TYPE"
for i in $( cat $WORKDIR$HTACCESSFILE ); do
if [ -f $i ]; then
cat $i 2>&1 | grep "COUNTRY_BLOCK_START"
if [ "$?" -ne "1" ]; then #ALREADY IN HTACCESS
sed '/#COUNTRY_BLOCK_START/,/#COUNTRY_BLOCK_END/d' $i > $WORKDIR$TEMPFILE
cat $WORKDIR$HTACCESSBLOCK >> $WORKDIR$TEMPFILE
mv $WORKDIR$TEMPFILE $i
else #NOT IN HTACCESS
cat $WORKDIR$HTACCESSBLOCK >> $i
fi
fi
done
rm -f $WORKDIR$HTACCESSBLOCK

1 komentarz: