Postfix, Amavis, ClamAV, SpammAssassin или как да си направим сървър за електронна поща

от ILuxWiki

Направо към: навигация, търсене


Страницата е непълна, имам още какво да кажа, но за сега нямам време :(

Нова статия по същата тема: Използване на FreeBSD като емайл сървър.

Съдържание

Въведение

Документа покрива информация относно изграждането на сървър за електронна поща с някой допълнителни подобрения така необходими в тези дни с червей, вируси и спам бъкащи из електронните писма.

Официалната страница от където е заимстван документа се намира на http://workaround.org/articles/ispmail-sarge/. Операционната система която е използвана документа е Debian Sarge, това не означава че не може да се използват и други ОС, практически всички платформи на който е възможно да се компилират пакетите използвани в този пример, могат да се справят не по зле от Debian-а.

Подобни документи

Необходими пакети - инсталация

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' на следния въпрос:

Картинка:courier-webadmin-preconfigure.png

Излиза въпрос за администраторска парола - при мене слагам 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

Картинка:courier-ssl-cert-warning.png

След този въпрос се генерира примерен сертификат:

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

Допълнителен пакет, който може би ще ви помогне при работата с 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.*


Други документи

  1. SMS Notify - известяване чрез SMS при получаване на нова поща.
  2. http://www.xs4all.nl/~jaspersl/quota/ - maildir quota

TODO

apt-get install phpgroupware