Postfix, Amavis, ClamAV, SpammAssassin или как да си направим сървър за електронна поща
от ILuxWiki
Страницата е непълна, имам още какво да кажа, но за сега нямам време :(
Нова статия по същата тема: Използване на FreeBSD като емайл сървър.
Въведение
Документа покрива информация относно изграждането на сървър за електронна поща с някой допълнителни подобрения така необходими в тези дни с червей, вируси и спам бъкащи из електронните писма.
Официалната страница от където е заимстван документа се намира на http://workaround.org/articles/ispmail-sarge/. Операционната система която е използвана документа е Debian Sarge, това не означава че не може да се използват и други ОС, практически всички платформи на който е възможно да се компилират пакетите използвани в този пример, могат да се справят не по зле от Debian-а.
Подобни документи
- http://www.urbanpuddle.com/articles/2006/10/12/setup-postfix-in-about-1-hour
- http://flurdy.com/docs/postfix/
Необходими пакети - инсталация
apt-get install mysql-server-4.1 apt-get install postfix postfix-mysql postfix-doc apt-get install courier-authdaemon courier-authmysql apt-get install courier-webadmin apt-get install courier-pop courier-pop-ssl courier-imap courier-imap-ssl apt-get install postfix-tls apt-get install libsasl2-modules libsasl2-modules-sql apt-get install amavisd-new spamassassin clamav clamav-daemon unzoo unzip arj unrar-free zip apt-get install nomarch apt-get install unp update-alternatives --install /usr/bin/lha lha /usr/bin/unp 100
За достъп до POP3/IMAP
- courier-authdaemon
- courier-authmysql
- courier-webadmin - за администрация на courier през web
- courier-pop - за некриптиран достъп чрез POP3
- courier-pop-ssl - за SSL-криптиран достъп чрез POP3
- courier-imap - за IMAP достъп
- courier-imap-ssl - за SSL-encrypted IMAP достъп hdaemon
Стъпка по стъпка
Тук са описани отделните стъпки при инсталацийте на някой от пакетите изброени малко по нагоре.
courier-webadmin
Този пакет го инсталирам за тест, реално настройките могат да се направят и през конзола. Разбира се в последствие достъпа до тази програма ще бъде спряна. Отговаря се с 'yes' на следния въпрос:
Излиза въпрос за администраторска парола - при мене слагам Aeho4shi. Паролата е генерирана произволно, пък никой не знае коя е машината с която тествам в момента :)
Възможно е да се получи следната грешка /при мене стана/.
dpkg: error processing courier-webadmin (--configure): dependency problems - leaving unconfigured Errors were encountered while processing: apache courier-webadmin E: Sub-process /usr/bin/dpkg returned an error code (1)
Проблема в случая е че не е инсталиран apache, изпълнението на apt-get install apache решава проблема и на courier-webmin-а.
Creating config file /etc/apache/modules.conf with new version Starting web server: apache. Setting up courier-webadmin (0.47-3ubuntu7.1) ...
courier-pop
courier-pop-ssl
След този въпрос се генерира примерен сертификат:
subject= /C=US/ST=NY/L=New York/O=Courier Mail Server/OU=Automatically-generated POP3 SSL key/CN=localhost/emailAddress=postmaster@example.com notBefore=May 4 09:29:41 2006 GMT notAfter=May 4 09:29:41 2007 GMT MD5 Fingerprint=87:59:82:80:66:67:CC:8B:21:E9:DF:E2:18:FC:6E:34 writing new private key to '/usr/lib/courier/imapd.pem'
- изтрива се файла в /etc/courier/*pem
ново съдържание:
1
2 RANDFILE = /usr/lib/courier/pop3d.rand
3
4 [ req ]
5 default_bits = 1024
6 encrypt_key = yes
7 distinguished_name = req_dn
8 x509_extensions = cert_type
9 prompt = no
10
11 [ req_dn ]
12 C=BG
13 ST=VN
14 L=Varna
15 O=SISTEC Mail Server
16 OU=Automatically-generated POP3 SSL key
17 CN=mail.sistechnology.com
18 emailAddress=todor.dragnev@sistechnology.com
19
20
21 [ cert_type ]
22 nsCertType = server
Стартира се
# dpkg-reconfigure courier-pop-ssl
courier-imap
courier-imap-ssl
postfix-tls, SASL
Ако искате услугата да се ползва от "road-warriors"(хора на път) сървъра трябва да има система за идентификация, затова се нуждаете от:
- postfix-tls (for encrypted authenticated SMTP)
- libsasl2 (the Cyrus SASL library)
- libsasl2-modules (the mechanisms for the SASL library)
- libsasl2-modules-sql
- openssl (to create the certificate)
Поради проблем с SASL модула - използва само clear пароли е необходимо да се сложи и
- sasl2-bin
- libpam-mysql
mySQL бази данни
Като начало ще създадем необходимите бази данни в mysql. Целта ни да работим само с виртуални потребители и домейни.
1. Създаване на базата данни и потребител който има само readonly достъп
# mysqladmin create vmailsystem # mysql -u root -p > grant select on vmailsystem.* to vmail_client@localhost identified by 'Tei9fahp'; > flush privileges;
2. Създаване на таблиците
domains
domains - Тази таблица съдържа само една колона и в нея ще се описани виртуалните домейни, който ще се обслужват от системата.
CREATE TABLE `domains` ( `domain` varchar(50) NOT NULL default , PRIMARY KEY (`domain`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
примерно съдържание:
mysql> select * from domains; +-------------------+ | domain | +-------------------+ | virtual.test | +-------------------+
forwardings
forwardings - С помоща на тази таблица може да пренасочвате един емайл адрес към друг (това се отнася и към local домейните на машината). Таблицата forwardings се явява алтернативен вариант на /etc/aliases
CREATE TABLE `forwardings` ( `source` varchar(80) NOT NULL default , `destination` text NOT NULL, PRIMARY KEY (`source`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
примерно съдържание:
mysql> select * from forwardings; +--------------------+---------------------------------------------------+ | source | destination | +--------------------+---------------------------------------------------+ | zeon@virtual.test | user@virtual.test, root@localhost, root@sis.test | | @sis.test | root@localhost | +--------------------+---------------------------------------------------+
users
users - потребителите на системата и техните пароли
CREATE TABLE `users` ( `email` varchar(80) NOT NULL default , `password` varchar(20) NOT NULL default , PRIMARY KEY (`email`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1
TODO: да има възможност потребителя да е "АКТИВЕН ИЛИ НЕ"
mysql> select * from users; +---------------------------+----------+ | email | password | +---------------------------+----------+ | user@virtual.test | secret | +---------------------------+----------+
recipeint_bcc
recipeint_bcc - с тази таблица е възможно да се пренасочват копия от пристигащи пощи към други потребители. В моя случай го изполвам за изпращане на известяване през SMS.
Създаването на таблицата е описано по-долу в този документ.
примерно съдържание:
mysql> select * from recipient_bcc; +-------------------+---------------------+ | source | destination | +-------------------+---------------------+ | user@virtual.test | smsnotify@localhost | | zeon@virtual.test | smsnotify@localhost | +-------------------+---------------------+
SPAM && VIRUS защита
За да се пазите от спам и вируси:
- amavisd-new
- spamassassin
- clamav
- clamav-daemon
При инсталацията на clamav* на ubuntu се получи следния проблем:
/etc/init.d/clamav-daemon: line 60: log_daemon_msg: command not found ...done.
За да се оправи тази неприятност е необходимо да добавите следните редове в /lib/lsb/init-functions
# Sample usage:
# log_daemon_msg "Starting GNOME Login Manager" "gdm"
#
# On Debian, would output "Starting GNOME Login Manager: gdm"
# On Ubuntu, would output " * Starting GNOME Login Manager..."
#
# If the second argument is omitted, logging suitable for use with
# log_progress_msg() is used:
#
# log_daemon_msg "Starting remote filesystem services"
#
# On Debian, would output "Starting remote filesystem services:"
# On Ubuntu, would output " * Starting remote filesystem services..."
log_daemon_msg () {
if [ -z "$1" ]; then
return 1
fi
if [ -z "$2" ]; then
echo -n "$1:"
return
fi
echo -n "$1: $2"
}
Подробно обяснение има тук: http://www.ubuntuforums.org/showthread.php?t=161245
- zoo
- unzip
- unarj/arj
- lha (in non-free!) - ако липсва ползвайте unp
За да имате достъп през webmail
Може да се избира м/у много програми,
- sqwebmail - стара изпитана програма, има си я на пакет в debian
- roundcube - нов красив интерфейс, BETA в момента при писането на този документ, все още не е включена в някой линукс, но я има в ports на [freebsd] ;). (вж. Допълнителни настройки за roundcube).
Допълнителен пакет, който може би ще ви помогне при работата с SQL, ако не сте на ТИ с mysql:
- phpmyadmin (PHP interface for easy administration of MySQL databases)
Настройки
Създаване на потребител vmail
Пощенския сървър може да обслужва хиляди пощенски кутий, затова по добра идея е да се създаде псевдо потребител, който да е "господар" на всички кутий.
groupadd -g 5000 vmail useradd -g vmail -u 5000 vmail -s /bin/false -d /home/vmail -m
Postfix
main.cf
Това е базово съдържание и практически би трябвало да работи без да се променя нищо освен името на машината (mydomain, myhostname).
biff = no
append_dot_mydomain = no
mydomain = sistechnology.com
myhostname = hermes.sistechnology.com
myorigin = /etc/mailname
mydestination = $myhostname, localhost
mynetworks = $config_directory/mynetworks
# virtual domain settings
#This parameter is supposed to be unset. We will not use virtual alias domains.
#If you left it to the default you would have it set to
#virtual_alias_maps for backwards-compatability to older releases.
virtual_alias_domains =
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailboxes.cf
virtual_alias_maps =
mysql:$config_directory/mysql_virtual_forwardings.cf
mysql:$config_directory/mysql_virtual_email2email.cf
virtual_mailbox_domains = mysql:$config_directory/mysql_virtual_domains.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
#smtpd_tls_loglevel = 4
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.cert
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
mysql_virtual_domains.cf
user = vmail_client password = Tei9fahp dbname = vmailsystem table = domains select_field = 'virtual' where_field = domain hosts = 127.0.0.1
mysql_virtual_forwardings.cf
user = vmail_client password = Tei9fahp dbname = vmailsystem table = forwardings select_field = destination where_field = source hosts = 127.0.0.1
mysql_virtual_recipient_bcc.cf
user = vmail_client password = Tei9fahp dbname = vmailsystem table = recipient_bcc select_field = destination where_field = source hosts = 127.0.0.1
mysql_virtual_email2email.cf
user = vmail_client password = Tei9fahp dbname = vmailsystem table = users select_field = email where_field = email hosts = 127.0.0.1
mysql_virtual_mailboxes.cf
user = vmail_client password = Tei9fahp dbname = vmailsystem table = users select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') where_field = email hosts = 127.0.0.1
Настройка за поддръжка на SASL, tls и mySQL
За да разбира емайл демона от потребителски имена и пароли трябва да добавят някой неща в postfix-а. Той използва Cyrus SASL метод за потвърждение на достъпа, затова към main.cf на postfix трябва да се добавят тези редове:
smtpd_sasl_auth_enable = yes broken_sasl_auth_clients = yes
/etc/postfix/sasl/smtpd.conf
Създава се и файл /etc/postfix/sasl/smtpd.conf със следното съдържание:
log_level: 4 pwcheck_method: auxprop auxprop_plugin: sql mech_list: sql plain login cram-md5 digest-md5 sql_engine: mysql sql_hostnames: 127.0.0.1 sql_user: vmail_client sql_passwd: Tei9fahp sql_database: vmailsystem sql_select: select password from users where email='%u@%r'
Малко ограничения за lusers (да се чете local users :) )
chown root:postfix /etc/postfix/sasl/smtpd.conf chmod u=rw,g=r,o= /etc/postfix/sasl/smtpd.conf
Проверка дали всичко работи
Преди да пуснете телнет преобразувайте потребителското име и паролата в mime-base64:
~$ echo -n 'user@virtual.test' | base64-encode dXNlckB2aXJ0dWFsLnRlc3Q= ~$ echo -n 'pass' | base64-encode cGFzcw==
Направете теста:
todor@debi:~$ telnet mailserver 25 Trying mailserver... Connected to mailserver. Escape character is '^]'. 220 mailserver ESMTP Postfix >ehlo localhost 250-mailserver 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5 250-AUTH=LOGIN PLAIN DIGEST-MD5 CRAM-MD5 250 8BITMIME >auth login 334 VXNlcm5hbWU6 >dXNlckB2aXJ0dWFsLnRlc3Q= 334 UGFzc3dvcmQ6 >cGFzcw== 235 Authentication successful >quit 221 Bye Connection closed by foreign host.
Използване на TCL за криптиране на SMTP трафика
TCL позволява да изпращате пощи от произволни "недружелюбни" места/доставчици/ без да се претеснявате че някой ще може да прочете нещо. За да се изполва е необходим ssl сертификат, ако не сте си купили такъв може да си подпишете собственоръчно по описанието в "Други бележки".
В /etc/postfix/main.cf е необходимо присъствието на следните редове:
#smtpd_tls_loglevel = 4 smtpd_use_tls = yes smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.cert smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
Пренасочване на пощи чрез BCC (Blind Carbon Copy)
Наложи ми се да ползвам тази възможност за препращане на определени пощи с цел създаване на архиви и пренасочване към услугата за известяване чрез SMS.
Примерна ситуация:
Потребителски акаунт user@virtual.test желае да запазва копие на всички пощи, които получава.
Решение(hash):
/etc/postfix/main.cf:
recipient_bcc_maps = hash:$config_directory/recipient_bcc
/etc/postfix/recipient_bcc
user@virtual.test backup_user@localhost
Решение(mysql):
/etc/postfix/main.cf: (вариант с mysql)
recipient_bcc_maps = mysql:$config_directory/mysql_recipient_bcc.cf
/etc/postfix/mysql_recipient_bcc.cf
user = mail_admin password = secret dbname = isp_mail table = users select_field = destination where_field = source hosts = 127.0.0.1
таблица в mysql:
CREATE TABLE `recipient_bcc` ( `source` varchar(80) NOT NULL default , `destination` text NOT NULL, PRIMARY KEY (`source`) ) ENGINE=MyISAM
Courier
POP3/IMAP
До тук трябва да имаме работещ SMTP сървър. Вече трябва да помислим как клиентите ще си проверяват пощата. Ако сте инсталирали горните пакети pop3/imap трябва да работи, но е настроен само за работа с реални потребители на системата. За да може да обслужва новите виртуални пощи е необходимо да настроим /etc/da
Amavis
Now that the amavis daemon is hopefully running in the background you still need to tell Postfix that you want to have all your emails scanned. This is done by setting the global content filter in your /etc/postfix/main.cf like this:
content_filter = amavis:[127.0.0.1]:10024 receive_override_options = no_address_mappings
The content_filter entry makes all email be sent to a service called amavis which you will define in the next step. Next edit the /etc/postfix/master.cf and add these two services:
amavis unix - - - - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes 127.0.0.1:10025 inet n - - - - smtpd -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
Примени в /etc/amavis/amavisd.conf
root@hermes:/etc/amavis# diff amavisd.conf amavisd.conf.orig
66c66
< $mydomain = 'localhost'; # (no useful default)
---
> $mydomain = 'example.com'; # (no useful default)
161c161
< #@bypass_spam_checks_acl = qw( . ); # No default dependency on spamassassin
---
> @bypass_spam_checks_acl = qw( . ); # No default dependency on spamassassin
828d827
< @lookup_sql_dsn = ( [ 'DBI:mysql:database=vmailsystem', 'vmail_client', 'Tei9fahp' ] );
839d837
< $sql_select_policy = 'SELECT "Y" as local FROM domains WHERE CONCAT("@",domain) IN (%k)';
1107c1105
< $sa_local_tests_only = 0; # (default: false)
---
> $sa_local_tests_only = 1; # (default: false)
1123c1121
< $sa_tag_level_deflt = -1000; # add spam info headers if at, or above that level
---
> $sa_tag_level_deflt = 4.0; # add spam info headers if at, or above that level
ClamAV
- създаване възможност на amavis да се връзва през unix socket
mkdir /var/run/clamav chown amavis:amavis /var/run/clamav
Променете потребителя в /etc/clamav/clamd.conf
User amavis
SpamAssassin
SpamAssasion се ползва чрез amavis.
Обучение:
Train it with ham and spam
To make AMaViS even more effective you should tell it what you think is spam. Since SpamAssassin is used for the bayesian filtering (it applies probabilities to every word to find out if the email is likely to be spam) it needs some training. You need to show it a large amount (more than a few hundred) mails of both categories. You cannot just show it spam mails and expect it to work.
Just a note: I know that it's possible to store these settings individually for each virtual user. Honestly I have not yet tried that since I found the documentation of AMaViS a bit confusing. Contributions on storing the learned information in the database per-user are welcome.
The tricky part is that you need sufficient access permissions to read the users' emails while at the same time storing the learned information in the home directory of the 'amavis' user. The permissions only allow the user 'vmail' to access emails. The group (g) and others (o) do not have any permissions. So I decided to run the learning task as 'root' from cron.
Just create a batch script that reads certain folder consisting of spam emails and have it called by crontab ('crontab -e' as root). I have hacked a script together and put it at /usr/local/bin/spamlearner:
#!/bin/bash -e
SADIR=/var/lib/amavis/.spamassassin
DBPATH=/var/lib/amavis/.spamassassin/bayes
SPAMFOLDERS="\
/home/vmail/well-known-customer.com/fred/.spam/cur \
/home/vmail/spamtrap.org/jeanne/.spam/cur \
"
HAMFOLDERS="\
/home/vmail/spamtrap.org/jeanne/.trash/cur \
"
for spamfolder in $SPAMFOLDERS ; do \
echo Learning spam from $spamfolder ; \
nice sa-learn --spam --showdots --dbpath $DBPATH $spamfolder
done
for hamfolder in $HAMFOLDERS ; do \
echo Learning ham from $hamfolder ; \
nice sa-learn --ham --showdots --dbpath $DBPATH $hamfolder
done
chown -R amavis:amavis $SADIR
You can see what AMaViS has recorded into its database by running sa-learn --dbpath /var/lib/amavis/.spamassassin/bayes --dump magic .
A note: this way you are training AMaViS' global bayesian database. So it applies to all emails that enter your system. Make sure you don't learn spam mails from unreliable or untrusted users. They can ruin your spam detection ratio by putting messages in their 'spam' folder that are not really spam. Just because a user never wants to get email from his ex-girlfriend again does not make it spam for everybody. So be careful about the mails you feed to the global bayes database.
Another note: Do not make SpamAssassin learn emails that users just 'forwarded' to you. The header information would be gone which contains much of the information that helps SpamAssassin recognise spam. Make sure they use the 'bounce' feature. Your best choice is to take the email messages directly from the user's maildir directory.
Perl
- libmailtools-perl (1.62-1) - Manipulate email in perl programs
Допълнителни бележки
Преминаване от mailbox към maildir
Като за начало се инсталира пакета mb2md
apt-get install mb2md
Генериране на сертификат с openssl
mkdir /etc/postfix/ssl
cd /etc/postfix/ssl
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes \
-keyout smtpd.key -keyform PEM -days 1095 -x509
Правата !
chmod u=rw,g=r,o= /etc/postfix/ssl/smtpd.key chown root:postfix /etc/postfix/ssl/smtpd.key
Как да се настрои SqurrelMail за httpS
http://jult.net/txt/mail_ssl.txt - Config for httpS://mail.yourdomain.net using Apache 2.* with Fedora Core and SquirrelMail 1.4.*
Други документи
- SMS Notify - известяване чрез SMS при получаване на нова поща.
- http://www.xs4all.nl/~jaspersl/quota/ - maildir quota
TODO
apt-get install phpgroupware



