samba + clamav (vscan, skanowanie on_access)
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ą.
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.