LM3.pdf

(299 KB) Pobierz
Layout 1
PROGRAMOWANIE
Python
Python przyjacielem administratora
WĄŻ NA USŁU GACH
Jedną z największych zalet Pythona jest jego prostota.
Pokażemy, w jaki sposób administratorzy
i programiści mogą wykorzystać ten język w pracy z adresami IP i nazwami domenowymi.
ADNS
Konwersja adresów IP znajdujących się w lo-
gach serwerów na nazwy domenowe jest wy-
konywana automatycznie, najczęściej przez
jeden z typowych skryptów korzystających ze
standardowych bibliotek systemowych. Jest
to jednak rozwiązanie najgorsze z możli-
wych, bowiem gethostbyname () może za jed-
nym razem obsłużyć tylko jedno zapytanie
i cały proces trwa bardzo długo, zwłaszcza je-
śli mamy do przerobienia dziesiątki czy na-
wet setki tysięcy adresów.
Znacznie lepiej w tej roli sprawdza się
biblioteka asynchroniczna GNU ADNS [1].
Ma ona szereg zalet, z których najważniejszą
jest możliwość przetwarzania wielu zapytań
równocześnie ze względu na nieblokujący
sposób działania. Biblioteka ta idealnie
sprawdza się w typowych zastosowaniach, na
przykład przy sprawdzaniu nazw hostów czy
poszczególnych rekordów DNS. Wraz z bi-
blioteką rozpowszechnianych jest kilka pro-
gramów narzędziowych, które pozwalają do-
cenić wydajność ADNS.
Bibliotekę i narzędzia instalujemy w Debia-
nie (i klonach, takich jak Ubuntu) poleceniem:
nshost , wersja standardowego programu host,
przeznaczona zwłaszcza do wykorzystania
w skryptach. Prosty przykład użycia adnsres-
filter znajduje się na Listingu 1.
Z kolei pythonowe dowiązania do biblio-
teki ADNS instalujemy poleceniem:
(0, None, 1225824153,
(’80.237.227.144’,))
Początkowe zero oznacza, że zapytanie
powiodło się. None wskazuje, że zapytanie
nie dotyczyło bądź nie zawiera formy kano-
nicznej. Na ostatniej pozycji mamy krotkę
z adresem IP. Z kolei czas odpowiadający
wartości 1225824153 łatwo sprawdzamy za
pomocą poniższej sekwencji:
apt-get install python-adns
Zobaczmy, jak w praktyce wygląda korzy-
stanie z interfejsu do naszej biblioteki; używa-
my w tym celu interpretera Pythona. Najpierw
importujemy moduł i inicjujemy bibliotekę:
import time
time. ctime (1225824153)
import adns
s = adns. init ()
W rezultacie otrzymujemy dokładną datę
i godzinę utraty ważności naszego zapytania.
W ten sposób możemy łatwo skonstru-
ować zapytania dotyczące innych typów re-
kordów, w tym PTR. Aby jednak odwzoro-
wać adresy IP na nazwy domenowe, musimy
pamiętać o odwrotnej notacji z in-addr. arpa .
Przykładowo, jeśli chcemy sprawdzić, czy
faktycznie 127.0.0.1 zostanie odwzorowany
jako localhost , wydajemy polecenie:
Możemy teraz utworzyć zapytanie. Odpo-
wiedź zawsze otrzymujemy w postaci krotki (sta-
tus, CNAME, przedawnienie, odpowiedź właściwa) .
Status oznacza kod błędu, CNAME to nazwa ka-
noniczna (jeśli zapytanie nie odnosi się do niej,
zwracana jest wartość None ), przedawnienie to
czas, kiedy odpowiedź traci wartość, zaś odpo-
wiedź właściwa zawiera krotkę z rekordami, któ-
rych format zależy od zapytania.
Weźmy prosty przykład:
s.synchronous(”1.0.0.127.
in-addr.arpa”, adns. rr. PTR)
apt-get install adns-tools
W rezultacie w systemie zainstalowana
zostaje sama biblioteka wraz z przykładami:
adnslogres , ultraszybka wersja standardowego
logresolve rozprowadzanego wraz z Apache,
adnsresfilter , filtr przepisujący wejście z pod-
mianą adresów IP na nazwy domenowe i ad-
s.synchronous(”linux-magazine.pl”,
adns. rr. A)
W ten sposób możemy łatwo napisać
skrypt sprawdzający nazwy hostów w danej
sieci. Przyjrzyjmy się Listingowi 2. Sprawdza
on po kolei nazwy wszystkich hostów z sieci
213.180.130.* i jeśli znajdzie jakiś adres IP po-
siadający nazwę domenową, wyświetli daną
parę na standardowym wyjściu. Pierwszych
kilka wierszy możemy zobaczyć na Listingu 3.
Oznacza on, że dokonujemy synchro-
nicznego zapytania o rekord DNS A dla do-
meny linux-magazine. pl . Oto, co otrzymamy
w rezultacie:
Listing 1: Prosty przykład użycia filtra adnsresfilter
GeoIP
Geolokalizacja umożliwia – do pewnego
stopnia i w przybliżeniu – określenie fizycz-
nego umiejscowienia danego hosta. Bardzo
$ echo Wykryto skanowanie portów z hosta 217.74.65.119 | adnsfilter
Wykryto skanowanie portów z hosta other. interia. pl
72
NUMER 59 STYCZEŃ 2009
WWW.LINUX-MAGAZINE.PL
751520132.001.png 751520132.002.png
Python
PROGRAMOWANIE
Listing 2: Prosty skrypt sprawdzający nazwy hostów
w danej sieci
Jednak za pomocą bazy GeoLiteCity
i dowiązań do Pythona uzyskujemy znacznie
więcej informacji niewiele większym wysił-
kiem. Przede wszystkim importujemy odpo-
wiedni moduł:
import adns
s = adns. init ()
for i in range (255):
ip = str (i) + “. 130.180.213. in-addr. arpa”
a = s. synchronous (ip, adns. rr. PTR)
if a[3]:
print (ip + “==>” + a[3][0])
import GeoIP
Następnie podajemy ścieżkę do bazy,
którą pobraliśmy ze strony firmy MaxMind:
Listing 3: Fragment wyniku działania skryptu z Li-
stingu 2
geoip_lib = ‘/usr/local/share/
GeoIP/GeoLiteCity. dat’
Następnie otwieramy bibliotekę:
12.130.180.213. in-addr. arpa ==> spubserv. onet. pl
13.130.180.213. in-addr. arpa ==> z3virt. onet. pl
14.130.180.213. in-addr. arpa ==> ckxvirt. onet. pl
17.130.180.213. in-addr. arpa ==> newsgate1. onet. pl
18.130.180.213. in-addr. arpa ==> newsgate. onet. pl
27.130.180.213. in-addr. arpa ==> rtsp. onet. pl
28.130.180.213. in-addr. arpa ==> smtp4. poczta. onet. pl
29.130.180.213. in-addr. arpa ==> smtp3. poczta. onet. pl
30.130.180.213. in-addr. arpa ==> smtp2. poczta. onet. pl
31.130.180.213. in-addr. arpa ==> smtp1. poczta. onet. pl
32.130.180.213. in-addr. arpa ==> smtp5. poczta. onet. pl
33.130.180.213. in-addr. arpa ==> smtp-marlin. poczta. onet. pl
gi = GeoIP. open (geoip_lib, GeoIP.
GEOIP_STANDARD)
Drugi argument powyżej wskazuje na
sposób przechowywania bazy. Oprócz stan-
dardowego mamy też możliwość przechowy-
wania bazy w pamięci podręcznej ( GEO-
IP_MEMORY_CACHE ), przy czym każdy
kraj zajmuje około 1 MB, jak również w pa-
mięci dzielonej ( GEOIP_MEMORY_SHA-
RED ). Wybór zależy od zastosowań – powin-
niśmy go określić podczas testów na danych,
na których będziemy operować.
Samo zapytanie wykonujemy następująco:
często wykorzystują to firmy reklamujące
swoje produkty i usługi w Internecie dla od-
biorców w różnych krajach: nawet jeśli po-
tencjalny klient odwiedza stronę angielskoję-
zyczną, jego uwagę przyciągnie ogłoszenie
w ojczystym języku.
Administratorzy spotykają się z geoloka-
lizacją choćby poprzez skrypty generujące
statystyki na podstawie logów serwera
WWW. Dane te mogą być bardzo istotne,
zwłaszcza dla firm działających globalnie. Je-
śli okaże się, że dynamicznie rośnie liczba
gości z danego kraju, jest to silny argument
za stworzeniem wersji witryny w tym właśnie
języku. Interesująca może być również anali-
za zmian zachowań klientów z różnych kra-
jów na przestrzeni czasu.
Chcąc efektywnie skorzystać z mechani-
zmów geolokalizacji, potrzebujemy przede
wszystkim dobrego narzędzia. Firma Ma-
xMind publikuje bazy geolokalizacyjne
w wersji darmowej i komercyjnej, jak rów-
nież zestaw narzędzi, bibliotek i dowiązań
dla różnych języków – w tym dla Pythona.
Przede wszystkim powinniśmy pobrać dar-
mowe bazy ze strony [1]. Pliki z bazami rozpa-
kowujemy i umieszczamy w katalogu /usr/lo-
cal/share/GeoIP/ . Wystarczy nam jedynie plik
GeoLiteCity. dat – zawiera on bardziej szczegóło-
we dane niż GeoLiteCountry. dat . Oczywiście bar-
dzo zależy nam na dużej dokładności, możemy
wykupić dostęp do baz komercyjnych, jednak
różnice wynoszą kilka dziesiątych procenta.
Następnie instalujemy odpowiedni pa-
kiet. W Debianie robimy to na przykład za
pomocą:
gi. record_by_name (“home. pl”)
Rezultat możemy obejrzeć na Listingu 3.
Jak widzimy, możemy uzyskać całkiem sporo
danych, co oczywiście nie oznacza, że zawsze
są one dokładne. Mimo to bardzo często do-
kładność wyników zwracanych przez zapyta-
nia GeoIP może nas zdziwić.
Na koniec
Python oferuje znacznie więcej narzędzi
związanych z obróbką adresów IP i nazwami
domenowymi; przedstawiliśmy tu jedynie
dwa przykłady zastosowań. Mamy nadzieję,
że zainspirowaliśmy do wykorzystania
przedstawionych w artykule mechanizmów
we własnych skryptach.
Listing 3
{‘city’: ‘Szczecin’, ‘region_name’:
‘Zachodniopomorskie’, ‘region’: ‘87’,
‘area_code’: 0, ‘time_zone’: ‘Euro-
pe/Warsaw’, ‘longitude’:
14.58329963684082, ‘country_code3’:
‘POL’, ‘latitude’:
53.416698455810547, ‘postal_code’:
None, ‘dma_code’: 0, ‘country_code’:
‘PL’, ‘country_name’: ‘Poland’}
apt-get install python-geoip geoip-bin
INFO
W ten sposób instalujemy zarówno narzę-
dzia do sprawdzania hostów, jak i dowiązania do
Pythona. Narzędzie geoiplookup pozwala spraw-
dzić, w jakim kraju znajduje się dany host:
[1] Strona domowa projektu ADNS:
http://www.gnu.org/software/adns/
[2] Darmowe bazy geolokacyjne krajów
i miast: http://www.maxmind.com/app/geoli-
tecountry, http://www.ma-
xmind.com/app/geolitecity
$ geoiplookup mon. gov. pl
GeoIP Country Edition: PL, Poland
WWW.LINUX-MAGAZINE.PL
NUMER 59 STYCZEŃ 2009
73
751520132.003.png 751520132.004.png
Zgłoś jeśli naruszono regulamin