Postfix + MySQL + SASL2 + Squirrelmail+Amavisd+Clamav
Jeżeli nie jesteś w stanie samodzielnie skonfigurować poczty, lub potrzebujesz solidnego, elastycznego niezawodnego, stabilnego serwera e-mail i poszukujesz administratora który jest w stanie go uruchomić to jestem do dyspozycji.
Cena za skonfigurowanie serwera wg. niniejszego opisu: 1000 zł
W ramach usługi zapewniam cztery tygodnie pomocy technicznej.
Jedyne czego wymagam to uruchomienie maszyny z "czystym" Linuksem wraz z możliwością zdalnej pracy przez ssh.
Wskazana i polecana przez mnie dystrybucja to GENTOO.
Zainteresowanych zapraszam do kontaktu poprzez e-mail - adres w stopce.
UWAGA!
W ramach "wakacyjnej promocji" - mam troche czasu ostanio - obnizam cene konfiguracji serwera pocztowego do 500 zl. W ramach tej kwoty
oferuje tydzien pomocy technicznej.
Historia aktualizacji:
- 10 marca 2006r.
Właściwie to nie ma co aktualizować bo nic się nie zmieniło, można stosować się do poniższych
instrukcji w odniesieniu do najnowszych wersji oprogramowania :)
- 18 sierpień 2005r.
Uwzględniono zmiany związane z pojawieniem się nowszej wersji pakietu courier-imap, od teraz wymagany jest również pakiet courier-authlib.
Aktualnie konfiguracjia została przetestowana na następujących wersjach oprogramowania:
courier-authlib-0.57
courier-imap-4.0.4.
postfix-2.1.5-r2
- 11 grudzień 2004r.
Uwzględniono niewielkie zmiany związane z pojawieniem się nowszyszej wersji postfiksa.
Aktualnie konfiguracja została przetestowana na następujących wersjach oprogramowania:
cyrus-sasl-2.1.20
postfix-2.1.5-r1
courier-imap-3.0.8
Proszę zgłaszać wszelkie nieścisłości i błędy ponieważ nie miałem czasu przeczytać tego jeszcze raz dokładnie :)
- 12 kwiecień 2004 r.
Uwzględniono zmiany związane z pojawieniem się nowszych wersji oprogramowania.
Atkualnie dokument dotyczy:
postfix: 2.0.19
sasl2: cyrus-sasl-2.1.18
courier-imap-3.0.3
Podziękowania dla Roberta Wanata za informacje i Sebastiana Leśniewskiego
za ich zweryfikowanie i przetestowanie.
Opis ten jest efektem wielogodzinnego poszukiwania materiałów w sieci eksperymentów. To, co możecie tutaj przeczytać to kompilacja tego wszystkiego, część z materiału jest wręcz luźnym
tłumaczeniem z HOWTO które można znaleźć pod adresem www.postfix.org/docs.html.
Bardzo proszę o zgłaszanie wszelkich uwag, zwłaszcza błędów i niedoróbek. Za każde sugestie będę bardzo wdzięczny i oczywiście wprowadzę w tym tekście odpowiednie korekty.
Kontakt ze mną
grzegorz@zsp2.edu.pl
Korzystałem z następujących źródeł:
W przypadku problemów, w pierwszej kolejności odsyłam na www.google.pl, oraz do
dokumentacji.
Najczęstsze pojawiające się błędy to literówki w plikach konfiguracyjnych oraz błędy przy kompilacji powstałe na wskutek
braku lub niestandardowej lokalizacji bibliotek msyql-a, w tym dość często bibliotek mysqlclient.
Najwięcej powiedzą Ci w tej kwestii logi.
Zaznaczam również, że opis ten jest przeznaczony dla średniozaawansowanego użytkownika, który podstawową
konfigurację postfiksa ma już za sobą i zna MySQL-a, jeżeli tak nie jest to CZYTASZ NIE TO CO TRZEBA i odsyłam do
świetnego artykułu poświęconego konfiguracji poczty znajdującego się pod adresem
www.linio.terramail.pl, oraz pierwszego lepszego kursu MySQL-a, jakich jest
pełno w Internecie.
Życzę powodzenia, przyda Ci się :)
Uwaga dla użytkowników dystrybucji Gentoo:
Konfiguracja przebiega identycznie za wyjątkiem oczywiście instalacji całego oprogramowania. Instalujemy wszystko
przy pomocy emerge pamietając o włączeniu odpowiednich flag USE. Inna będzie też oczywiście
lokalizacja plików konfiguracyjych i skryptów startowych, ale napewno sobie z tym poradzisz.
Generalnie w Gentoo wszystko jest tak poukładane że łatwo to rozgryźć :)
- Instalujemy MySQL.
Zrób to tak, jak się to powinno robić w dystrybucji, której używasz. Zaznaczam, że należy zainstalować zarówno
wszystkie pakiety dla serwera baz danych, jak również pakiet mysqlclient. Od istnienia odpowiednich bibliotek i ich
położenia we właściwym miejscu zależy poprawność konfiguracji i kompilacji interesującego nas oprogramowania.
- Ściągamy źródła CYRUS-SASL2 i Kompilujemy z następującymi opcjami:
./configure --enable-sql --enable-login --enable-plain --with-gnu-ld --with-saslauthd --with-mysql --with-pam
make
make install
- Ściągamy źródła POSTFIKSA i Kompilujemy z następującymi opcjami:
make makefiles AUXLIBS="-L/usr/local/lib -lsasl2 -L/usr/lib/mysql -lmysqlclient -lz -lm"
CCARGS="-DUSE_SASL_AUTH -I/usr/local/include/sasl -DHAS_MYSQL -I/usr/include/mysql"
Następnie
make
make install
- MySQL: należy pamiętać, aby włączyć hasło dla administratora serwera baz danych:
USE mysql;
UPDATE user SET Password = PASSWORD('hasloadministratoramysql') WHERE user = 'root';
Tworzymy nowego użytkownika o nazwie postfix, który może logować się tylko z localhost używając hasła "postfix".
USE mysql;
INSERT INTO user (Host, User, Password) VALUES ('localhost','postfix',password('hasłodobazy'));
Określamy dostęp z localhost do bazy danych postfix użytkownika postfix z prawem do "wybierania danych":
INSERT INTO db (Host, Db, User, Select_priv) VALUES ('localhost','postfix','postfix','Y');
Przeładowujemy uprawnienia poleceniem:
FLUSH PRIVILEGES;
Tworzymy bazę danych postfix:
CREATE DATABASE postfix;
Tworzymy trzy tabele. Wszystkie zawierają informacje dla Postfiksa, a niektóre dla Courier-IMAP.
Tworzymy tabelę "alias"
USE postfix;
CREATE TABLE alias (
address varchar(255) NOT NULL default '',
goto text NOT NULL,
PRIMARY KEY (address)
) TYPE=MyISAM COMMENT='Virtual Aliases - mysql_virtual_alias_maps';
Postfix korzysta z kolumny "address" i "goto", Courer nie używa tej
tabeli.
Ta tabela będzie używana w celu definiowania aliasów pocztowych. Jest to zamiennik pliku
/etc/postfix/aliases.
Tworzymy tabelę "domain":
USE postfix;
CREATE TABLE domain (
domain varchar(255) NOT NULL default '',
description varchar(255) NOT NULL default '',
PRIMARY KEY (domain)
) TYPE=MyISAM COMMENT='Virtual Domains - mysql_virtual_domains_maps';
Postfix używa columny "domain" i "description". Courier nie używa tej tabeli.
Wpisujemy tutaj wszystkie domeny wirtualne, jakie mają być obsługiwane przez postfiksa.
Tworzymy tabelę "mailbox"
USE postfix;
CREATE TABLE mailbox (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
name varchar(255) NOT NULL default '',
transport varchar(9) NOT NULL default 'virtual',
PRIMARY KEY (username)
) TYPE=MyISAM COMMENT='Virtual Mailboxes - mysql_virtual_mailbox_maps';
username: przechowujemy pełne adresy email użytkowników,
password: wiadomo ;-)
name: opis użytkownika np. imię i nazwisko
transport: przydaje się w przypadku gdy chcemy mieć konta systemowe i wirtualne równocześnie.
Konto virtualne: Należy wypełnić wszyskie pola, pole transport powinno mieć wartość 'virtual'
Konto shellowe Należy wypełnić pola: username, name, transport. Pole transport powinno mieć wartość 'local'.
Postfix używa column: "username", i "transport".
Courier używa "username", "password", "name", skrzynki będą miały
taką samą nazwę jak e-mail użytkownika (czyli ich nazwa będzie
pobierana z kolumny username).
Saslowi potrzebne są kolumny "username" i "password".
Wstawiamy dane do bazy:
USE postfix;
INSERT INTO domain (domain,description) VALUES ('domena.pl','Nasza Domena');
INSERT INTO alias (address,goto) VALUES ('alias@domena.pl', 'użytkownik@domena.pl');
INSERT INTO mailbox (username,password,name,transport) VALUES
('użytkownik@domena.pl','haslo','Użytkownik','virtual');
INSERT INTO mailbox (username,name,transport) VALUES
('użytkownik_shell@domena.pl','konto shellowe','local');
- Konfiguracja postfiksa:
Ograniczę się tylko do wpisów dotyczących konfiguracji MySQL i SASL, jeżeli chodzi o podstawy
odsyłam na stronę www.linio.terramail.pl. Należy pamiętać, aby domeny
wirtualnej która zostanie
umieszczona w bazie nie dopisywać do mydestination.
No i jeszcze jedna sprawa, ponieważ courier-imap operuje na skrzynkach
pocztowych w postaci maildir a nie "mailbox", "ustawiamy":
home_mailbox = Maildir/
Do pliku /etc/postfix/main.cf dopisujemy:
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_alias_domains = $virtual_alias_maps
virtual_uid_maps = static:507
virtual_gid_maps = static:510
virtual_minimum_uid = 507
W miejsce "507" nalezy wpisać UID użytkownika postfix, a zamiast
"510" GID grupy postfix.
virtual_mailbox_base = /var/spool/mail/virtual
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_limit = 51200000
transport_maps = mysql:/etc/postfix/mysql_transport.cf
Tworzymy plik /etc/postfix/ mysql_virtual_alias_maps.cf
user = postfix
password = haslodobazy
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address
Tworzymy plik mysql_virtual_domains_maps.cf
user = postfix
password = haslodobazy
hosts = localhost
dbname = postfix
table = domain
select_field = description
where_field = domain
Tworzymy plik mysql_virtual_mailbox_maps.cf
user = postfix
password = haslodobazy
hosts = localhost
dbname = postfix
table = mailbox
select_field = concat(username,'/')
where_field = username
Tutaj mały komentarz do wpisu "select_field = concat(username,'/')": musimy zdefiniować nazwę skrzynki (maildir-a), nie mamy oddzielnej kolumny na to, ale skrzynki nazywać się będą tak jak brzmią e-maile poszczególnych użytkowników. Dlatego nazwy skrzynek "wybieramy" z kolumny username.
Nazwy skrzynek muszą być w postaci "skrzynka/", więc korzystamy z funkcji "contant(username,"/")" która łączy dwa ciągi w jeden (do e-maila doklejamy "/") i w ten sposób otrzymujemy nazwę skrzynki w postacji user@domena/.
Tworzymy plik mysql_transport.cf
user = postfix
password = haslodobazy
hosts = localhost
dbname = postfix
table = mailbox
select_field = transport
where_field = username
Teraz zmieniamy właściciela tych plików na "postfix" i nadajemy prawa w taki sposób aby nikt poza użytkownikiem
"postfix" nie mógł ich odczytać. Chronimy w ten sposób nasze hasło.
- Instalalujemy Courier-Imap:
Pobieramy pakiet: courier-imap (pakiet z serwerami pop3 oraz IMAP) w wersji co najmniej 4.0.4 oraz
courier-authlib (biblioteki odpowiedzialne za autoryzację) w wersji co najmniej 0.57.
Rozpakowujemy je, następnie z każdym z nich postępujemy tak samo
wpisjąc polecenia:
będąc zalogowani jako zwykły użytkownik (nie root)
./configure
Teraz jako root:
make
make install
Jeżeli mamy zainstalowany MySQL to zostanie on wykryty i Courier zostanie spompilowany z jego obsługą.
Courier-authlib instaluje się w katalogu /usr/local/lib/courier-authlib/.
Konfigurację znajdziesz w katalogu: /usr/local/etc/authlib, tam też powinny być dwa pliki: authdaemonrc.dist i authmysqlrc.dist. Zmień ich nazwy na odpowiedznio: authdaemonrc i authmysqlrc.
Skrypty startowe będą w /usr/local/libexec/courier-authlib.
Courier-imap domyślnie instaluje się w katalogu /usr/lib/courier-imap/
katalog z plikami konfiguracyjnymi to /usr/lib/courier-imap/etc
katalog z ze skryptami uruchamiającymi daemony: /usr/lib/courier-imap/libexec/
W katalogach /usr/lib/courier-imap/etc oraz /usr/local/etc/authlib znajduje się szereg przykładowych plików konfiguracyjnych *.dist, wykonujemy polecenia:
mv imapd-ssl.dist imapd-ssl
mv imapd.cnf.dist imapd.cnf
mv imapd.dist imapd
mv pop3d-ssl.dist pop3d-ssl
mv pop3d.cnf.dist pop3d.cnf
mv pop3d.dist pop3d
Pierwszym plikiem który zmienimy będzie authmysqlrc gdzie konfiguruje się opcje
autoryzacji przez mysql:
MYSQL_SERVER localhost
MYSQL_USERNAME postfix
MYSQL_PASSWORD hasłodobazy
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_CLEAR_PWFIELD password
DEFAULT_DOMAIN domenadomyslna
Domena, która będzie "doklejana do nazwy użytkownika, w przeciwnym razie trzeba podać jak nazwę user@domena.pl
MYSQL_UID_FIELD '507'
MYSQL_GID_FIELD '510'
Zamiast tych liczb wstawiamy odpowiednia UID użytkownika postfix i GID grupy postfix.
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD '/var/spool/mail/virtual/'
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD concat(username,'/')
Teraz zaglądamy do plików pop3d i imapd a tam sprawdzamy poprawność wpisów (podaję prawidłowe wartośći):
MAILDIRPATH=Maildir
MAILDIR=Maildir
Dodatkowo sprawdzimy jeszcze czy w pliku authdaemonrc znajduje się następujący wpis:
authmodulelist="authcustom authcram authuserdb authmysql authpam"
Jeżeli go nie ma to dopisujemy co trzeba.
- Konfigurujemy SASL2:
Tworzymy link z /usr/local/lib/sasl2 do /usr/lib/sasl2:
ln -s /usr/local/lib/sasl2 /usr/lib/sasl2
Tworzymy plik /usr/lib/sasl2/smtpd.conf, wpisujemy wiersz:
pwcheck_method: saslauthd
W pliku /etc/ld.so.conf dodajemy wpis /usr/local/lib i wydajemy polecenie:
ldconfig
Tworzymy katalog /var/state/saslauthd
Teraz mamy do wyboru dwa sposoby autoryzacji wirtualnych użytkowników:
- Przy pomocy PAM
- Przy pomocy bezpośredniego dostępu do bazy danych
Osobiście polecam rozwiązanie b.
-
Sasl będzie autoryzował korzystając z PAM (jeżeli nie chcesz mieć nic wspólnego z PAM-em to patrz punkt b), w tym celu
należy zainstalować bibliotekę pam_mysql.
Ściągamy plik pam_mysql-xx.tar.gz, rozpakowujemy, wchodzimy do katalogu pam_mysql i wykonujemy polecenie:
make
Kopiujemy odpowiedni plik w odpowiednie miejsce:
cp pam_mysql.so /lib/security
Tworzymy nowy plik w /etc/pamd.d/smtp z zawartością:
auth
sufficient pam_mysql.so user=postfix passwd=haslodobazy host=localhost
db=postfix table=mailbox usercolumn=username passwdcolumn=password
crypt=0 (w jednej linii)
auth sufficient pam_unix_auth.so
account required pam_mysql.so user=postfix passwd=haslodobazy
host=localhost
db=postfix table=mailbox usercolumn=username passwdcolumn=password crypt=0 (w jednej linii)
account sufficient pam_unix_acct.so
Należy pamiętać aby prawo odczytu tego pliku posiadał tylko root (aby ukryć nasze hasło).
- Co w przypadku gdy nasza dystrybucja w standardzie nie posiada mechanizmu PAM i w cale nie chcemy aby go
posiadała, czyli jak sobie poradzić bez pam_mysql?
Otóż jeżeli ktoś nie chce korzystać z PAM-u to nie musi.
Konfiguracja SASL2 przebiega identycznie z tym że pomijamy instalowanie pam_mysql i tworzenie pliku /etc/pam.d/smtp.
Uruchomimy daemona saslauth z inną opcją, oraz zmienimy zawartość pliku /usr/lib/sasl2/smtpd.conf.
Ale po kolei, w pliku /usr/lib/sasl2/smtpd.conf wpisujemy:
pwcheck_method: saslauthd auxprop
auxprop_plugin: sql
sql_engine: mysql
sql_user: postfix
sql_passwd: haslodobazy
sql_hostnames: localhost
sql_database: postfix
sql_select: select password from mailbox where username='%u@%r'
mech_list: plain login
log_level: 4
Dotyczy punktu a i b:
Dopisujemy do pliku /etc/postfix/main.cf następujące linie:
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
- Uruchamiamy odpowiednie daemony:
To co najważniejsze :
postfix start
Daemon odpowiedzialny za autoryzację imap i pop3:
/usr/local/libexec/courier-authlib/authdaemond &
Daemon imap:
/usr/lib/courier-imap/libexec/imapd.rc start
Daemon pop3:
/usr/lib/courier-imap/libexec/pop3d.rc start
Demon saslauthd odpowiedzialny za autoryzację przed wysłaniem wiadomości:
W przypadku zastosowania mechanizmu PAM:
/usr/local/sbin/saslauthd -r -a PAM
Jeżeli pominiemy opcję "-r" to przy przesyłaniu nazwy użykownika
zostanie obcięta domena - po wpisaniu user@domena, do autoryzacji użyta
zostanie nazwa "user".
Bez użycia PAM-u Daemona saslauthd uruchamiamy z opcją shadow (hasła userów systemowych będą pobierane z shadow, a wirtualnych bezpośrednio z bazy danych:
/usr/local/sbin/saslauthd -a shadow
W tym momencie powinniśmy mieć już w pełni działającą pocztę.
- Instalacja Securremail
ściągamy następujące pakiety:
squirrelmail-1.2.11.tar.gz
compatibility-1.4.1.tar.gz
change_mysqlpass-3.2-1.2.8.tar.gz
Plugin compatibility-1.2.tar.gz niezbędny aby uruchomić plugin
change_mysqlpass-3.2-1.2.8.tar.gz dający użytkownikom możliwość zmiany
haseł znajdujących się w bazie mysql.
Rozpakowujemy pakiety poleceniem:
tar -xvzf *.*
kopiujemy katalog squrrelmal-1.4.1 to katalogu /var/www/html/ najlepiej zmienić mu nazwę na bardziej przystępną np.
mail_www.
Właścicielem katalogu mail może być root, ale należy ustawić właściciela katalogu /mail/data na apache.
Wchodzimy katalogu /var/www/html/mail_www/config/ i uruchamiamy skrypt conf.pl.
Pojawi się nam proste menu którego nie będę opisywał, najważniejsze to "2. Server Setting" gdzie ustawiamy:
Domain: domena.pl
IMAP server: localhost
Jako domenę wpisujemy pierwszą lepszą domenę wirtualną którą obsługuje
nasz serwer. Jeżeli chodzi o resztę ustawień to można prosto
wywnioskować o co chodzi.
Aby ustawić domyślnie język polski dla komunikatów i tak dalej ustawiamy w pliku
/var/www/html/mail_www/config/config.php wartość pl_PL dla zmiennej squirrelmail_default_language:
squirrelmail_default_language = 'pl_PL';
Teraz jeszcze należy zmienić właściciela i grupę dla katalogu "data":
chown -R apache.apache ./data
Kopiujemy katalog compatibility i change_mysqlpass do katalogu ./mail_www/plugins
W katalogu ./mail_www/plugins/change_mysqlpass zmieniamy nazwę pliku
config.php.sample na config.php, Następnie należy wyedytować ten plik:
$mysql_server = 'localhost';
$mysql_database = 'postfix';
$mysql_table = 'mailbox';
$mysql_userid_field = 'username';
$mysql_password_field ='password';
$mysql_manager_id = 'postfix';
$mysql_manager_pw = 'haslodobazy';
$mysql_saslcrypt = 0;
$mysql_unixcrypt = 0;
$mysql_MD5crypt = 0;
Resztę możemy pozostawić bez zmian. Mamy oprócz tego jeszcze możliwość
zmuszenia użytkowników do zmiany hasła w upływie zdefiniowanego czasu w
tym celu musielibyśmy dodać jeszcze dwie kolumny do tabeli mailbox, ale
z tym nie eksperymentowałem...
Teraz jeszcze musimy dać prawo użytkownikowi postfix do modyfikacji
danych w kolumnie password: jak root mysql wykonujemy polecenie:
GRANT SELECT,UPDATE(password) ON postfix.mailbox TO postfix@localhost;
Uruchamiamy ponownie skrypt config.pl, z menu wybieramy "plugins" a natępnie plugin
"change_mysql_pass". Zapisujemy zmiany i gotowe!
UWAGA!!
Ze względów bezpieczeństwa należy odebrać prawo odczytu wszystkim użytkownikom do plików w których podawane jest hasło
do bazy danych postfix!!
Aby się dostać do swojego konta pocztowego wpisujemy w przeglądarce adres
www.naszserwer.pl/mail_www.
I jeszcze końcowa uwaga: jako użytkownika (w kliencie pocztowym lub squirrelmail) wpisujemy pełny adres email, no i w
kliencie poczty włączamy autoryzację używając tych samych ustawień co "serwer poczty przychodzącej".
- Instalujemy skaner antywirusowy: CLAMAV
ściągamy pakiet:
clamav-0.60.tar.gz (najnowsza wersja dostępna w chwili pisania tego artykułu)
Można go znaleźć pod adresem http://download.sourceforge.net/clamav/
Dodajemy użytkownika i grupę amavis (skaner będzie uruchamiany z prawami tego użytkownika):
groupadd amavis
useradd -g amavis -d /usr/lib/amavis -s /bin/false amavis
Rozpakowujemy, wchodzimy do rozpakowanego katalogu i wydajemy polecenia:
./configure --prefix=/usr/local --sysconfdir=/etc --with-user=amavis --with-group=amavis
Następnie:
make
make install
Edydujemy plik /etc/clamav.conf i komentujemy linię ze słowem "Example", oraz zmieniamy wartości następujących parametrów:
User amavis
LocalSocket /usr/lib/amavis/clamd
Nas skaner będzie uruchamiany z prawami użytkownika amavis a plik clamd
musi być w katalogu w którym ten użytkownik ma prawo zapisu stąd też
jest to jak najbardziej odpowiedni wybór (za chwilę się o tym
przekonasz).
Tworzymy katalog /usr/lib/amavis i zmieniamy jego właściciela oraz grupę na amavis, nadajemy mu też odpowiednie prawa:
chown amavis:amavis /usr/lib/amavis
chmod 750 /usr/lib/amavis
Teraz przetestujemy działanie antywirusa: utwórz plik tekstowy np wirus.txt z następującą zawartością:
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
Jest to testowy "wirus" wymyślony tylko i wyłącznie do celów diagnostycznych, wykonaj następnie polecenie:
clamscan ./wirus.txt
Powinieneś zobaczyć coś takiego:
----------- SCAN SUMMARY -----------
Known viruses: 7846
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 Mb
I/O buffer size: 131072 bytes
Time: 0.794 sec (0 m 0 s)
To oznacza że nasz skaner prawidłowo wykrył naszego "wirusa".
To samo zrób dla zwykłego pierwszego pliku. Powinieneś otrzymać podobny
komunikat, z tą różnicą że przy "Infected files" powinna znajdować się
cyfra 0 :)
Jeżeli tak jest to znaczy że antywirus działa jak należy.
Jak powszechnie wiadomo bazy danych każdego skanera antywirusowego
należy systematycznie aktualizować, nie inaczej jest w tym przypadku.
Do aktualizacji baz służy program freshclam dołączany wraz z clamad-em.
Mamy do wyboru dwie alternatywy: uruchamianie programu z cron-a lub
uruchomienie go jako daemona. Ja wybrałem tą drugą opcję:
freshclam -d -c 1 -l /var/log/clamad_update.log
Podczas wywołania jako parametry wskazujemy:
"-d" - uruchom program jako daemon
"-c 1" - aktualizacja raz dziennie
"-l /var/log/clamad_update.log" - wskazujemy plik logu.
Należy utworzyć plik /var/log/clamdad_update.log, oraz zmienić właściciela pliku na amavis i nadać mu odpowiednie prawa:
chmod 700 clamad_update.log
- Amavis-new. Luźno cytując ze strony amavisd.org:
amavisd-new jest wysoko-wydajnym interfejsem pośredniczącym pomiędzy
MTA i programami (skryptami) zajmujących się filtrowaniem treści:
skanerów antywirusowych lub (i) filtrów antyspamowych. Jest napisany w
Perlu, co w znaczący sposób wpływa (pozytywnie) na jego wydajność.
Zwraca się do MTA przez (E)SMTP lub LMTP, lub używając pomocniczych
programów. Najlepszy (podobno) z postfiksem :)
Działa to mniej więcej tak (jeżeli się mylę to proszę o sprostowanie):
Amavisd nasłuchuje na porcie 10024 (tworzy własny serwer SMTP), a MTA dodatkowo jeszcze na porcie 10025.
Klient łączy się z MTA następuje autoryzacja, następnie odbierany jest
mail (wysłany za pośrednictwem naszego serwera lub dostarczany do nas),
email jest przekazywany amavisd za pośrednictwem portu 10024, tworzony
jest tymczasowy plik (w katalogu zdefiniowanym przez zmienną TEMPBASE w
pliku amavisd.conf) i następuje rozłączenie klienta z serwerem.
Teraz następuje oddzielenie treści przesyłki od załączników, ewentualne
rozpakowanie i filtrowanie maila i załącznika (skanowanie, lub
filtrowanie antyspamowe)
W przypadku prześcia testu mail wysyłany jest na port 10025 gdzie
odbiera go z powrotem MTA i tu już trafia sobie do skrzynek lokalnych,
ewentualnie wysyłany jest w świat.
W przypadku negatywnym w zależności od konfiguracji trafia do katalogu
kwarantanny (jeżeli na takową się zdecydowaliśmy) lub jest usuwany i
(jeżeli skonfigurowaliśmy odpowiednie zmienne w pliku amavisd.conf)
wysyłane są powiadomienia do: administratora, nadawcy, odbiorcy listu
(w zależności od konfiguracji).
Ze strony http://www.ijs.si/software/amavisd/#download
pobieramy najnowszą jego wersję. Następnie rozpakowujemy i wchodzimy do
nowo utworzonego katalogu. Sposób instalacji jest pięknie opisany w
pliku INSTALL gdzie odsyłam w przypadku problemów (następna część opisu
w większości pochodzi właśnie stamtąd). Do działania jest wymagany Perl
w wersji co najmniej 5.005, zalecam zainstalowanie najnowszej.
Kopiujemy plik amavisd np do katalogu /usr/local/sbin, zmieniamy właściciela i nadajemy odpowiednie prawa:
cp amavisd /usr/local/sbin/
chown root /usr/local/sbin/amavisd
chmod 755 /usr/local/sbin/amavisd
Kopiujemy plik amavisd.conf do katalogu /etc/, oczywiście zmieniamy właściciela i nadajemy odpowiednie prawa.
cp amavisd.conf /etc/
chown root /etc/amavisd.conf
chmod 644 /etc/amavisd.conf
Tworzymy plik /var/virusmails gdzie będą przechowywane pliki podjęte
kwarantanną (jeżeli na takową się zdecydujemy), jeżeli nie (do czego
raczej zachęcam) to możesz pominąć tą czynność.
mkdir /var/virusmails
chown amavis:amavis /var/virusmails
chmod 750 /var/virusmails
Teraz zabieramy się za edycję pliku /etc/amavisd.conf w celu skonfigurowania najważniejszych opcji amavis-a.
Plik jest bardzo dobrze skomentowany, zachęcam więc do uważnego go
przeczytania, a dla leniwych przedstawiam co najważniejsze zmienne
którym koniecznie trzeba się przyjrzeć.:
Katalog domowy amavisa i nasza domena:
$MYHOME = '/usr/lib/amavis';
$mydomain = 'domena.pl';
Użytkownik i Grupa dla daemona amavisd:
$daemon_user = 'amavis';
$daemon_group = 'amavis';
Katalog, w którym będą przechowywane rozpakowywane (tymczasowo) maile, które potem będą poddawane obróbce:
$TEMPBASE = "$MYHOME/tmp";
Domyślne ustawiony jest katalog $MYHOME, ale warto sobie to zmienić
żeby mieć trochę porządku. Musisz teraz stworzyć katalog
/usr/lib/amavis oraz /usr/lib/amavis/tmp, następnie zmienić właściciela
i grupę na amavis i co najważniejsze dać prawo odczyty TYLKO dla
użytkownika amavis.
Za włączenie ewentualnie wyłączenie modułu filtrowania poczty i spamu odpowiedzialne są te dwie zmienne:
@bypass_virus_checks_acl = qw( . );
@bypass_spam_checks_acl = qw( . );
Jeżeli chcemy WYŁĄCZYĆ któryś z modułów należy go odkomentować. My na
razie uruchamiamy skaner antywirusowy więc zostawiamy ZAKOMENTOWANĄ
zmienną "@bypass_virus_checks_acl = qw( . ):", a moduł antyspamowy
(przyjrzę się temu w wolnej chwili i dopiszę co trzeba) wyłączamy
ODKOMENTOWUJĄC zmienną "@bypass_spam_checks_acl = qw( . );".
Zmienna "@local_domains_acl" przechowuje listę domen lokalnych. Według
opisu amavis przeglądając listę tych domen decyduje o tym czy dany
nadawca jest nadawcą lokalnym, lub czy mail jest mailem wychodzącym,
powiem szczerze że nie wiem na ile ważna jest ta zmienna i czy można
umieścić w niej np "$virtual_mailbox_domains" osoby bardziej
zorientowane proszę o kontakt. Domyślnie zostaw wartość:
@local_domains_acl = ( ".$mydomain" );
Możesz tam dopisać także inne domeny lokalne ale należy pamiętać żeby umieścić je w apostrofach, np.
@local_domains_acl = ( ".$mydomain", '.domena2.pl', 'domena3.pl' );
Pytanie do eksperta: jak w tym przypadku skorzystać z domen przechowywanych w bazie MySql?
Teraz skonfigurujemy logowanie:
Mamy tutaj do wyboru skorzystanie z syslog (wszystkie logi znajdą się w pliku maillog) jeżeli się na to decydujemy
to przypisujemy zmiennej $DO_SYSLOG wartość 0:
$DO_SYSLOG = 1;
Jeżeli chcemy mieć trochę porządku to raczej warto zrezygnować z tej opcji i ustawić logowanie w
oddzielnym pliku. Ustawiamy następujące wartości dla tych zmiennych:
$DO_SYSLOG = 0;
Rezygnujemy z syslog-a
$LOGFILE = "$MYHOME/amavis.log";
plik z osobnym logiem dla amavisa, zamiast "MYHOME" możesz wskazać katalog /var/log.
Dodatkowo mamy jeszcze możliwość zdefiniowania poziomu na jakim będą
się pojawiały nasze logi przy pomocy zmiennej $log_level która może
przyjąć wartość od 0 do 5, np:
$log_level = 0;
0 - uruchomienie, zatrzymanie komunikaty o niepowodzeniach, wykrytych wirusach
Jest to moim zdaniem najrozsądniejszy wybór bez zbędnych śmieci w
przypadku problemów warto włączyć wyższy poziom aby zobaczyć bardziej
dokładne informacje.
Teraz skonfigurujemy powiadomienia o próbach przesłania wirusa.
Zaczynamy od zmiany kodowania na nasze:
$hdr_encoding = 'iso-8859-2';
Dla nagłówka
$bdy_encoding = 'iso-8859-2';
Dla treści
Domyślnie zdefiniowane szablony powiadomień można zastąpić własnymi
napisanymi w ojczystej mowie. Najpierw ustalmy ścieżki do plików
zawierających szablony powiadomień:
$notify_virus_sender_templ= read_text('/usr/lib/amavis/notify_virus_sender.txt');
Informacje dla nadawcy wirusa
$notify_virus_admin_templ = read_text('/usr/lib/amavis/notify_virus_admin.txt');
Informacje dla administratora (czyli dla nas) w przyadku wykrycia wirusa
$notify_virus_recips_templ= read_text('/usr/lib/amavis/notify_virus_recips.txt');
Informacje dla osoby, która miała otrzymać przesyłkę z wirusem.>
To które z tych zawiadomień będą wysyłane, zdefiniujemy za chwilę przy
pomocy innych zmiennych. Oczywiście będziemy musieli umieścić pliki
zawierające szablony zawiadomień w katalogu /usr/lib/amavis/. Możesz je
sobie ściągnąć klikając na poniższe linki. Nie jestem autorem tych
plików, zostały udostępnione na grupie pl.comp.mail.mta. Jak napisać
takie szablony i z jakich zmiennych skorzystać, o tym przeczytacie w
pliku README.customize.
notify_virus_sender.txt
notify_virus_admin.txt
notify_virus_recips.txt
Teraz zdefiniujemy przeznaczenie emaila z wirusem przy pomocy zmiennej
$final_virus_destiny, może ona przyjąć następujące wartości:
- D_PASS - mail przechodzi do nadawcy mimo złej treści (raczej odradzam ;));
- D_DISCARD - mail nie zostaje dostarczony do odbiorcy, nadawca nie będzie
zawiadamiany. W efekcie Stracimy maila (będzie w kwarantannie o ile jej nie wyłączymy, jak to zrobić to za chwilę...)
D_BOUNCE - mail nie zostanie dostarczony do odbiorcy, zawiadomienie
o niedostarczeniu (tzw bounce) zostanie wysłane do nadawcy przez amavis
(pamiętamy że amavis uruchamia własny serwer SMTP). Wyjątek będzie
stanowił mail z wirusem którego nazwa pasuje do zmiennej
$viruses_that_fake_sender_re i w jego przypadku zawiadomienia nie będą
wysyłane.
- D_REJECT - mail nie zostanie dostarczony do odbiorcy, nadawca
otrzyma zwrot wiadomości i informacje o niedostarczeniu wysłaną przez
(uwaga) MTA (czyli postfiksa).
Różnica między D_REJECT i D_BOUNCE polega na tym, kto jest odpowiedzialny za poinformowanie nadawcy i jakie informacje
może zawierać zawiadomienie, w przypadku D_BOUNCE jest to bardziej elastyczne, możemy przekazać więcej informacji no i
odciążamy nasz MTA. W każdym przypadku (jeżeli nie włączymy kwarantanny) z wyjątkiem D_REJECT wiadomość zostanie
usunięta.
-------------------------------------------------------------------------------------------------
Ty decydujesz, miej jednak na uwadze, iż większość obecnie "samorozsyłających" się wirusów fałszuje adres nadawcy , więc
nasze zawiadomienie (jeżeli się na takowe zdecydujemy) może trafić do zupełnie niewinnej osoby.
Od jakiegoś czasu bezsensownie wysyłane powiadomienia generują spory ruch, co zresztą zostało
ochszczone wirusem nadgorliwego administratora. Nie pozwól więc aby inni administratorzy serwerów
poczty narzekali na Ciebie i w konsekwencji (co niektórzy) blokowali pocztę przychodzącą od Twojego
serwera ;)
Aby więc ustrzec się przed nękaniem "Bogu ducha winnych" ludzi i rozsyłaniem zawiadomień nie tam
gdzie trzeba ustaw:
$final_virus_destiny = D_DISCARD;
-------------------------------------------------------------------------------------------------
I problem z głowy :)
Często jednak zachodzi sytuacja, że nie możemy sobie pozwolić na usuwanie korespondencji ot tak po prostu, wtedy
najlepiej ustawić kwarantannę (jak? - o tym za chwilę) i regularnie ją przeglądać, albo włączyć:
$final_virus_destiny = D_BOUNCE;
i regularnie wpisywać wirusy fałszujące pole FROM do zmiennej $viruses_that_fake_sender_re.
To drugie nie jest to rozwiązaniem zalecanym, ponieważ prawie na pewno nie będziesz w stanie nadążyć z wpisywaniem
nazw
nowo pojawiających się wirusów, dlatego raczej polecam całkowite wyłączenie powiadomień dla "nadawców" wirusów.
Pora na zdecydowanie się kto ma dostawać zawiadomienia:
$warnvirussender = 0;
zawiadamianie nadawcy wirusa(1-tak, 0-nie)
$warnvirusrecip = 0;
Nie chcemy aby niedoszli odbiorcy wirusa otrzymywali zawiadomień (wartość domyślna), raczej warto im
oszczędzić takich komunikatów
Teraz definiujemy konto na które mają być wysyłane powiadomienia dla administratora (jeżeli ustawimy wartość
undef, to zrezygnujemy z tych powiadomień):
$virus_admin = "virusalert\@$mydomain";
Teraz rzecz jasna musimy utworzyć konto virusalert@domena.pl ewentualnie dodać alias na konto administratora
do tabeli"alias":
INSERT INTO alias (address,goto) VALUES ('virusalert@domena.pl', 'administrator@domena.pl');
Teraz to o czym już kilkakrotnie wspominałem, czyli kwarantanna którą najlepiej wyłączyć poprzez zakomentowanie następującej
zmiennej:
#$QUARANTINEDIR = '/var/virusmails'
lub poprzez ustawienie:
$virus_quarantine_to = undef;
To tyle z ważniejszych zmiennych które wyszperałem w pliku konfiguracyjnym. Czas na skonfigurowanie antywirusa:
szukamy linijki zaczynającej się od "@av_scanners = (". Mamy tam
zdefiniowane ustawienia na różnych snakerów antywirusocych.
Należy zakomentować wszystkie z wyjątkiem następujących (linię z
"@av_scanners = (" zostawiamy NIEzakomentowaną). Należy zmienić też
ścieżkę dostępu do pliku socked clamd:
['Clam Antivirus-clamd',
\&ask_daemon, ["CONTSCAN {}\n", '/usr/lib/amavis/clamd'],
qr/\bOK$/, qr/\bFOUND$/,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
Natomiast linie zaczynające się od "@av_scanners_backup = (" należy
WSZYSTKIE zakomentować. Definiujemy tutaj zapasowy skaner antywirusowy.
Nam wystarczy jeden.
Dodatkowo należałoby zainstalować odpowiednie pakery w systemie do
rozpakowywania załączników: gzip, bzip2, lzop, uncompress, unfreeze,
arc, unarj, unrar, zoo, lha, cpio. Jeżeli nie zdecydujesz się na
korzystanie z któregoś to nic się nie stanie mail zawierający załącznik
spakowany przy pomocy jednego z nich po prostu zostanie zaakceptowany.
Zalecam instalowanie najnowszych wersji ww programów.
To tyle jeżeli chodzi o plik amavisd.conf, chyba że o czymś zapomniałem.
Teraz czas na edycję plik /etc/postfix/master.cf. Odszukujemy linię zaczynającą się od "smtp inet ..." i zamieniamy ją
na następującą:
smtp inet n - n - - smtpd -o content_filter=smtp-amavis:[127.0.0.1]:10024
oraz dodajemy następujące linie
localhost:10025 inet n - n - - smtpd
smtp-amavis unix - - n - 2 smtp -o smtp_data_done_timeout=1200 -o disable_dns_lookups=yes
Czas na pierwsze uruchomienie amavisa:
amavisd debug &
Prawie napewno dostaniesz komunikay o brakujących modułach perla, skąd je zdobyć?
Jeżeli masz dystrybuję opartą o rpm spróbuj udać sie na stronę www.rmorales.com.ar/rpms/amavis/#amavisd-new
Tam zainstaluj sobie pakiety których potrzebujesz, jeżeli będziesz miał na tyle cierpliwości...
Drugi dużo łatwiejszy sposób polega na interaktywnej kompilacji ze źródeł. Wydajemy polecenie:
perl -MCPAN -e shell
Następnie odpowiesz na kilka prostych pytań po czym będziesz mógł wydawać polecenia. Pakiety instalujemy wpisując:
install Nazwa::Modulu
Po czym znowu spróbuj uruchomić amavisa jeżeli zainstalowałeś wszystkie potrzebne moduły powinno wszystko działać jak należy.
Obejrzyj jeszcze wynik polecenia:
netstat -natup
Na porcie 10024 powinien nasłuchiwać amavisd a na porcie 10025 master, czyli nadrzędny daemon
postfiksa.
Wraz z amavisem należy również uruchamiać daemona clamd.
Do skryptów startowych należy dodać następujące polecenia:
#aktualizacja raz dziennie baz danych snakera clamav
/usr/local/bin/freshclam -d -c 1 -l /var/log/clam-update.log
#uruchomienie skanera
/usr/local/bin/clamd
#uruchomienie amavisa
/usr/sbin/amavisd
No i teraz na koniec przetestuj wszystko: spróbuj wysłać maila z wirusem, bez wirusa i sprawdź czy wszystko działa jak należy, czytaj też dokładnie logi amavisa żeby skorygować ewentualne błędy.
-------------------------------------
Grzegorz Sidorko
Jadowniki 2003 - 2008
grzegorz@zsp2.edu.pl
linux.zsp2.edu.pl
-------------------------------------