Lemat, strona prywatna

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:

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:

  1. openssl 0.9.8 kiepsko chce współpracować, na tą chwilę ja bym polecał jednak ostatnią możliwą literkę z 0.9.7
  2. 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.
  3. 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.

Data utworzenia : 2004-06-11, data aktualizacji :2013-01-16

Skomentuj ten tekst

Komentarze:

franciszek
2010-09-04 23:24:19
druga instalacja postfiksa na tym samym serwerze
Witam,
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ć ?
Odpowiedź Lemata:
Ja bym się na twoim miejscu zainteresował softem typu xen, vmware, virtualbox etc...
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.
Iksik
2008-02-25 15:07:09
postfix problem podczas make install
Podczas make install postfix krzyczy ze nie ma : bin/postconf: error while loading shared libraries: libsasl2.so.2: cannot open shared object file: No such file or directory Oczywiscie libsasl2.so.2 znajduje sie w /usr/local/lib/ oraz /var/lib/ Pytanie to gdzie on tego szuka ??
Odpowiedź Lemata:
# cat /etc/ld.so.conf # man ldconfig
Edel
2008-01-11 03:04:54
Problem
Wszystko skonfigurowałem wg Twojego przepisu. Jednak za cholerę nie działa SQL - SASL uwierzytelnia tylko loginów użytkowników mających konto na linuxie. Gdy wpiszę user@domena - wywala błąd - login failed. Co jest grane? W MySQL jest baza postfix, użytkownik postfix z dostępem do bazy danych z localhost a... nie działa :( Pozdrawiam Edel
Odpowiedź Lemata:
błędny plik smtp.conf?
Lewy
2007-12-22 20:26:16
Problem z amavis
Witam Daję : perl -MCPAN -e shell i : t/Ref..................ok t/Smtpsend............ [---- i tu jest end. Żadnego ruchu nie widać. czemu? Pozdrawiam Lewy
p.
2007-05-17 12:27:14
wakacje, autoreply, zarzadzenie przez www
moze jeszcze do tego postfixadmin i wakacje (autoreply) Pozdrawiam
wszystkie opinie »
Protected by spf
[Nospam-PL.NET]
Seti@Home
www.php.net
© Lemat 2004 - ∞
Cookie Bullshit
Mapa strony
engine: lem.. at lemat·priv·pl