21 Септември 2013, версия 4

postfix, mysql, dovecot, domainkeys, dkim, spamassassin, clamav, amavisd, spf, mailgraph HOWTO for SLACKWARE

Hristo C. Simeonov
Rev 4: 21 Sep 2013

Преди няколко дни ми се наложи да си преместя мейл сървъра на друг сървър. От доста време му бях набрал на моя мейл сървър, който беше на qmail. Нямам нищо против qmail, просто вече е морално остарял. Първата сигурна версия на Qmail 1.3 се появи през 1998 година и общо взето от тогава кода му не е мръднал много много, което от своя страна си е малко неудобство. За всяко ново нещо което ти потрябва, трябва да търсиш разни пачове из мрежата, пък те не били цели, нещо не им работило ... общо взето, ако искаш да го инсталираш с малко по нови неща, може да си строшиш нервите. На този адрес http://www.ixip.net/qmail/ има една страница, която бях писал през 2005 година и актуализирал до 2010 как да си инсталираме qmail. Вече не я обновявам, тъй като смятам, че qmail си е загуба на време. Старата версия на статията R2 може да бъде намерена на адрес: http://www.ixip.net/postfix/postfix-r2.html. Разликата в двете статий е, че в тази съм премахнал вече DKIMproxy (защото писмата се проверяват и подписват от amavisd и не е необходимо още един процес да работи) и съм добавил mailgraph.

Операционна система: Slackware >= 14.00

Необходим софтуер който приемаме, че са инсталирани:

OpenSSL >= 0.9.8q 2 Dec 2010
MySQL >= 5.1.53
Perl > = 5.12.2
Също така всички програми, които теглим ще приемаме, че са свалени в /usr/local/src

Dovecot

Официалния сайт на продукта dovecot е: www.dovecot.org.
В тази документация съм използвал версия 2.1.9. Да преминем към инсталирането на софтуера. Първо трябва да си създадем базата в MySQL-а. Може да не се вживявате с много сложни пароли, пуснете MySQL-а бинднат на 127.0.0.1 само, това е достатъчно. Ако някой влезе в сървъра ви, няма да е през dovecot юзера който ще създадем, а това автоматично означава, че ще има права по един или друг начин да прочете файла, на който е записана паролата за базата.

mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 120669
Server version: 5.1.53-log Source distribution

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE `dovecot` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON `dovecot` . * TO 'dovecot'@'localhost' IDENTIFIED BY 'dovecot' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 GRANT OPTION;

Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> \q
Bye

Ако ви се наложи да дропнете базата с потребителя, ето какво трябва да направите:

mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 120669
Server version: 5.1.53-log Source distribution

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> REVOKE ALL PRIVILEGES ON * . * FROM 'dovecot'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> REVOKE ALL PRIVILEGES ON `dovecot` . * FROM 'dovecot'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> REVOKE GRANT OPTION ON `dovecot` . * FROM 'dovecot'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> DROP USER 'dovecot'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> DROP DATABASE IF EXISTS `dovecot`;
Query OK, 0 rows affected (0.00 sec)
mysql> \q
Bye

Сега трябва да създадем юзера и групата, под които ще работи dovecot, също и мейл юзера, под който ще се записват писмата

groupadd dovecot
useradd dovecot -g dovecot -c 'Dovecot mail server' -s /bin/false
groupadd vmail
useradd vmail -g vmail -c 'Vmail server' -s /sbin/nologin

и продължаваме към инсталиране и конфигуриране на dovecot.

tar xzvf dovecot-2.2.19.tar.gz
chown -R root.root dovecot-2.2.19
cd dovecot-2.2.19
./configure --with-mysql
make
make install
cd /usr/local/share/doc/dovecot/
cp -r example-config /usr/local/etc/dovecot
cd /usr/local/etc/dovecot
vi dovecot.conf

При мен конфигурационния файл изглежда по следния начин, както ще видите - бинднал съм imap, който не изисква енкрипция на 127.0.0.1 само, това е с цел да се използва само от уеб емайл-а, тъй като няма нужда процесора да се натоварва излишно с безмисленна енкрипция, след като само локалния хост ще се връзва с него. Всички останали правят конекция през ssl порта. Там където в конфигурационния файл пише uid=1004 gid=1005, това са userid и groupid -то на потребителя vmail!

# 2.1.9: /usr/local/etc/dovecot/dovecot.conf
# OS: Linux 3.2.4 i686 Slackware 13.37.0 ext4
auth_mechanisms = plain login
base_dir = /usr/local/var/run/dovecot/
default_login_user = nobody
dict {
  driver = sql
  quota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql.conf.ext
}
mail_location = maildir:/var/spool/postmail/%d/%n/Maildir
mail_privileged_group = vmail
passdb {
  args = /usr/local/etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}
protocols = pop3 imap
service imap-login {
  inet_listener imap {
    address = 127.0.0.1
    port = 143
  }
}
ssl_cert = </etc/postfix/ssl/mail.example.com.crt
ssl_key = </etc/postfix/ssl/mail.example.com.key
userdb {
   driver = static
   args = uid=1004 gid=1005 home=/var/spool/postmail/%d/%u allow_all_users=yes
}
protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
}
!include conf.d/*.conf

Както и файла dovecot-sql.conf.ext

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=postfix
default_pass_scheme = CRYPT
password_query = SELECT username AS user, password FROM mailbox WHERE username = '%u';

След това отивате в директорията conf.d и трябва да промените следните файлове:
10-auth.conf
Коментирайте реда: !include auth-system.conf.ext да стане на: #!include auth-system.conf.ext и размаркирайте долния ред да стане на: !include auth-sql.conf.ext
10-mail.conf Тук трябва да намерите параметъра: mail_location = и да кажете къде и в какъв формат ще се записват писмата. За тази статия аз съм избрал те да се записват в /var/spool/postmail директорията. Нека сега да я създадем, за да не я забравим после. Внимание, ако променяте тази директория, не забравяйте да я промените и в dovecot.conf файла.
Формата е следния: mail_location = maildir:/var/spool/postmail/%d/%n/Maildir

mkdir /var/spool/postmail
chown -R vmail.vmail /var/spool/postmail

след като сме готови трябва да създадем таблицата в базата ни:

mysql -u dovecot -p dovecot
Enter password:
mysql> CREATE TABLE users (
    userid VARCHAR(128) NOT NULL,
    domain VARCHAR(128) NOT NULL,
    password VARCHAR(64) NOT NULL,
    home VARCHAR(255) NOT NULL,
    uid INTEGER NOT NULL,
    gid INTEGER NOT NULL
);
Query OK, 0 rows affected (0.00 sec)
mysql> \q
Bye

Dovecot когато работи с SQL сървър има възможност да се връзва към сокет, аз специално срещнах някакъв проблем и тъй като вече ми работи сървъра нямам голямо желание да го тествам. Сокета се описва по следния начин в dovecot-sql.conf файл:

# The mysqld.sock socket may be in different locations in different systems
driver = mysql
connect = host=/var/run/mysqld/mysqld.sock dbname=postfix user=admin password=pass

Ако някой го пробва и работи да метне един емайл да каже.
Генерираме сертификата и сме готови.

openssl req -new -x509 -days 365 -nodes -out "example.cert" -keyout "example.key"
chmod 600 example.key
cp -a /root/example.cert /etc/postfix/ssl/certs/dovecot.pem
cp -a /root/example.key /etc/postfix/ssl/private/dovecot.pem

Стига толкова за dovecot, нека продължим по нататък.

Postfix

Официалния сайт на продукта Postfix е: www.postfix.org.
Използвал съм версия 3.0.3, добавяме потребителя, под който ще работи postfix.

groupadd postfix
groupadd postdrop
useradd postfix -g postfix -c 'Postfix daemon user account' -d /var/spool/postfix -s /bin/false

Postfix може да ви даде грешка когато го компилирате с MySQL подръжка, тъй като както postfix, така и MySQL инклудват един и същи файл events.h, за това трябва да преименувате единия файл (този на MySQL-а).

cd /usr/include/mysql/
mv events.h events.h.bak
cd /usr/local/src
tar xzvf postfix-3.0.3.tar.gz
chown -R root.root postfix-3.0.3
cd postfix-3.0.3
make -f Makefile.init makefiles \
        'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_TLS -DUSE_DOVECOT_SASL -I/usr/include/sasl' \
        'AUXLIBS=-L/usr/lib/sasl2 -L/usr/lib -lmysqlclient -lz -lm -L/usr/lib -lssl -lcrypto -lsasl2'
make
make install
ln -s /usr/sbin/sendmail /usr/lib/sendmail

Сега ще създадем и ключа за да не го забравим после.

perl /etc/ssl/misc/CA.pl
CA certificate filename (or enter to create)

Making CA certificate ...
Using configuration from /etc/ssl/openssl.cnf
Generating a 1024 bit RSA private key
....................++++++
.....++++++
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase:някъв пасс

Сега ще създадем ключа без парола за нашия хост aaa.example.net и неподписан ключ.

openssl req -new -nodes -keyout aaa-key.pem -out aaa-req.pem -days 365
Using configuration from /etc/ssl/openssl.cnf
Generating a 1024 bit RSA private key
........................................++++++
....++++++
writing new private key to 'aaa-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BG
State or Province Name (full name) [Some-State]:Stara Zagora
Locality Name (eg, city) []:Stara Zagora
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Condor
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:aaa.example.net
Email Address []:owner@example.net

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:някъв пасс
An optional company name []:

Подписваме публичния сертифика за aaa.example.net със удостоверяващия частен ключ които създадохме преди няколко стъпки.

openssl ca -out aaa-cert.pem -infiles aaa-req.pem
Using configuration from /etc/ssl/openssl.cnf
Enter PEM pass phrase:някъв пасс
Check that the request matches the signature
Signature ok
The Subjects Distinguished Name is as follows
countryName           :PRINTABLE:'BG'
stateOrProvinceName   :PRINTABLE:'Stara Zagora'
localityName          :PRINTABLE:'Stara Zagora'
organizationName      :PRINTABLE:'Condor'
commonName            :PRINTABLE:'aaa.example.net'
emailAddress          :IA5STRING:'owner@example.net'
Certificate is to be certified until Nov 21 19:40:56 2012 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Инсталираме публичния и частния ключ както и удостоверяващия частен ключ.

cp demoCA/cacert.pem aaa-key.pem aaa-cert.pem /etc/postfix
chmod 644 /etc/postfix/aaa-cert.pem /etc/postfix/cacert.pem
chmod 400 /etc/postfix/aaa-key.pem

Сега ги инсталираме в /etc/postfix/main.cf файла за всички клиенти. Давам примерни параметри, в конфигурационните файлове които съм дал името на ключа е различно тъй като тази част е допълвана в последствие след като видях, че съм я пропуснал.

/etc/postfix/main.cf:
        smtp_tls_CAfile = /etc/postfix/cacert.pem
        smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_tls_session_cache
        smtp_tls_security_level = may
        smtpd_tls_CAfile = /etc/postfix/cacert.pem
        smtpd_tls_cert_file = /etc/postfix/aaa-cert.pem
        smtpd_tls_key_file = /etc/postfix/aaa-key.pem
        smtpd_tls_received_header = yes
        smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache
        tls_random_source = dev:/dev/urandom
        smtpd_tls_security_level = may

Сега да създадем базата и да качим sql файла:

mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 120669
Server version: 5.1.53-log Source distribution

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE `postfix` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost' IDENTIFIED BY 'postfix' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> \q
Bye
mysql -u root -p postfix < mail.sql

Преминаваме към антивирусната програма, после ще настройваме postfix-а.

pigeonhole

Искам да вмъкна няколко думи. Ако Вашия уеб майл има подръжка на втори активен фолдер, тъй като squirrelmail-а няма, но примерно roundcuba има и желаете писмата идентифицирани като спам да отивам автоматично в тази папка, тогава имате нужда от dovecot-pigeonhole. Това е скриптов език с които можете да манипулирате писмата т.е. ако се съдържа spam в писмото премести го в еди си коя директория.
Официалния сайт на продукта pigeonhole е: pigeonhole.dovecot.org.
Продукта се инсталира лесно:

tar xzvf dovecot-2.2-pigeonhole-0.4.9.tar.gz
chown -R root.root dovecot-2.2-pigeonhole-0.4.9
cd dovecot-2.2-pigeonhole-0.4.9
./configure
make
make install

Активирате двата конфигурационни файла в dovecot и остава да си настроите филтъра след това. Филтъра може да бъде персонален и глобален за всички потребители. При мен използвам глобален ето как изглежда:

# cat /usr/local/var/lib/dovecot/sieve/default.sieve
require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
  fileinto "Spam";
}

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

clamav

Официалния сайт на продукта clamav е: www.clamav.net.
Използвал съм версия: 0.98.7 Първо добавяме групата и потребителя, под който ще ни работи антивирусната програма, аз съм избрал имената им по подразбиране.

groupadd clamav
useradd clamav -g clamav -c 'ClamAV system user' -d /var/lib/clamav -s /bin/false
tar xzvf clamav-0.98.7.tar.gz
chown -R root.root clamav-0.98.7
cd clamav-0.98.7
./configure
make
make install
mkdir /var/lib/clamav
chown -R clamav:clamav /var/lib/clamav
freshclam
mkdir /var/run/clamav
chown clamav:clamav /var/run/clamav

След като антивирусната програма е инсталирана, трябва да се конфигурира. Антивирусната програма има два файла: clamd.conf и freshclam.conf, който са записани в директорията /usr/local/etc. И двата файла трябва задължително да се редактират. Разгледайте ги, ако нещо не ви стане ясно или се двоумите, може да изтеглите моите файлове от директорията downloads. Те ще работят, ако сте следвали точно инструкциите.

SpamAssassin

Нека преди да инсталираме SpamAssassin, да инсталираме някой други модули, които би било добре да ги имаме. Внимание, ако вашият емайл сървър приема повече от 100,000 писма на ден, за да използвате Distributed Checksum Clearinghouse (DCC) трябва да си инсталирате локален сървър, защото писмата Ви няма да бъдат проверявани, когато надхвърлят бройката. В старата статия бях описал как да бъдат стартирани отделно SpamAssassin и amavisd-то, обаче за да се използва mailgraph трябва SpamAssassin да бъде стартиран под юзера на amavis-а.
Официални сайтове:
DCC - http://www.rhyolite.com/dcc/
Pyzor - http://pyzor.sourceforge.net/
Нека да започнем първо с DCC, след това ще инсталираме Razor и най на края Pyzor. След като преключим с тях ще преминем към инсталирането на SpamAssassin

tar xzvf dcc.tar.Z
chown -R root.root dcc-1.3.158
cd dcc-1.3.158
./configure --disable-dccm
make
make install
cdcc info > /var/dcc/map.txt
chmod 0600 /var/dcc/map.txt
rm /var/dcc/map
cdcc "new map; load /var/dcc/map.txt"
cdcc "delete 127.0.0.1"
cd /usr/local/src
tar xjvf pyzor-1.0.0.tar.bz2
chown -R root.root pyzor-1.0.0
cd pyzor-1.0.0
python setup.py build
python setup.py install
pyzor discover
cd /usr/local/src
/*  SpamAssassin изисква някой модули на пърла да бъдат инсталирани. Желателно е всичко да бъде инсталирано през пърл шела. Отговаряйте положително на всеки въпрос който възниква по време на инсталацията на модулите.  */
groupadd spamd
useradd spamd -g spamd -c 'SpamD system user' -d /var/lib/spamassassin -s /bin/false
perl -MCPAN -e shell
cpan> install Bundle::CPAN
cpan> install Devel::CoreStack
cpan> install Digest::HMAC
cpan> install Digest::MD5
cpan> install Digest::SHA1
cpan> install Digest::BubbleBabble
cpan> install HTML::Parser
cpan> install HTML::Tagset
cpan> install MIME::Base64
cpan> install Getopt::Long
cpan> install Time::Local
cpan> install Time::HiRes
cpan> install HTTP::Date
cpan> install Term::ReadKey
cpan> install Net::IP
cpan> install Net::DNS
cpan> install Net::SMTP
cpan> install File::Path
cpan> install File::Basename
cpan> install File::Spec
cpan> install Test::Harness
cpan> install Test::Simple
cpan> install Net::CIDR::Lite
cpan> install Sys::Hostname::Long
cpan> install Mail::Audit
cpan> install Net::DNS::Resolver::Programmable
cpan> install Error
cpan> install NetAddr::IP
cpan> install version
cpan> install Mail::SPF
cpan> install Mail::SPF::Query
cpan> install IP::Country::Fast
cpan> install Text::Wrap
cpan> install Parse::Syslog
cpan> install Statistics::Distributions
cpan> install Net::Ident
cpan> install Socket6
cpan> install IO::Socket
cpan> install IO::Socket::IP
cpan> install IO::Socket::INET6
cpan> install Net::SSLeay
cpan> install IO::Socket::SSL
cpan> install Crypt::OpenSSL::Random
cpan> install Crypt::OpenSSL::RSA
cpan> install Mail::Address
cpan> install Email::Address
cpan> install Mail::DomainKeys
cpan> install Mail::DKIM
cpan> install IO::Zlib
cpan> install Archive::Tar
cpan> install Crypt::OpenSSL::Bignum
cpan> install DB_File
cpan> install Storable
cpan> install Data::Dump
cpan> install Encode::Detect
cpan> install Geo::IP
cpan> install LWP::UserAgent
cpan> install Net::Patricia
cpan> install Razor2::Client::Agent
cpan> install Mail::SpamAssassin
cpan> quit
Lockfile removed.
sa-update -D
chown -R spamd:spamd /var/lib/spamassassin/

Може да бъде инсталирано и по следния вариант, добавил съм на двата модула force тъй като са стари и тестовете не минават, а на практика работят:

perl -MCPAN -e 'install Bundle::CPAN, Devel::CoreStack, Digest::HMAC, Digest::MD5, Digest::SHA1, Digest::BubbleBabble, HTML::Parser'
perl -MCPAN -e 'install HTML::Tagset, MIME::Base64, Getopt::Long, Time::Local, Time::HiRes, HTTP::Date, Term::ReadKey, Net::IP, Net::DNS'
perl -MCPAN -e 'install Net::SMTP, File::Path, File::Basename, File::Spec, Test::Harness, Test::Simple, Net::CIDR::Lite, Sys::Hostname::Long'
perl -MCPAN -e 'install Mail::Audit, Net::DNS::Resolver::Programmable, Error, NetAddr::IP, version, Mail::SPF'
perl -MCPAN -e 'force install Mail::SPF::Query'
perl -MCPAN -e 'install IP::Country::Fast, Text::Wrap, Parse::Syslog, Statistics::Distributions, Net::Ident, Socket6, IO::Socket'
perl -MCPAN -e 'install IO::Socket::IP, IO::Socket::INET6, Net::SSLeay, IO::Socket::SSL, Crypt::OpenSSL::Random, Crypt::OpenSSL::RSA'
perl -MCPAN -e 'install Mail::Address, Email::Address, Mail::DomainKeys, Mail::DKIM, IO::Zlib, Archive::Tar, Crypt::OpenSSL::Bignum'
perl -MCPAN -e 'install DB_File, Storable, Data::Dump, Encode::Detect, Geo::IP, LWP::UserAgent, Net::Patricia, Razor2::Client::Agent'
perl -MCPAN -e 'force install Mail::SpamAssassin'

amavis

Официалния сайт на продукта amavisd е: http://www.ijs.si/software/amavisd/
За да работи amavisd с всички познати файлове трябва някои допълнителни програми да се инсталират. За това може да погледнете файла INSTALL. След като ги инсталираме преминаваме към amavisd, за които също трябват някой пърл модули да се инсталират. Повечето вече ги има инсталирани, но това не пречи да проверим дали е така.

groupadd amavis
useradd amavis -g amavis -c 'AMaViS system user' -d /var/lib/amavis -s /bin/sh
perl -MCPAN -e shell
cpan> install Archive::Zip
cpan> install Compress::Zlib
cpan> install Compress::Raw::Zlib
cpan> install Convert::TNEF
cpan> install Convert::UUlib
cpan> install MIME::Base64
cpan> install MIME::Parser
cpan> install Mail::Internet
cpan> install Net::Server
cpan> install Digest::MD5
cpan> install IO::Stringy
cpan> install Time::HiRes
cpan> install Unix::Syslog
cpan> install BerkeleyDB
cpan> install Mail::DKIM
cpan> quit
Lockfile removed.
tar xzvf amavisd-new-2.10.1.tar.gz
chown -R root.root amavisd-new-2.10.1
cd amavisd-new-2.10.1
mkdir /var/lib/amavis
mkdir /var/lib/amavis/tmp
mkdir /var/lib/amavis/var
mkdir /var/lib/amavis/db
mkdir /var/lib/amavis/home
mkdir /var/lib/amavis/virusmails
chown -R amavis:amavis /var/lib/amavis
chmod -R 0750 /var/lib/amavis
cp amavisd /usr/local/sbin/
chown root /usr/local/sbin/amavisd
chmod 0755  /usr/local/sbin/amavisd
cp amavisd.conf /etc/
chown root:amavis /etc/amavisd.conf
chmod 0640 /etc/amavisd.conf

или всички заедно:

perl -MCPAN -e 'install Archive::Zip, Compress::Zlib, Compress::Raw::Zlib, Convert::TNEF, Convert::UUlib, MIME::Base64, MIME::Parser, Mail::Internet, Net::Server, Digest::MD5, IO::Stringy, Time::HiRes, Unix::Syslog, BerkeleyDB, Mail::DKIM'

Отворете файла amavisd.conf, намиращ се в /etc директорията и го конфигурирайте, както прецените за добре.

Mailgraph

Официалния сайт на продукта mailgraph е: http://mailgraph.schweikert.ch/
За него трябва да инсталирате и RRDTool, официалния сайт е: http://oss.oetiker.ch/rrdtool/ тъй като го няма инсталиран по подразбиране. За mailgraph Ви трябва и File::Tail Предлагам Ви да изтеглите build скрипта от директорията с конфигурационните файлове и да си го компилирате и инсталирате от там, но все пак ето как се инсталира:

tar xzvf rrdtool-1.5.4.tar.gz
chown -R root.root rrdtool-1.5.4
cd rrdtool-1.5.4
./configure --prefix=/usr
make
make install

След като свалите mailgraph трябва да редактирате .cgi файла като оправите пътя до mailgraph.rrd и mailgraph_virus.rrd. Копирате mailgraph.cgi и mailgraph.css в cgi-bin директорията на apacha.

tar xzvf mailgraph-1.14.tar.gz
chown -R root.root mailgraph-1.14
cd mailgraph-1.14
# редактирате файла mailgraph-init като смените стойноста на променливата MAIL_LOG от /var/log/syslog на /var/log/maillog
cp mailgraph-init rc.mailgraph
chmod +x rc.mailgraph
mv rc.mailgraph /etc/rc.d
chmod 0755 mailgraph.cgi
cp mailgraph.c* /var/www/cgi-bin/
perl -MCPAN -e shell
cpan> install File::Tail
cpan> quit

DomainKeys / DKIM

Разбира се, всички стартиращи файлове могат да се изтеглят от ТУК Това е готово, сега остава да генерираме ключовете на домейните и след това да ги добавим в нейм сървъра. За да конфигурираме amavisd да проверява и подписва писмата с публичен ключ трабва да създадем ключовете. Ако сте инсталирали всички модули на perl както съм ги описал по-горе, то тогава трябва само да създадем ключовете. Първо да опишем в конфигурационния файл на amavis къде се намират ключовете и за кои домейни. Това се налага за в бъдеще след като подадем команда към amavis да ни покаже публичния ключ, да знае къде да намери частния клюя. Отне ми доста време докато разбера, че съм пропуснал да опиша ВСИЧКИ домейни които имам в параметъра @local_domains_maps на amavisd.conf. Ето прараметрите които трябва да бъдат пуснати и как би трябвало да изглеждат и при Вас.

@spam_scanners = ( ['SpamAssassin', 'Amavis::SpamControl::SpamAssassin'] );
$enable_dkim_verification = 1;  # enable DKIM signatures verification
$enable_dkim_signing = 1;    # load DKIM signing code, keys defined by dkim_key
dkim_key('example.com','mail','/var/lib/amavis/dkim/example.com.key');
dkim_key('example.net','mail','/var/lib/amavis/dkim/example.net.key');
@local_domains_maps = ( ".example.com", ".example.net" );  # list of all local domains
@local_domains_acl = ( "example.com", "example.net" );  # list of all local domains
$inet_socket_port = 10024;   # listen on this local TCP port(s)
$interface_policy{'10024'} = 'ORIGINATING';
$policy_bank{'ORIGINATING'} = {  # mail supposedly originating from our users
  originating => 1,  # declare that mail was submitted by our smtp client
  allow_disclaimers => 1,  # enables disclaimer insertion if available
  virus_admin_maps => ["virusalert\@$mydomain"],
  spam_admin_maps  => ["virusalert\@$mydomain"],
  warnbadhsender   => 1,
  forward_method => 'smtp:[127.0.0.1]:10025',
  smtpd_discard_ehlo_keywords => ['8BITMIME'],
  bypass_banned_checks_maps => [1],  # allow sending any file names and types
  terminate_dsn_on_notify_success => 0,  # don't remove NOTIFY=SUCCESS option
};

$sa_tag_level_deflt  = -10.0;  # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 5.0;  # add 'spam detected' headers at that level
$sa_kill_level_deflt = 999.0;  # triggers spam evasive actions (e.g. blocks mail)
$sa_dsn_cutoff_level = 10;   # spam level beyond which a DSN is not sent
$sa_crediblefrom_dsn_cutoff_level = 18; # likewise, but for a likely valid From
# $sa_quarantine_cutoff_level = 25; # spam level beyond which quarantine is off
$penpals_bonus_score = 8;    # (no effect without a @storage_sql_dsn database)
$penpals_threshold_high = $sa_kill_level_deflt;  # don't waste time on hi spam
$bounce_killer_score = 100;  # spam score points to add for joe-jobbed bounces

$sa_mail_body_size_limit = 400*1024; # don't waste time on SA if mail is larger
$sa_local_tests_only = 0;    # only tests which do not require internet access?
 $notify_method  = 'smtp:[127.0.0.1]:10025';
 $forward_method = 'smtp:[127.0.0.1]:10025';  # set to undef with milter!

Това са по основните параметри които трябва да ги имате. Сега да генерираме ключовете.

mkdir /var/lib/amavis/dkim
amavisd genrsa /var/lib/amavis/dkim/example.com.key
amavisd showkeys example.com

Последната команда ще Ви покаже вашият публичен ключ за съответния домейн. Който ще изглежда горе - долу така:

; key#1, domain example.com, /var/lib/amavis/dkim/example.com.key
mail._domainkey.example.com.      3600 TXT (
  "v=DKIM1; p="
  "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5jCReX1jJhsC5pDRIqgk3UCkN"
  "Psfn8KBpjZCr8AxRDPmiXTAtDDEEfH1DTRBey8CMRglMvX9hMWdTReACK4a2o85p"
  "khcbV/6XlOhUGiT/7Dv8/9yEu68eRTIbLEhbexXt3HEVY305FzuEnVmj5skWluXP"
  "98myz00pMJlYmL5oNQIDAQAB")

Копираме ключа и го добавяме в DNS сървъра. Разбира се трябва да го оправим малко ключа т.е. трябва да изглежда така в нашия случай: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5jCReX1jJhsC5pDRIqgk3UCkNPsfn8KBpjZCr8AxRDPmiXTAtDDEEfH1DTRBey8CMRglMvX9hMWdTReACK4a2o85pkhcbV/6XlOhUGiT/7Dv8/9yEu68eRTIbLEhbexXt3HEVY305FzuEnVmj5skWluXP98myz00pMJlYmL5oNQIDAQAB Ако искате можете да си оправите и spf записа в нейм сървъра. Преди да пипате нейм сървъра и не знаете какви са параметрите на spf и domainkeys, провете в интернет, за да имате някаква представа какво правите и двата параметъра могат да накарат мейл сървърите в интернет да не приемат писма от вашият мейл сървър.

example.com.     1D      IN      TXT     "v=spf1 a mx -all"
example.com.     1D      IN      TXT     "spf2.0/pra ip4:ип–то–на–вашият–мейл–сървър ip6:ип6–то–на–вашият–мейл–сървър–ако–има–такова ptr:example.com -all"
_domainkey.example.com.  1D      IN      TXT     "t=y; o=-"
mail._domainkey.example.com.  1D      IN      TXT     "v=DKIM1; k=rsa; t=y; p=ТУКА ДОБАВЯМЕ КЛЮЧА;"
или редът трябва да изглежда така:
mail._domainkey.example.com.  1D      IN      TXT     "v=DKIM1; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5jCReX1jJhsC5pDRIqgk3UCkNPsfn8KBpjZCr8AxRDPmiXTAtDDEEfH1DTRBey8CMRglMvX9hMWdTReACK4a2o85pkhcbV/6XlOhUGiT/7Dv8/9yEu68eRTIbLEhbexXt3HEVY305FzuEnVmj5skWluXP98myz00pMJlYmL5oNQIDAQAB;"

Остава да настроим postfix-а и може да се каже, че сме готови. Аз също не съм голям специалист по postfix, с проба - грешка и питане в мейлинг листите го нагласих. Ето как изглежда при мен файла main.cf който се намира в /etc/postfix/

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix

inet_protocols = ipv4, ipv6

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no
readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/postfix/ssl/mail.example.com.crt
smtpd_tls_key_file=/etc/postfix/ssl/mail.example.com.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

disable_vrfy_command = yes
strict_rfc821_envelopes = yes
myhostname = mail.stzbg.com
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
#mydestination = $myhostname, localhost.$mydomain, localhost
#relayhost = $mydomain
mynetworks = 44.44.44.44/32 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
#mailbox_command = /usr/bin/procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
html_directory = no
message_size_limit = 30720000
virtual_mailbox_base = /var/spool/postmail
# Тук при мен uid 1004 е равно на потребител vmail, group 1005 е равно на група vmail
virtual_uid_maps = static:1004
virtual_gid_maps = static:1005
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unauth_destination,
  check_helo_access hash:/etc/postfix/helo_checks,
  check_sender_access hash:/etc/postfix/helo_checks,
  check_recipient_access pcre:/etc/postfix/recipient_checks.pcre,
  reject_invalid_hostname,
  reject_unauth_pipelining,
  reject_non_fqdn_sender,
  reject_unknown_sender_domain,
  reject_non_fqdn_recipient,
  reject_unknown_recipient_domain,
  reject_unlisted_sender,
  reject_rbl_client cbl.abuseat.org,
  reject_rbl_client accredit.habeas.com,
  reject_rbl_client bl.spamcop.net,
  reject_rbl_client iadb.isipp.com,
  reject_rbl_client dnsbl.njabl.org,
  reject_rbl_client dnsbl.sorbs.net,
  reject_rbl_client plus.bondedsender.org,
  permit

smtpd_tls_CAfile = /etc/postfix/ssl/mail.example.com.pem
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
virtual_transport = dovecot
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_alias_maps =
   proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf,
   proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_maps.cf,
   proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_catchall_maps.cf
virtual_mailbox_maps =
   proxy:mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf,
   proxy:mysql:/etc/postfix/mysql_virtual_alias_domain_mailbox_maps.cf

# Това е старо и не се подържа във версия 2.9
# Additional for quota support
#virtual_create_maildirsize = yes
#virtual_mailbox_extended = yes
#virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
#virtual_mailbox_limit_override = yes
#virtual_maildir_limit_message = Sorry, the user's maildir has overdrawn his diskspace quota, please try again later.
#virtual_overquota_bounce = yes

proxy_read_maps = $local_recipient_maps $mydestionation $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps transport_maps $mynetworks $virtual_mailbox_limit_maps

content_filter = smtp-amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings
smtpd_sasl_type = dovecot
smtpd_helo_required = yes
smtpd_helo_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_invalid_helo_hostname,
  reject_unknown_helo_hostname,
  reject_non_fqdn_helo_hostname,
  permit
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
setgid_group = postdrop
manpage_directory = /usr/local/man
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq

Ето го и файла: master.cf Основната промяна е тука която е и целта за да може да използваме mailgraph. Ако искате да не използвате mailgraph може да намерите конфигурационните файлове в директорията от която може да ги изтеглите (описана е по на долу), те завършват с nograp разширение.

smtp      inet  n       -       n       -       -       smtpd
    -o smtpd_etrn_restrictions=reject
    -o smtpd_sasl_auth_enable=yes
    -o smtpd_client_connection_count_limit=10
dovecot   unix  -       n       n       -       -       pipe
    flags=DRhu user=vmail:vmail argv=/usr/local/libexec/dovecot/deliver -d ${recipient}

pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
        -o smtp_fallback_relay=
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache
#smtp      inet  n       -       n       -       1       postscreen
#smtpd     pass  -       -       n       -       -       smtpd
dnsblog   unix  -       -       n       -       0       dnsblog
tlsproxy  unix  -       -       n       -       0       tlsproxy

smtp-amavis unix -      -       n     -       2  smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=20

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_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=reject_unauth_pipelining
    -o smtpd_end_of_data_restrictions=
    -o mynetworks=127.0.0.0/8
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
    -o local_header_rewrite_clients=

dksign    unix  -       -       n       -       4       smtp
    -o smtp_send_xforward_command=yes
    -o smtp_discard_ehlo_keywords=8bitmime,starttls

Ако решите да променяте част от настройките, имайте на предвид, че може да забраните някои параметри, които сте разрешили в main.cf файла. Всички файлове, които са описани в main.cf +, стартиращите скриптове и базата данни може да изтеглите от ТУКА Поиграйте си малко с файловете helo_checks и recipient_checks.pcre, можете да си ги настроите така, че да блокират писма, които не пристигат от вашия емайл сървър, а се представят, че са. След като приключите с тях изпълнявате командата:

postmap /etc/postfix/helo_checks

Създавате директория sasl и файл smtpd.conf със следното съдържание:

mkdir /etc/postfix/sasl
cd /etc/postfix/sasl
echo "pwcheck_method: auxprop" > /etc/postfix/sasl/smtpd.conf
echo "auxprop_plugin: sql" >> /etc/postfix/sasl/smtpd.conf
echo "mech_list: PLAIN LOGIN" >> /etc/postfix/sasl/smtpd.conf
echo "sql_engine: mysql" >> /etc/postfix/sasl/smtpd.conf
echo "sql_hostnames: localhost" >> /etc/postfix/sasl/smtpd.conf
echo "sql_user: postfix" >> /etc/postfix/sasl/smtpd.conf
echo "sql_passwd: postfix" >> /etc/postfix/sasl/smtpd.conf
echo "sql_database: postfix" >> /etc/postfix/sasl/smtpd.conf
echo "#sql_verbose: yes" >> /etc/postfix/sasl/smtpd.conf
echo "sql_select: SELECT password FROM mailbox WHERE username = '%u'" >> /etc/postfix/sasl/smtpd.conf
chown root.root /etc/postfix/sasl/smtpd.conf
chmod 0640 /etc/postfix/sasl/smtpd.conf
chgrp -R postdrop /var/spool/postfix/public
chgrp -R postdrop /var/spool/postfix/maildrop
/usr/sbin/postfix set-permissions
postfix check

За да може без проблемно след това да добавяте домейни, менаджирате, пощи и т.н. ви съветват да си инсталирате postfixadmin.
Ако имате някакви коментари и въпроси пишете ми на електронната поща: my email mask с радост ще Ви помогна.

Valid HTML5 Powered with CSS3 / Styling, and Semantics Valid CSS!