Postfix + MySQL + SASL2 + Squirrelmail+Amavisd+Clamav



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.
  1. 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.


  2. Ś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


  3. Ś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

  4. 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');

  5. 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.

  6. 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 haslodobazy
    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.

  7. 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:
    1. Przy pomocy PAM
    2. Przy pomocy bezpośredniego dostępu do bazy danych
    Osobiście polecam rozwiązanie b.

    1. 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).

    2. 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

  8. 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ę.

  9. 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".

  10. 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

  11. 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: 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
-------------------------------------