MervDePerv

czerwiec 6, 2010

samba + clamav (vscan, skanowanie on_access)

Opublikowane jako: Linux — naza @ 11:07 po południu

Aktualnie skanowanie on_access w sambie to dla wielu problem. Dlaczego? Wydaje mi się, że odpowiedź jest prosta – projekt http://www.openantivirus.org/ nie jest rozwijany od … 2005-08-24 tego dnia ukazała się ostatnia paczka samba-vscan-0.3.6b.tar.bz2. Teraz pytanie czy tak stary projekt będzie działał z najnowszymi dystrybucjami, wersjami Samby czy Clama? Odpowiedź : jak najbardziej TAK. Chwila kombinacji, parę zabiegów i możemy się cieszyć z serwera Samby z skanowaniem on_acces(takowy uruchomiłem w dużej instytucji – około 200 stacji z profilami użytkowników). Przy pierwszej instalacji wzorowałem się tym poradnikiem http://clamav.skc.com.pl/howtos/samba_clamav.html. Wiele rzeczy będzie podobnych jednak sam poradnik też jest trochę przestarzały. W razie jakichś pytań, problemów w miarę możliwości oraz umiejętności postaram się pomóc. Ale od początku.

    1 . Dystrybucja

      Całość zainstalowałem oraz uruchomiłem na Fedora 12. Aczkolwiek dla tego artykułu oraz moich potrzeb skonfigurowałem to na dystrybucji openSuse 11.2. Podczas instalacji nie zaznaczmy “serwer plików” oraz zaznaczmy “c/c++ library”.
    2 . Instalacja Samby

      Z najnowszymi wersjami Samby uruchomienie modułu(pomimo pomyślne kompilacji) nie powiedzie się. Spędziłem trochę czasu i nie znalazłem rozwiązania. Jeśli komuś się uda zainstalować vscana z najnowszą wersją samby to mógłby się podzielić ze mną tą wiedzą. :) Wersja Samby, na której moduł vscan-clamav działa stabilnie i bezproblemowo to Samba 3.2.5, którą możemy pobrać tutaj: http://ppp.samba.org/samba/ftp/old-versions/samba-3.2.5.tar.gz. Zatem do dzieła.

      Na początek usuńmy aktualną wersję Samby z systemu:
      osiol:/# yast --remove samba

      Pobieramy, rozpakowujemy, oraz instalujemy Sambę. Ważne by podczas uruchamiania ./configure dodać opcję –with-vfs:

      osiol:/# wget http://ppp.samba.org/samba/ftp/old-versions/samba-3.2.5.tar.gz
      osiol:/# tar xzfv samba-3.2.5.tar.gz
      osiol:/# cd samba-3.2.5/source/
      osiol:/# CFLAGS="-march=i686 -mcpu=i686" ./configure --with-fhs --prefix=/usr --localstatedir=/var
      --bindir=/usr/bin --sbindir=/usr/sbin --with-lockdir=/var/cache/samba --sysconfdir=/etc
      --with-configdir=/etc/samba --with-privatedir=/etc/samba/private --with-codepagedir=/etc/codepages
      --with-smbmount --with-syslog --with-utmp --with-sambabook=/usr/share/swat/using_samba
      --with-ssl --with-sslinc=/usr/include/openssl --with-ssllib=/usr --with-msdfs --with-vfs
      osiol:/# make
      osiol:/# make install

      Na koniec tworzymy katalog dla logów oraz plik konfiguracyjny Samby. Pod tym odnośnikiem można podejrzeć mój config.

      osiol:/# mkdir /var/log/samba
      osiol:/# nano /etc/samba/smb.conf
    3. Instalacja modułu vscan – clamav

      Pobieramy moduł oraz rozpakowujemy go:
      osiol:/# wget http://downloads.sourceforge.net/project/openantivirus/samba-vscan/0.3.6b/samba-vscan-0.3.6b.tar.bz2?use_mirror=ignum
      osiol:/# tar xvfj samba-vscan-0.3.6b.tar.bz2

      Niestety dla wersji Samby od 3 w górę potrzebne są nam patche. Patche można pobrać z sieci np z tej stronki. Ja umieszczam je u siebie w jednej paczce, do pobrania tu. Patchowania wykonujemy w poniższej kolejności:

      osiol:/# wget http://lordkavkol.webpark.pl/patches.tar.gz
      osiol:/# tar xvzf patches.tar.gz
      osiol:/# patch -p0 < 0.3.6c.diff
      osiol:/# patch -p0 < installperms.diff
      osiol:/# patch -p0 < bool_type.diff
      osiol:/# patch -p0 < pstring.diff
      osiol:/# patch -p0 < SMB_VFS_NEXT_CLOSE-args.diff
      osiol:/# patch -p0 < pm_process_additional_fourth_arg.diff
      osiol:/# patch -p0 < Makefile.in.diff
      osiol:/# patch -p0 < last.diff 

      Ważną sprawą jest zmiana w pliku clamav/vscan-clamav.h zmienić ścieżkę socketu clama:

      #define VSCAN_CLAMD_SOCKET_NAME      "/var/run/clamd"
      na
      #define VSCAN_CLAMD_SOCKET_NAME      "/var/run/clamav/clamd.sock"

      Teraz możemy przejść do kompilacji. Ważne by podczas wykonywania polecenia configure podać ścieżkę do prze kompilowanych źródeł Samby.

      osiol:/# ./configure --prefix=/usr --with-samba-source=/home/naza/samba-3.2.5/source/
      osiol:/# make clamav

      Gdy mamy skompilowany moduł wystarczy przekopiować go w odpowiednie miejsce(podam dwa gdyby były problemy), oraz stworzyć plik konfiguracyjny modułu vscan-clamav. Na temat opcji w pliku nie będę się rozpisywał. Stronka, którą przytoczyłem na początku zawiera dokładny opis. Od siebie dodam, że większość opcji u mnie po prostu nie działa… Mój config.

      osiol:/# cp vscan-clamav.so /usr/lib/vfs/
      osiol:/# cp vscan-clamav.so /usr/lib/
      osiol:/# nano /etc/samba/vscan-clamav.conf
    4. Instalacja Clamav

      Standardowa instalacja. Tworzymy grupę oraz użytkownika clamav, pobieramy najnowsze źródła, kompilujemy.
      osiol:/# wget http://downloads.sourceforge.net/clamav/clamav-0.96.1.tar.gz
      osiol:/# tar xzvf clamav-0.96.1.tar.gz
      osiol:/# cd clamav-0.96.1/
      osiol:/# groupadd clamav
      osiol:/# useradd -g clamav -s /bin/false -c "Clam" clamav
      osiol:/# ./configure --prefix=/usr --sysconfdir=/etc/clamav --datadir=/etc/clamav --with dbdir=/etc/clamav
      osiol:/# make
      osiol:/# make install

      Edytujemy plik konfiguracyjny Clama, odnajdujemy parametr LocalSocket i ustawiamy mu wartość:

      LocalSocket /var/run/clamav/clamd.sock

      Na koniec tworzymy katalog dla socketu, nadajemy mu prawa i aktualizujemy Clama:

      osiol:/# mkdir /var/run/clamav
      osiol:/# chown -R clamav:clamav /var/run/clamav
      osiol:/# freschclam
    5. Skrypty Uruchomieniowe

      W linkach zamieszczam skrypty startowe dla Clama i Samby. Skrypt Samby uruchamia Clama.

      samba-vscan

      clamd

      Kopiujemy je oraz nadajemy im prawa do uruchamiania:
      osiol:/# nano /etc/init.d/samba_clamav
      osiol:/# nano /etc/init.d/clamd
      osiol:/# chmod +x /etc/init.d/samba_clamav
      osiol:/# chmod +x /etc/init.d/clamd
    6. Konfiguracja udziałów Samby

      W pliku konfiguracyjnym Samby wystarczy dodać poniższe dwie linijki(pogrubione) do dowolnego udziału, który ma być objęty ochroną antywirusową:
      [test]
         comment = test
         path = /home/naza
         vfs object = vscan-clamav
         vscan-clamav: config-file = /etc/samba/vscan-clamav.conf
      
    7. Sprawdzanie poprawności działania

      Gdy wszystko pójdzie ok w logu Samby dla konkretnego klienta podłączonego do serwera powinniśmy ujrzeć mniej więcej coś takiego:
      [2010/06/06 22:49:25,  2] auth/auth.c:check_ntlm_password(308) check_ntlm_password:
      authentication for user [naza] -> [naza] -> [naza] succeeded
      [2010/06/06 22:49:25,  2] lib/module.c:do_smb_load_module(64)
      Module '/usr/lib/vfs/vscan-clamav.so' loaded
    8. Przenoszenie wirusa do kwarantanny

      Niestety z nieznanych mi przyczyn opcja by w momencie wykrycia wirusa przeniesiono go do kwarantanny nie działa. Przy wyżej opisanej konfiguracji w momencie znalezienia wirusa plik zostanie zablokowany. Postanowiłem jednak w jakiś sposób to zrobić. Poniżej przedstawiam swoje rozwiązanie z wykorzystaniem prostego skryptu napisanego w perlu.

      Zaczynamy od stworzenie katalogu dla kwarantanny oraz pliku z logami.
      osiol:/# mkdir /home/kwarantanna/
      osiol:/# touch /var/log/znalezione_wirusy.log

      Następnie kopiujemy poniższy skrypt na dysk:

      #!/usr/bin/perl
      # nazwa wirusa
      $wirus = shift;
      # ścieżka do pliku z logami skryptu
      $log = "/var/log/znalezione_wirusy.log";
      open(PLIK, ">>".$log) || die "Nie można otworzyć pliku z logami.";
      # ścieżka do pliku z logami clamd
      $clamd_log = "/var/log/clamd.log";
      # ścieżka do katalogu kwarantanny
      $kwarantanna="/home/kwarantanna/";
      #przedrostek dla wirusów
      $przedrostek = "vir-";
      #scieżka do pliku maila
      $mail_path = "/home/mail.txt";
      # wyzanczenie daty
      @months = qw(Sty Lut Marz Kwie Maj Cze Lip Sier Wrze Paz List Grudz);
      @weekDays = qw(Ndz Pon Wt Sr Czw Pt Sob Ndz);
      ($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();
      $year = 1900 + $yearOffset;
      $theTime = "$hour:$minute:$second-$weekDays[$dayOfWeek]-$months[$month]-$dayOfMonth-$year";
      $data = $theTime;
      
      $tmp = qx[tail -n 1 $clamd_log];
      @tmp2 = split(":", $tmp);
      
      $lokalizacja_wirusa = @tmp2[0];
      
      $cmd = "mv ".$lokalizacja_wirusa." ".$kwarantanna.$przedrostek.$data.$wirus;
      
      @go = qx[$cmd];
      
      # stworzenie loga
      $msg = $data." Wykonano: ".$cmd.". Z skutkiem : ".@go[0].@go[1].".\n";
      # dodanie loga do pliku logów
      print PLIK $msg;
      close PLIK;
      
      # wysłanie e-maila mozna użyc - wymaga jednak zainstalowania programu nail
      # w momencie znalezienia wirusa zostanie wyslany e-mail
      open(mail, ">".$mail_path);
      print mail $msg;
      close mail;
      
      qx['set smtp-auth=login'];
      qx['set smtp-auth-user=mail@wp.pl'];
      qx['set smtp-auth-password=paSw0rd'];
      
      $cmd = 'nail -s "Wykryto wirusa" -S smtp=smtp.poczta.onet.pl
      -S from="mail@op.pl" -S smtp-auth=login -S smtp-auth-user=mail@op.pl
      -S smtp-auth-password=paSw0rd odbiorca@poczty.pl < '.$mail_path;
      $ok = qx[$cmd];
      
      exit;

      Następnie w pliku konfiguracyjnym Clama odnajdujemy sekcje VirusEvent i ustawiamy w niej ścieżkę do skryptu perla:

      VirusEvent /home/naza/kwarantanna.pl "%v"

      Gdy tak skonfigurujemy całość W momencie wykrycia wirusa zostanie on przeniesiony z nową nazwą “przedrostek”-data do zdefiniowanego przez nas katalogu. Dodatkowo pokazałem też jak wysłać maila z informacją o wirusie.

Wspierane przez NETMARK Hosting