22 Юли 2018, версия 5

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

Hristo C. Simeonov
Rev 5: 22 Jul 2018

     Преди няколко дни ми се наложи да си преместя мейл сървъра на друг сървър. От доста време му бях набрал на моя мейл сървър, който беше на qmail. Нямам нищо против qmail, просто вече е морално остарял. Първата сигурна версия на Qmail 1.3 се появи през 1998 година и общо взето от тогава кода му не е мръднал много много, което от своя страна си е малко неудобство. За всяко ново нещо което ти потрябва, трябва да търсиш разни пачове из мрежата, пък те не били цели, нещо не им работило ... общо взето, ако искаш да го инсталираш с малко по нови неща, може да си строшиш нервите. На този адрес https://www.ixip.net/qmail/ има една страница, която бях писал през 2005 година и актуализирал до 2010 как да си инсталираме qmail. Вече не я обновявам, тъй като смятам, че qmail си е загуба на време.
     Има разлика в трите версии, както се казва за всеки по нещо. Крайния резултат е един и същи, методите са различни. Във версия 1 и 4 голяма част от нещата се случват благодарение на разни модули писани на perl. До тук добре, докато няма актуализация на текущата версия на perl примерно от версия 5.26.0 на 5.28.0, но и с всяка друга версия, тогава разбирате в какъв филм сте се забъркали. Разбира се, другите операционни системи нямат такива проблеми защото за разлика от Slackware имат пектни мениджъри и богати хранилища със софтуер където всичко вече е свършено от някой друг, за потребителя остава само да го изтеглите и пуснете и в повечето случаи даже е конфигурирано предварително и на края да си сложите титлата "Администратор" или "Админ" която Ви харесва повече :)
     В тази версия съм премаханал всички модули на Perl и съм ги заменил с Rspamd. Един софтуер който заменя SpamAssassin, но покрай инсталацията и Amavis-а става излишен. В същност точно заради проблеми с Amavis тръгнах да търся вариант за негоава замяна.
     Едно много важно нещо преди да изберете кой е вашия метод на инсталация трябва да Ви кажа. Сега няма да Ви рисувам схеми, тях може да си ги намерите в интернет ако искате да си обясните по - подробно процесите, но това което трябва да знаете е: Във версията с Rspamd не се подържат алиаси. Всъшност той няма отношение с алиасите, но е променен самия метод по който се доставя писмото. След като минат проверките писмото се доставя до Dovecot-а който не знае какво да го прави. На Вас може никога да не Ви се наложи да ги използвате, аз ги ползвах за следното:
     Искам да си направя регистрация някъде и сайта трябва да ми изпрати писмо за удостоверение на което трябва да натисна линка. Разбира се, не желая да си давам мейла за да не получавам спам след това, повечето от сайтовете продават базата данни с мейловете на други лица, а и сайтовете за безплатно получаване на емайли са забранени във въпросния сайт. Имам 1 - 2 постоянни алиаса например алиаса който раздавам: hc@mydomain.com който пренасочва писмата към истинският ми емайл адрес hcs@mydomain.com. Като зачести спама към алиаса го изтривам.
Старата версия на статията R2 може да бъде намерена на адрес: https://www.ixip.net/postfix/postfix-r2.html. Разликата в двете статий е, че в тази съм премахнал вече DKIMproxy (защото писмата се проверяват и подписват от rspamd и не е необходимо още един процес да работи) и съм добавил mailgraph.

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

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

OpenSSL >= 1.1.0h 27 Mar 2018
MariaDB / MySQL >= 10.11.9
Perl > = 5.28.0
Dovecot > = 2.3.2.1
Postfix > = 3.3.1
Също така всички пакети, които теглим ще приемаме, че са свалени в /usr/local/src
Пакетите Dovecot и Postfix вече са част от дистрибуцията на Slackware за това няма да ги преинсталираме, но все пак ако на някой му се наложи нещо специфично, може да потърси по - старата версия на документа където съм описал с какви параметри се компилират.
Има някои нови пакети които ще ни трябват. Redis, ragel version 6.10, Lua, LuaJIT. Redis-a не е задължителен, но много от модулите на Rspamd-то са изключени без Redis и не могат да се използват. Ето линковете към официалeните им станици:
Официални страници:
Redis - https://redis.io/
Ragel - https://www.colm.net/open-source/ragel/
Lua - https://www.lua.org/
LuaJIT - http://luajit.org/
Ако не Ви се занимава да ги компилирате, може да ги изтеглите от адреса по - долу. Внимавайте само за Redis - пакет който се актуализира често, за разлика от другите пакети които имат нова версия веднъж на високосна година.

wget http://www.ixip.net/postfix/downloads/lua-5.1.5-x86_64-1.txz
wget http://www.ixip.net/postfix/downloads/luajit-2.0.5-x86_64-3cf.txz
wget http://www.ixip.net/postfix/downloads/ragel-6.10-x86_64-2cf.txz
wget http://www.ixip.net/postfix/downloads/redis-4.0.10-x86_64-1.txz
installpkg lua-5.1.5-x86_64-1.txz
installpkg luajit-2.0.5-x86_64-3cf.txz
installpkg ragel-6.10-x86_64-2cf.txz
installpkg redis-4.0.10-x86_64-1.txz

Dovecot

Официалния сайт на продукта dovecot е: www.dovecot.org.
В тази документация съм използвал версия 2.3.2.1. Да преминем към инсталирането на софтуера. Първо трябва да си създадем базата в 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 utf8mb4 COLLATE utf8mb4_unicode_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

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

# 2.2.29.1 (e0b76e3): /etc/dovecot/dovecot.conf
# OS: Linux 4.9.30 x86_64 Slackware 14.2 
auth_mechanisms = plain login
base_dir = /var/run/dovecot/
default_login_user = nobody

dict {
  driver = sql
  quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
}

mail_location = maildir:/var/spool/postmail/%d/%n/Maildir
mail_privileged_group = vmail

passdb {
  args = /etc/dovecot/dovecot-sql.conf.ext
  driver = sql
}

protocols = imap lmtp sieve

service imap-login {
  inet_listener imap {
    address = 127.0.0.1
    port = 143
  }
  inet_listener imaps {
    address = 0.0.0.0
    port = 993
  }
}

service lmtp {
    unix_listener /var/spool/postfix/private/dovecot-lmtp {
        mode = 0660
        group = postfix
        user = postfix
    }
    user = vmail
}

ssl_cert = </etc/postfix/ssl/mail.example.com.crt
ssl_key = </etc/postfix/ssl/mail.example.com.key
ssl_dh = </etc/dovecot/dhparams.pem

userdb {
   driver = static
   args = uid=1002 gid=1001 home=/var/spool/postmail/%d/%n 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
openssl dhparam -out /etc/dovecot/dh2048.pem 2048
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.
Сега ще създадем и ключа за да не го забравим после. Може да потърсите и информация как да го вържите с Let's Encrypt

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 utf8mb4 COLLATE utf8mb4_unicode_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.3-pigeonhole-0.5.2.tar.gz
chown -R root.root dovecot-2.3-pigeonhole-0.5.2
cd dovecot-2.3-pigeonhole-0.5.2
./configure
make
make install

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

# cat /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.100.1 Първо добавяме групата и потребителя, под който ще ни работи антивирусната програма, аз съм избрал имената им по подразбиране.

groupadd clamav
useradd clamav -g clamav -c 'ClamAV system user' -d /var/lib/clamav -s /bin/false
tar xzvf clamav-0.100.1.tar.gz
chown -R root.root clamav-0.100.1
cd clamav-0.100.1
./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. Те ще работят, ако сте следвали точно инструкциите.

Rspamd

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

tar xzvf dcc.tar.Z
chown -R root.root dcc-1.3.163
cd dcc-1.3.163
./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"

Отваряме файла dcc_conf който се намира в директрорията /var/dcc/dcc_conf и променяме следните настройки:

DCCM_LOG_AT=NEVER
DCCM_REJECT_AT=MANY
DCCIFD_ENABLE=on

Продължаваме ...

wget https://git.rspamd.com/vstakhov/rspamd/archive/1.7.8.tar.gz
tar xzvf 1.7.8.tar.gz
cd rspamd
mkdir rspamd.build
cd rspamd.build
cmake ..
make
make install

Може да си инсталирате допълнително и Hyperscan. Има една малка особенност при компилирането на Rspamd, след версиите 2.2+ на Slackware. За да го компилирате успешно трябва да промените линкера. Вижте долният абзац.
  
    cmake/Toolset.cmake

Switch LLD_PATH and GOLD_PATH conditions in cmake/Toolset.cmake, so it looks like:

if(NOT LINKER_NAME)
    if(GOLD_PATH)
        set(LINKER_NAME "gold")
    elseif(LLD_PATH)
        set(LINKER_NAME "lld")
    else()
        message(STATUS "Use generic 'ld' as a linker")
    endif()
endif()

Well it builds if I pass LDFLAGS='-fuse-ld=lld' to the cmake environment with some weird errors in CMakeLTOTest (doesn't seem to be critical).
  
и след това може да замените реда:
  
    cmake ..
  
с
  
    cmake .. -DENABLE_HYPERSCAN=ON -DENABLE_LUAJIT=ON -DBUILD_SHARED_LIBS=YES -DENABLE_JEMALLOC=OFF
  
Сега трябва да конфигурираме Rspamd. Rspamd има много конфигурационни файлове, разработчците на проекта съветват да не се редактират основните файлове, а да използваме имената които са запазили за самостартиране. На сайта на rspamd, може да намерите докуметация за всички модули и как да ги пуснете. Разгледайте ги и си направете вашите настройки по начина който желаете. Може да копирате съдържанието на файловете по - долу, аз ще активирам някои от най - използваемите модули и ще се старая да оставям по някой коментар кое за какво е. Всички наши конфигурационни файлове отиват в /usr/local/etc/rspamd/local.d.
Първо трябва да използваме rspamadm pw за да си генерираме хеш за паролата която се използва да можем да влезим в страницата на статистиката.

rspamadm pw
Enter passphrase: 
$2$pajhfjsixyp7aj7n1gsje1t3ha4f46m1$4mxk5uwggdgdfgdddrtt445648t5ew4jjsn7zme9r5bd9fry

Копираме хеша и отваряме първия конфигурационен файл worker-controller.inc. Може да работи и през сокет, но няма да може да настроите проксито на уеб сървъра, за това съм го конфигурирал да слуша на tcp 127.0.0.1

count = 1;
password = "$2$pajhfjsixyp7aj7n1gsje1t3ha4f46m1$4mxk5uwggdgdfgdddrtt445648t5ew4jjsn7zme9r5bd9fry";
enable_password = "$2$bpwpkrfnzqohu8z5g3z61cbyyxf6t394$rqzji3cds7wq15k65onmf6gdzrd5nq3ndp1q441b9z11ptdo1fub";
#bind_socket = "/var/run/rspamd/rspamd.sock mode=0666 owner=nobody";
bind_socket = "127.0.0.1:11334";
secure_ip = "127.0.0.1";
#secure_ip = "::1";
static_dir = "${WWWDIR}";

worker-normal.inc

enabled = true;

worker-proxy.inc

milter = yes; # Enable milter mode
timeout = 120s; # Needed for Milter usually
bind_socket = "/var/run/rspamd/milter.sock mode=0666 owner=nobody";
#bind_socket = "127.0.0.1:11334"

upstream "local" {
  default = yes;
  self-scan = yes;
}

count = 4; # Do not spawn too many processes of this type
max_retries = 5; # How many times master is queried in case of failure
discard_on_reject = false; # Discard message instead of rejection
quarantine_on_reject = false; # Tell MTA to quarantine rejected messages
spam_header = "X-Spam"; # Use the specific spam header
reject_message = "Spam message rejected"; # Use custom rejection message

redis.conf

servers = "127.0.0.1";

antivirus.conf

clamav {
    action = "reject";
    attachments_only = true;
    #max_size = 20000000;
    type = "clamav";
    # You can enable logging for clean messages
    #log_clean = true;
    # servers to query (if port is unspecified, scanner-specific default is used)
    # can be specified multiple times to pool servers
    # can be set to a path to a unix socket
    # Enable this in local.d/antivirus.conf
    servers = "127.0.0.1:3310";
}

dcc.conf

host = "/var/dcc/dccifd";
# Port is only required if `dccifd` listens on a TCP socket
# port = 1234
timeout = 5s;

mx_check.conf

enabled = true;

phishing.conf

openphish_enabled = true;
phishtank_enabled = true;

surbl.conf

redirector_hosts_map = "/usr/local/etc/rspamd/redirectors.inc";

url_reputation.conf

enabled = true;

url_tags.conf

enabled = true;

replies.conf

action = "no action";

Може да си генерирате и ключовете за домейните с rspamadm dkim_keygen dkim_signing.conf

path = "/usr/local/etc/dkeys/$domain/$domain.$selector.key";
#path = "/var/db/rspamd/dkim/$domain.$selector.key";
selector = "mail";

Може да си инсталирате Razor2 и Pyzor, но смятам, че е безсмисленно. Ако все пак искате, може да разгледате документацията ТУК

Mailgraph

Ако искате да гледате графика на получените писма и да я изучавате, трябва да настройте http сървъра да проксира заявките. Ето примерна конфигурация за Apache, може да го реализирате с Nginx, lighthttpd и др.

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.example.com
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:11334/
    ProxyPassReverse / http://127.0.0.1:11334/
    ServerName your.virtual.net
</VirtualHost>

Ако нямате контрол над DNS-a или не Ви се занимава, може да конфигурирате Apache с mod_rewrite и .htaccess .

RewriteEngine On
RewriteRule ^/rspamd/(.*) http://127.0.0.1:11334/$1 [P,L]
<Location /rspamd>
  Options FollowSymLinks
  Require all granted
</Location>

DomainKeys / DKIM

Разбира се, всички стартиращи файлове могат да се изтеглят от ТУК Това е готово, сега остава да генерираме ключовете на домейните и след това да ги добавим в нейм сървъра. Сега да генерираме ключовете. Обърнете внимание, че пътищата тъка са различни както описаните по - горе в настойките на rspamd. Трябва да сочат към едни и същи файлове. Оправете ги.

rspamadm dkim_keygen -k /var/db/rspamd/dkim/example.com.dkim.key -b 2048 -s dkim -d example.com

След като приключите ще видите низа който трябва да добавите в зоната на съответния домейн. Не забравяйте да смените сериала :)

dkim._domainkey IN TXT ( "v=DKIM1; k=rsa; "
        "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzGdxkFW0tIDYdNrGyj/J2Hff7N/9BEWE2qxMw6PBW5FhJRullZT9WNZOVrrXk1TsiBHRq8YQrSS1TfLbNV9PE7sE0vGx0eLgkiqnqLMwTy5Y9+jEbiNrddNR6v+TGHuMckYJO3JMjiROhMi/86Lv6P/rv2R/lxFldCeYQxa41/8LH+b3ZXWTLYRM6y2/2UpGz/wtknvA+DtO0rn+YuLuPrh+ftzmJb6i3g01XFgAO8ZzMLMdO/k7UJDX/Q6himKxVv2t3vSvS1MGqiWThXiU3WxhQED0zZUlkC5Lfx4BCo1h0v7fwZeMdu2NPOzlDBMDq5HRYgbwuFXTAmxSM7WRqQIDAQAB"
) ;

Ако искате можете да си оправите и 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_unverified_recipient,
  reject_unauth_pipelining,
  reject_unknown_sender_domain,
  reject_unknown_recipient_domain,
  reject_unlisted_sender,
  reject_unauth_destination,
  reject_non_fqdn_hostname,
  reject_non_fqdn_sender,
  reject_non_fqdn_recipient,
  reject_rbl_client cbl.abuseat.org,
  reject_rbl_client dnsbl-1.uceprotect.net,
  reject_rbl_client bl.spamcop.net,
  reject_rbl_client iadb.isipp.com,
  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


##
## Local mail delivery to Dovecot via LMTP
##

#virtual_transport = dovecot
virtual_transport = lmtp:unix:private/dovecot-lmtp


virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_virtual_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

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/libexec/dovecot/dovecot-lda -f ${sender} -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

submission inet n - n - - smtpd
    -o smtpd_tls_dh1024_param_file=/etc/postfix/ssl/dhparams.pem
    -o smtpd_tls_security_level=encrypt
    -o smtpd_sasl_auth_enable=yes
    -o smtpd_sasl_type=dovecot
    -o smtpd_sasl_path=private/auth
    -o smtpd_sasl_security_options=noanonymous
    -o smtpd_sasl_local_domain=$myhostname
#    -o milter_macro_daemon_name=ORIGINATING

smtps     inet  n       -       n       -       -       smtpd
    -o smtpd_tls_wrappermode=yes
    -o smtpd_sasl_auth_enable=yes
    -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#    -o milter_macro_daemon_name=ORIGINATING


Ако решите да променяте част от настройките, имайте на предвид, че може да забраните някои параметри, които сте разрешили в 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

Ако всичко работи, трябва да обучите Rspamd да разпознава спам писмата и периодично да го обучавате, тъй като и спамерите не спят. Когато се съберат повече писма които не са спам, може лесно да го научите кои писма не са спам с командата: rspamc learn_ham directory
Компанията Art Invoice предоставя за сваляне спама който получава. Всеки ден е архивиран с gzip и готов за обучение. Има само един проблем, формата е mbox, а на нас ни трябва Maildir.
Намерих в GitHub конвертор написан на python който конвертира mbox формат в Maildirs. Казва се mb2md.py, свалете го и го направете да може да се стартира (chmod +x за тези които са забравили). Направете една нова директиря и изтеглете файла в нея. Създавате един нов файл в тази директирия, на пример: spamdl.sh и копирате съдържанието вътре в него:

#!/bin/bash
spamfile=spam--`date '+%Y-%m-%d'`.gz
spamfile_unpacked=spam--`date '+%Y-%m-%d'`
wget http://artinvoice.hu/spams/$spamfile
gunzip $spamfile
./mb2md.py -i $spamfile_unpacked -o spam/
rspamc learn_spam spam/cur/
rm -r $spamfile_unpacked spam/
exit 0

След като се уверим, че файла mb2md.py има флаг +х стартираме шел скрипта: sh spamdl.sh
Може да го добавите в cron-а за да се стартира веднъж на ден или като се сетите го пускайте.
За да може без проблемно след това да добавяте домейни, менаджирате, пощи и т.н. ви съветват да си инсталирате postfixadmin.
Ако имате някакви коментари и въпроси пишете ми на електронната поща: my email mask с радост ще Ви помогна.

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