Bezpieczny Postfix
Ostatnio instalowałem u siebie postfixa wzorując się między innymi na stronie Grzegorza Sidorko http://linux.zsp2.edu.pl/ oraz dokumentach z działu "Documentation, Howtos and FAQs" na stronie www.postfix.org.
Ponieważ Grzegorz instalował to na nieco innym systemie (inne katalogi) postanowiłem umieścić swój własny przepis, jest on bardzo mocno wzorowany na przepisie Grzegorza,
Mój przepis testowałem na: Mandrake 10 (Community i Official), Mandriva 2005, 2006, Postfix 2.1.x, 2.2.x, 2.3.x, Mail-SpamAssassin-2.63 (3.0.2), cyrus-sasl-2.1.18 - 2.1.21, courier-imap-2.2.2.20040207 (3.0.7, 3.0.8, 4-ka jest już dostępna ale trochę inna niż wcześniejsze wersje), clamav-0.70 - 0.88, amavisd-new-20030616 (2.2.1, 2.3.0-2.3.3, 2.4.x).
Moim celem jest postawienie "bezpiecznego" systemu poczty, czyli bardzo mocno zabezpieczonego przed spamerami i wirusami.
Do tego ważne dla mnie jest aby mój system pocztowy nie wysyłał zwrotek na sfałszowane adresy nadawcy - ostatnie plagi wirusów Bagle i Netsky są nazywane nie bez powodu wirusami nadgorliwego administratora.
Przy mojej konfiguracji zwrotkę dostanie tylko administrator i to tylko wtedy, kiedy user pozytywnie przejdzie autoryzację SASL.
Co nam będzie potrzebne:
- Jeżeli chcemy ustalać quotę userom virtualnym w dziale Add-on Software pobieramy patcha ze strony http://web.onda.com.br/nadal/
- źródła postfixa ze strony http://www.postfix.org, trzeba pobrać jednak taką wersję, do której już jest patch.
- do autoryzacji SASL potrzebny nam Cyrus-SASL ze strony http://asg.web.cmu.edu/cyrus/download/
- MySQL można pobrać ze strony http://www.mysql.org
- mxfilter można pobrać ze strony http://rmxf.comm.pl/
- Courier - IMAP ze strony http://www.courier-mta.org/download.php
- a ClamAV ze strony http://www.clamav.net
- amavisd-new http://www.ijs.si/software/amavisd/
- postgrey http://isg.ee.ethz.ch/tools/postgrey/
Przed rozpoczęciem kompilacji warto zrobić:
export CFLAGS="-O2" (lub nawet -O3)
inaczej gcc będzie uruchamiany z opcją "-g -O2" co spowoduje niepotrzebne zwiększenie objętości plików wykonywalnych o informacje potrzebne do debugowania.
MySQL
pobieramy i instalujemy 4 paczki wywalając standardowe mandrejkowe, które są "nieco przerobione" przez zespół Mandrake i mi osobiscie się nie podobają
trzeba utworzyć bazę danych "postfix" do której dostęp z localhosta ma user "postfix" z hasłem "postfix" (oryginalne prawda?)
do tej bazy importujemy plik sql, który znajduje się w zipie w moją przykładową konfiguracją.
przed importem należy oczywiście ten plik wyedytować wstawiając swoją domenę i swoje konta/aliasy
Cyrus-SASL
najpierw w pliku plugins/sql.c komentujemy wszystkie polecenia pisania do logów zawierające SASL_LOG_DEBUG - inaczej będzie strasznie śmiecił.
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-login --enable-plain --enable-sql --with-gnu-ld --with-saslauthd --with-pam=/usr --with-mysql=/usr --with-openssl=/usr
make
make install
skrypt startowy do /etc/init.d/ można pobrać z rpm-a
trzeba tylko pamiętać aby w nim ustawić
MUXDIR="/var/state/saslauthd"
PFDIR="/var/spool/postfix"
w katalogach /etc/rc.d/ robimy linki S40saslauthd, K60saslauthd
Tworzymy plik /usr/lib/sasl2/smtpd.conf, wpisujemy tam:
pwcheck_method: auxprop
auxprop_plugin: sql
sql_engine: mysql
mech_list: plain login
sql_user: postfix
sql_passwd: postfix
sql_hostnames: 127.0.0.1
sql_database: postfix
sql_statement:select password from mailbox where username='%u@%r'
Tworzymy plik /etc/sysconfig/saslauthd, wpisujemy tam:
# Authentications mechanism (for list see saslauthd -v)
SASL_AUTHMECH=shadow
# Hostname for remote IMAP server (if rimap auth mech is used)
# Ldap configuration file (if ldap auth mech is used)
SASL_MECH_OPTIONS=
# Extra options (for list see saslauthd -h)
SASLAUTHD_OPTS=
Tworzymy /var/state/saslauthd/
Problemy z SASLem czy też raczej współpracą SASL-Postfix polegają głównie na tym, że postfix jest chrootowany i szuka pliku mux w swoim chroocie, zatem plik startowy /etc/init.d/saslauthd tworzy twardy link w odpowiednim katalogu.
Innym problemem jest brak odpowiednich bibliotek (*devel*.rpm) podczas kompilacji, co skutkuje brakiem odpowiadających im metod uwierzytelniania (można to sprawdzić: saslauthd -v).
Postfix
groupadd -g 74 postfix
groupadd -g 105 postdrop
useradd -u 74 -c "system user for postfix" -d /var/spool/postfix -s /bin/false postfix -g postfix
make makefiles AUXLIBS="-L/usr/lib -lsasl2 -L/usr/lib/mysql -lmysqlclient -lz -lm" CCARGS="-DUSE_SASL_AUTH -I/usr/include/sasl -DHAS_MYSQL -I/usr/include/mysql" OPT="-O2" DEBUG=""
dla db-4.3 trzeba dodać -lpthread:
make makefiles AUXLIBS="-L/usr/lib -lsasl2 -L/usr/lib/mysql -lmysqlclient -lz -lm -lpthread" CCARGS="-DUSE_SASL_AUTH -I/usr/include/sasl -DHAS_MYSQL -I/usr/include/mysql" OPT="-O2" DEBUG=""
jeżeli kompilujemy z TLS to:
make makefiles AUXLIBS="-L/usr/lib -lsasl2 -L/usr/lib/mysql -lmysqlclient -lz -lm -lssl -lcrypto -lpthread" CCARGS="-I /usr/include -DUSE_TLS -DUSE_SASL_AUTH -I/usr/include/sasl -DHAS_MYSQL -I/usr/include/mysql" OPT="-O2" DEBUG=""
przy postfixie 2.3 trzeba dodać -DUSE_CYRUS_SASL:
make makefiles AUXLIBS="-L/usr/lib -lsasl2 -L/usr/lib/mysql -lmysqlclient -lz -lm -lssl -lcrypto -lpthread" CCARGS="-I /usr/include -DUSE_TLS -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl -DHAS_MYSQL -I/usr/include/mysql" OPT="-O2" DEBUG=""
make
make install (lub make upgrade z zależności od tego czy mamy poprzednią wersję postfixa)
cp conf/postfix-script /etc/init.d/postfix
w katalogach /etc/rc.d/ robimy linki S80postfix, K30postfix
instalator postfixa zawiera jakiegoś buga - trzeba utworzyć katalog /var/spool/postfix/etc i skopiować tam pliki /etc/host.conf /etc/hosts /etc/localtime /etc/nsswitch.conf /etc/resolv.conf /etc/services
clamav
najpierw tworzymy usera i grupę amavis.
groupadd -g 76 amavis
useradd -u 76 -g amavis -d /usr/lib/amavis -s /bin/false -c "system user for amavis" amavis
Potrzebne też będą paczki:
libcurl2-devel*.rpm
libgmp3-devel*.rpm
bc-1.*.rpm
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --with-user=amavis --with-group=amavis
ewentualnie dodajemy --enable-milter
tworzymy plik /etc/cron.daily/freshclam, (chmod a+x) wpisujemy tam:
#!/bin/sh
freshclam -l /var/log/clamad_update.log
bardzo ważna uwaga od twórców ClamAV: będą banować tych klientów, którzy dobijają się do serwera częściej niż raz na godzinę. Można postawić freshclama jako demon - należy tylko wziąć nowy konfig w przypadku upgrejdu z wersji <0.80
potrzebne jest też utworzenie logu:
touch /var/log/clamad_update.log
chown amavis:amavis /var/log/clamad_update.log
Amavis 2.3.3 potrafi używać clamAV jako demona, skrypt do /etc/init.d bierzemy z contrib/init/RedHat/clamd (trzeba w środku zmienić ścieżkę z /usr/local na /usr), linkujemy S80, K30 w /etc/rc.d/rc*.d.
Trzeba utworzyć katalog /var/run/clamav/, chown amavis:amavis, chmod 777.
W konfigu /etc/clamd.conf trzeba pozmieniać ścieżki (do pobrania z zipa)
W konfigu freshclama trzeba ustawić aby on powiadamiał clamd o nowych bazach danych (też do pobrania z zipa).
MXfilter
make
cp mxfilter /usr/sbin/
cp mxfilter.cf.sample /etc/postfix/mxfilter.cf
cp mxfilter.acl.sample /etc/postfix/mxfilter.acl
dodatkowo w katalogu ze zródłami znajdują się pliki test*.txt które służą testowaniu
mxfilter < test.txt
courier-imap
configure i make trzeba wykonać jako zwykły user a nie jako root, dopiero make install jako root
./configure --without-ipv6 --enable-unicode=iso-8859-1,utf-8,iso-8859-2 --with-redhat
cp authdaemonrc.dist authdaemonrc
cp imapd.cnf.dist imapd.cnf
cp imapd.dist imapd
cp pop3d.cnf.dist pop3d.cnf
cp pop3d.dist pop3d
cp imapd-ssl.dist imapd-ssl
cp pop3d-ssl.dist pop3d-ssl
cp authmysqlrc.dist authmysqlrc
w plikach pop3d* oraz imapd* na końcu jest zmienna, która sygnalizuje courierowi, który serwer ma być odpalony a który nie. Standardowo odpalamy serwery pop3 i imap.
amavis
cp amavisd /usr/sbin/
chown root /usr/sbin/amavisd
chmod 755 /usr/sbin/amavisd
cp amavisd.conf /etc/
chown root /etc/amavisd.conf
chmod 644 /etc/amavisd.conf
mkdir /var/virusmails
chown amavis:amavis /var/virusmails
chmod 750 /var/virusmails
cp amavisd_init.sh /etc/init.d/amavis
w katalogach /etc/rc.d/ robimy linki S80amavis, K30amavis
potrzebne nam będą dodatkowe paczki -
uruchamiamy perl -MCPAN -e shell i podajemy kolejno (install nazwa):
Unix::Syslog
Net::Server
Net::Server::PreForkSimple
Convert::TNEF
Convert::UUlib
Compress::Zlib
Archive::Tar
Archive::Zip
Time::HiRes
Mail::SpamAssassin
HTML::Parser
(trzeba pamiętać o zainstalowaniu paczki perl-devel wcześniej, amavisd debug wyświetli listę brakujących modułów: Can't locate XXX/Yyy.pm in @INC ... - install XXX::Yyy)
Bardzo ważne: podczas konfiguracji amavisa trzeba zwrócić uwagę na to, aby serwer nie wysyłał zwrotek na sfałszowane adresy nadawców. Wprawdzie amavis zawiera listę wirusów fałszujących adresy, ale ta lista jest mocno nieaktualna i nie należy na niej polegać. Dodatkowo, ponieważ obecnie większość wirusów fałszuje adres nadawcy proponuję, aby nie wysyłać zwrotek nie swoim userom w ogóle. Na końcu tego dokumentu znajduje się link do mojej konfiguracji, tam mam zrobione to, o czym mówiłem wyżej.
postgrey
Postgrey to takie coś, co kosztem opóźnienia w dostarczeniu maila o co najmniej 5 minut potrafi zredukować spam prawie do zera. Działa to w ten sposób, że jak widzi meila z danego IP, od danego usera do danego usera pierwszy raz (tzw. triplet) to odpowiada komunikatem "450 wróć później". I tylko prawidłowe systemy pocztowe oraz wirusy potrafią po jakimś czasie (postfix standardowo po 20 minutach) ponowić wysyłanie mejla z tego samego IP (w zasadzie /24), od tego samego usera do tego samego usera.
useradd -u 81 -g nogroup -c "system user for postgrey" -d /var/spool/postfix/postgrey -s /bin/false postgrey
cp postgrey_whitelist_* /etc/postfix
cp postgrey /usr/sbin
cp contrib/postgreyreport /usr/sbin
skrypt startowy do /etc/init.d/ można pobrać z mojego konfiga, w /etc/rc.d/ tworzymy linki S80postgrey i K30postgrey
potrzebne nam będą dodatkowe paczki -
uruchamiamy perl -MCPAN -e shell i podajemy kolejno (install nazwa):
IO::Multiplex
BerkeleyDB
Efekty działania tego filtra można obserwować - listę tripletów, które nie ponowiły próby dostarczenia emaila można wyswietlić:
cat /var/log/mail/info | postgreyreport
Przy czym nalezy pamiętać, że kilka przesyłek może być "w trakcie dostarczania", najlepiej podać log wczorajszy np. info.1.
Postfix 2.1.5 standardowo zawiera w paczce ze źródłami skrypt greylistingu, ale spotkałem się z kilkoma niepochlebnymi opiniami na temat jego stabilności.
Kilka słów o konfiguracji
Przykładowe pliki konfiguracyjne można pobrać stąd. Nie będę się tutaj rozpisywał - są odpowiednie komentarze w odpowiednich plikach. Mam nadzieję, że są czytelne i zrozumiałe - jeśli tak nie jest - napisz do mnie, a postaram się poprawić.
linki:
http://www.postfix.org
http://rmxf.comm.pl/
http://spf.pobox.com
Kilka uwag:
- openssl 0.9.8 kiepsko chce współpracować, na tą chwilę ja bym polecał jednak ostatnią możliwą literkę z 0.9.7
- warto co jakiś czas robić upgrade modułów perla, w tym samego perla: odpalamy perl -MCPAN -e shell i wciskamy "r" aby obejrzeć listę modułów.
- powyższa konfiguracja chodzi u mnie między innymi na P2 350, ~50 mailboxów, ~30tyś uwalonych spamów miesięcznie, kilkanaście spamów dziennie jednak przechodzi (muszę whitelistować serwer mi je forwardujący) i jedyny problem z wydajnością jest z modułem Bayesa, konkretnie z funkcją usuwającą z bazy stare wartości. Dlatego bardziej stawiam na uwalanie w sesji niż punktowanie SpamAssasinem.
Komentarze:
mam chodzącą instalacje na produkcyjnym serwerze, chciałbym zainstalować drugą instalacje na tym samym serwerze po to aby móc ją przetestować w środowisku z userami itp. itd. Jeśli coś by nie działało to wyłączam nowego postfiksa i włączam te starą chodzącą wersje postfiksa.
Nie widze opcji:
install --prefix=/usr/local/postfix
gdzie nowa instalacja byłaby we wskazanej lokalizacji.
Jak zainstalować nową instalke w ten sposób aby nie uszkodzić tej właściwej, chodzącej i móc sie elastycznie między nimi przełączać ?
Ogólnie jeżeli postfix "nie chodzi" to widać to po pierwszym przesłanym emailu. Jeżeli kompilujesz i masz źródła starego postfixa i źródła nowego postfixa, robisz make install nowego postfixa i coś nie działa - to wystarczy przejść do źródeł starego postfixa i zrobić make install - stara wersja przykryje nową. Oprócz tego warto trzymać kopię zapasową master.cf.