Download: LinuxUser_wirusy
Transkrypt
Download: LinuxUser_wirusy
LINUX USER Wirusy Osobisty filtr antywirusowy Młot na wirusy www.PhotoCase.de W chwili pisania tego artykułu, po świecie krąży po około 20 wersji zwalczających się robaków Bagle i Netsky oraz niedobitki poprzednich epidemii. JANUSZ A. URBANOWICZ P laga sieciowych wirusów komputerowych (robaków) nabiera rozmachu. Codziennie kilkadziesiąt tysięcy użytkowników Microsoft Outlook Express klika na załączniki w otrzymanych mailach, stając się następnymi nosicielami zarazy. Nawał zakaźnych przesyłek zatyka serwery i utrudnia pracę. Koniecznym, choć dość skomplikowanym rozwiązaniem, jest filtrowanie poczty za pomocą programu antywirusowego. Znakomitym programem antywirusowym typu Open Source jest, stworzony przez polskiego programistę Tomasza Kojma, pakiet ClamAV. Prowadzony przez zapaleńców na całym świecie projekt utrzymuje się w czołówce, jeśli chodzi o tempo aktualizacji bazy danych wirusów. Integruje się z większością popularnych otwartych serwerów pocztowych (MUA), rozpakowuje archiwa, weryfikuje podpisy kryptograficzne, potrafi też analizować strumienie OLE. Niestety, z ClamAV nie jest dostarczane gramowania systemowego. Jednak potrzeba jest matką wynalazków i takie rozwiązanie (zresztą dość proste) udało mi się stworzyć. Jego zaletą jest to, że można je wdrożyć w kilkanaście minut, wadą zaś jest brak skalowalności. Nie jest ono zbyt wydajne i nie powinno być stosowane dla więcej niż kilkunastu-kilkudziesięciu użytkowników. Dla większych grup należy zastosować dostarczane z ClamAV rozwiązania pracujące na poziomie oprogramowania serwera pocztowego. Do stworzenia osobistej ochrony antywirusowej potrzebne są: ■ Clam Antivirus [1] ■ procmail [2] ■ maszyna wirtualna języka Python [3] Instalacja ClamAV W idealnej sytuacji najnowsza wersja ClamAV jest dostępna w dystrybucji i jest zainstalowana domyślnie, bądź też można ją zainstalować poleceniem Ramka 1: Uniwersalny plik konfiguracyjny dla clamd i freshclam # apt-get install clamav W przeciwnym wypadku trzeba zainstalować antywirusa samodzielnie. Jeśli jest taka możliwość, optyUser clamav malną metodą używania ClamAV LogSyslog jest korzystanie z usług demona anFixStaleSocket tywirusowego clamd, przez odwołaScanMail nie się do niego programem clamdTCPSocket 3310 scan. Najlepiej zaś zainstalować go DatabaseMirror database.clamav.net zakładajac użytkownika systemoDatabaseDirectory /var/local/lib/clamav wego (oraz grupy) .clamav., z którego uprawnieniami pracować będzie demon. Wymaga to jednak uprawnień użytżadne proste narzędzie, które może zaspokokownika „root”: ić potrzeby pojedynczego użytkownika linuksowego konta pocztowego. Istnieją kombajny filtrujące pocztę dla całego serwera czy #adduser --group clamav domeny (i bardzo dobrze), ja jednak często mam okazję pracować na serwerach, gdzie #adduser --disable-password U nie mogę, bądź nie chcę modyfikować opro--ingroup clamav --system clamav 100 Lipiec 2004 www.linux-magazine.pl #configure --prefix=/usr/local U --sysconfdir=/etc/clamav U --enable-id-check Jeśli ClamAV ma pracować z konta użytkownika, w wywołaniu configure należy podać inne katalogi oraz wyłączyć sprawdzanie istnienia użytkownika clamav: #configure --prefix=~/clamav U --sysconfdir=~/.clamav U --disable-clamav Kompilacja i instalacja programu przebiega standardowo poleceniami make i make install. Binaria ClamAV zostaną umieszczone w katalogu wyspecyfikowanym jako prefix, a wzorcowe pliki konfiguracyjne w katalogu sysconfdir. Domyślnie program używa dwóch plików konfiguracyjnych przechowujących konfigurację dla programów odpowiedzialnych za skanowanie antywirusowe (clamd, clamdscan i clamscan) oraz dla programu freshclam, służącego do aktualizowania bazy sygnatur wirusów. Jednak, ponieważ deklaracje w obu plikach nie kolidują ze sobą, a nawet się pokrywają, można umieścić całą potrzebną konfigurację w jednym pliku i wykonać odpowiednie dowiązanie symboliczne. Uniwersalna konfiguracja dla demona pracującego z UID.clamav. znajduje się w Ramce 1. Przed jego użyciem należy stworzyć katalog /var/local/lib/clamav. Jeśli demon ma być uruchamiany z konta zwykłego użytkownika, plik konfiguracyjny należy zbudować w oparciu o przykład z Ramki 2. Przed uruchomieniem procesu demona dobrze jest uzyskać zgodę administratora systemu, na którym będzie działał clamd. Przed pierwszym uruchomieniem clamd Wirusy Ramka 2: Konfiguracja do pracy z konta użytkownika (~/.clamav/clamav.conf) User <nazwa użytkownika> FixStaleSocket ScanMail TCPSocket 3310 DatabaseMirror database.clamav.net DatabaseDirectory ~/clamav należy pobrać bazę sygnatur wirusów, dzięki którym rozpoznaje on niebezpieczne treści. Służy do tego polecenie freshclam. Aby baza była aktualizowana regularnie, program ten należy uruchamiać okresowo za pomocą usługi cron. W crontabie użytkownika, z którego uprawnieniami będzie działał ClamAV, należy umieścić stosowny wpis. Proces demona powinien uruchamiać się przy starcie systemu. Jeśli demon będzie pracował z uprawnieniami specjalnego użytkownika, można wykorzystać skrypty dostarczane z ClamAV, aby był on uruchamiany przez proces init podczas startu systemu. Jednak prostszym rozwiązaniem jest wykorzystanie usługi cron przez wpisanie do crontab odpowiedniego użytkownika dyrektywy. Bezpośrednio po instalacji ClamAV i pobraniu bazy wirusów wystarczy uruchomić demona przez wydanie komendy clamd. Integracja z procmailem AUTOR Procmail może filtrować przesyłki, uruchamiając program filtrujący i podając przesyłkę na potok standardowego wejścia oraz odbierając przesyłkę do dalszego przetwarzania ze strumienia standardowego wyjścia. Niestety, ClamAV nie dostarcza żadnego narzędzia pracującego w ten sposób. Zarówno clamdscan, jak i clamscan po wczytaniu pliku informują tylko o tym, czy zawiera on wrogi kod. Dodatkowym problemem jest to, że narzędzia ClamAVa nie pracują w prawdziwym trybie klienta-serwera i ignorują uniksowe konwencje (np. tę, że program wywołany bez parametrów powinien czekać na dane ze strumienia stanJanusz A. Urbanowicz zajmuje się Linuksem od 1996 roku. Pracuje w Interdyscyplinarnym Centrum Modelowania Matematycznego i Komputerowego Uniwersytetu Warszawskiego. Specjalizuje się w zagadnieniach bezpieczeństwa sieci i zastosowań kryptografii. dardowego wejścia), konieczne jest więc napisanie „opakowania” (ang. wrappera), które usunie te niedogodności. Dzięki nowoczesnemu językowi programowania, jakim jest Python, stworzenie takiego opakowania nie jest skomplikowane. Podstawowym zadaniem takiego opakowania jest praca w trybie filtra-gąbki: pobranie ze strumienia wejścia treści przesyłki, przeskanowanie jej za pomocą clamdscan i, jeśli nie zawiera ona wrogiego kodu, przekazanie jej na standardowe wyjście. Określenie „gąbka” oznacza zaś, że zanim filtr przystąpi do przetwarzania, czeka najpierw na całość danych. Całość kodu „opakowania” obejrzeć można w Ramce 3. Działanie „opakowania”, któremu nadałem nazwę clamailfilter, obejmuje dodatkowy krok – ponieważ poczta jest chyba najistotniejszą sieciową usługą komunikacyjną, nie można dopuścić do przypadkowego ginięcia przesyłek w razie awarii programu antywirusowego. Dlatego też po przekazaniu treści przesyłki do antywirusa sprawdzany jest zwrócony kod błędu. Jeśli oznacza on brak komunikacji z clamd, wówczas treść przekazywana jest do strumienia wyjścia. Przesyłka nie jest sprawdzona na obecność zarazy, ale istotniejsze jest to, aby nie zaginęła bez wieści. Jeśli nie można skorzystać z demona clamd, wówczas drugą linię clamailfiltera należy zmodyfikować następująco: CLAMSCAN='/usr/local/bin/U clamscan --detect-encrypted U --mbox --quiet -' Dzięki tej modyfikacji wykorzystywane jest polecenie skanujące clamscan, które nie odwołuje się do clamd. Niestety, takie rozwiązanie powoduje gwałtowny spadek wydajności. Przeskanowanie jednego pliku clamdscanem trwa ułamek sekundy, clamscanem zaś kilka sekund, gdyż każde wywołanie programu wiąże się z załadowaniem od nowa całej bazy sygnatur wirusów. Nie należy więc tego rozwiązania używać na wolniejszych serwerach ani też dla więcej niż kilku (<10) użytkowników. Lepiej uzgodnić z administratorem systemu instalację dostępnego dla wszystkich demona clamd. Ostatnim etapem jest włączenie clamailfiltera w konfiguracji przetwarzania poczty na koncie. Większość dystrybucji domyślnie używa procmaila do dostarcza- LINUX USER Ramka 3: Program clamailfilter #! /usr/bin/env python import sys,os CLAMSCAN = '/usr/local/bin/clamdscan --mbox --quiet -' input = sys.stdin.read() stream = os.popen(CLAMSCAN,'w') try: stream.write(input) except IOError: sys.stdout.write(input) sys.exit(2) rc = stream.close() if rc == None: code = 0 else: code = (rc & 65280)/ 256 if code == 0 or code == 2: sys.stdout.write(input) sys.exit(0) sys.exit(1) nia poczty do skrzynek, wystarczy wtedy jako pierwszą regułę w ~/.procmailrc wpisać poniższe trzy linie (ostatnia jest pusta i jest konieczna do poprawnego działania reguły): :0f |clamailfilter < pusta linia > Reguła ta oznacza, że wszystkie przetwarzane listy należy przekazać w całości na wejście clamailfiltera. Jeśli przesyłka zawiera wirusy, clamailfilter nie zwróci jej do dalszego przetwarzania. Jeśli zaś procmail nie jest domyślnie używany przez system pocztowy, trzeba jeszcze włączyć przetwarzanie dostarczanej poczty. Robi się to przez umieszczenie w pliku ~/.forward reguły |procmail. I to już wszystko. Gotowe. ■ INFO [1] Clam AntiVirus: http://clamav.net/ [2] Procmail: http://procmail.org/ [3] Python: http://python.org/ www.linux-magazine.pl Lipiec 2004 101