Настройка спам-фильтра DSpam (dspam, dspam-web, dovecot-antispam) в CentOS/RHEL 7

Содержание

Установка DSpam

Сначала установим необходимые пакеты:

$ yum -y install dspam dspam-mysql dspam-web

В CentOS 6 пользователь dspam создавался с UID, который меньше 500 и возникала проблема с запуском веб-части DSpam в Apache, поэтому приходилось менять UID. Сейчас эта часть уже не актуальна:

$ usermod -u 597 dspam
$ find /usr -user 497 -exec chown dspam {} \;
$ find /var -user 497 -exec chown dspam {} \;

Создадим для DSpam базу и специального пользователя в MySQL:

$ mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2639
Server version: 5.5.40-MariaDB MariaDB Server

Copyright (c) 2000, 2014, Oracle, Monty Program Ab and others.

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

MariaDB [(none)]> CREATE DATABASE `%DSpamDB%` DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.01 sec)

MariaDB [(none)]> CREATE USER '%DSpamUser%'@'localhost' IDENTIFIED BY '%DSpamPassWord%';
Query OK, 0 rows affected (0.10 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON `%DSpamDB%`.* TO '%DSpamUser%'@'localhost';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> \q
Bye

Теперь создадим в базе MySQL необходимые для работы таблицы:

$ cp /usr/share/dspam/sql-scripts/mysql/mysql_objects-4.1.sql /tmp
$ sed -i 's/MyISAM/InnoDB/g' /tmp/mysql_objects-4.1.sql
$ mysql -u %DSpamUser% -p --database='%DSpamDB%'

Условимся, что здесь и далее вместо %DSpamDB%, %DSpamUser% и %DSpamPassWord% нужно вписывать название базы данных, имя пользователя и пароль. Никаких процентов!

Настройка DSpam

$ nano -w /etc/dspam.conf
StorageDriver /usr/lib64/dspam/libmysql_drv.so
#TrustedDeliveryAgent "/usr/bin/procmail"
DeliveryHost		127.0.0.1
DeliveryPort		11025
DeliveryIdent		localhost
DeliveryProto		SMTP
Trust postfix
Preference "spamAction=deliver"
Preference "spamSubject="
Preference "signatureLocation=headers"
MySQLServer		/var/lib/mysql/mysql.sock
#MySQLPort
MySQLUser		DSpamUser
MySQLPass		DSpamPassWord
MySQLDb			DSpamDB
MySQLCompress		false
MySQLReconnect		true
#PurgeSignatures 14
#PurgeNeutral   90
#PurgeUnused    90
#PurgeHapaxes   30
#PurgeHits1S    15
#PurgeHits1I    15
PurgeSignature	off
PurgeNeutral	90
PurgeUnused	off
PurgeHapaxes	off
PurgeHits1S	off
PurgeHits1I	off
ServerPID		/var/run/dspam/dspam.pid
ServerMode auto
ServerParameters	"--user dspam --deliver=innocent,spam -d %u"
ServerIdent		"mail.example.com"
ServerDomainSocketPath	"/var/run/dspam/dspam.sock"
$ chown dspam /etc/dspam.conf

Теперь можно запустить DSpam:

$ systemctl enable dspam.service
$ systemctl start dspam.service
$ systemctl status dspam.service
dspam.service - A highly accurate statistical spam filter that uses minimal resources
   Loaded: loaded (/usr/lib/systemd/system/dspam.service; enabled)
   Active: active (running) since Fri 2014-11-28 01:16:19 MSK; 11s ago
  Process: 3517 ExecStart=/usr/bin/dspam --daemon 2>/dev/null (code=exited, status=0/SUCCESS)
 Main PID: 3518 (dspam)
   CGroup: /system.slice/dspam.service
           └─3518 /usr/bin/dspam --daemon 2>/dev/null

Nov 28 01:16:19 example.com dspam[3518]: Daemon process starting
Nov 28 01:16:19 example.com systemd[1]: Started A highly accurate statistical spam filter that uses minimal resources.

Настройка postfix

$ nano -w /etc/postfix/dspam_filter
/./	FILTER dspam:unix:/var/run/dspam/dspam.sock
$ chcon -u system_u /etc/postfix/dspam_filter
$ nano -w /etc/postfix/main.cf
smtpd_recipient_restrictions =
	...
	check_recipient_access pcre:/etc/postfix/dspam_filter
	permit

$ nano -w /etc/postfix/master.cf
dspam     unix  -       -       n       -       10      lmtp
127.0.0.1:11025 inet  n       -       n       -       -       smtpd
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8
  -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 receive_override_options=no_unknown_recipient_checks

Настройка SELinux для DSpam и Postfix

$ semanage port -a -t smtp_port_t -p tcp 11025

$ nano -w dspam-postfix.te
module dspam-postfix 2.3;

require {
	type dspam_var_run_t;
	type smtp_port_t;
	type postfix_smtp_t;
	type dspam_t;
	class sock_file write;
	class unix_stream_socket connectto;
	class dir search;
	class tcp_socket name_connect;
}

#============= dspam_t ==============
allow dspam_t smtp_port_t:tcp_socket name_connect;

#============= postfix_smtp_t ==============
allow postfix_smtp_t dspam_t:unix_stream_socket connectto;
allow postfix_smtp_t dspam_var_run_t:dir search;
allow postfix_smtp_t dspam_var_run_t:sock_file write;

$ checkmodule -M -m dspam-postfix.te -o dspam-postfix.mod
checkmodule:  loading policy configuration from dspam-postfix.te
checkmodule:  policy configuration loaded
checkmodule:  writing binary representation (version 17) to dspam-postfix.mod
$ semodule_package -m dspam-postfix.mod -o dspam-postfix.pp
$ semodule -i dspam-postfix.pp
$ rm -f dspam-postfix.{mod,pp}

После того как SELinux настроен соответствующим образом для взаимосвязи postfix и DSpam – можно перезапустить postfix:

$ systemctl restart postfix

Настройка fetchmail

Настроим fetchmail, для того, чтобы он принятую почту принимал с использованием DSpam:
1-й вариант (попроще)

$ nano -w /usr/lib/fetchmail/fetchmail.pl
#	$cmd.=" mda ".$mda if ($mda);
	$cmd.=" mda \"/usr/bin/dspam --user dspam --deliver=innocent --rcpt-to ${mailbox}\"";
#	$cmd.=" is '${mailbox}' here";

2-й вариант (правильнее):
В PostfixAdmin, в настройках fetchmail нужно прописать следующий mda:

"/usr/bin/dspam --user dspam --deliver=innocent --rcpt-to ${mailbox}"

прямо так, с кавычками. Имейте в виду, PostfixAdmin должен быть исправлен так как описано в этой статье, иначе PostfixAdmin будет неправильно записывать значения MDA в базу MySQL.

Настройка Apache и DSpam-web

$ nano -w /etc/httpd/conf.d/dspam-web.conf
Listen 8443 https

	ServerAdmin postmaster@example.com
	SSLEngine on
	SSLProtocol all -SSLv2 -SSLv3
	SSLCertificateFile /etc/pki/tls/certs/mail.example.com.crt
	SSLCertificateKeyFile /etc/pki/tls/private/mail.example.com.key
	SSLCertificateChainFile /etc/pki/tls/certs/sub.class1.server.ca.pem
...


$ nano -w /var/www/dspam/configure.pl
$CONFIG{'LOCAL_DOMAIN'}	= "example.com";

$ htpasswd -c /var/www/dspam-passwd dspam
$ chcon -u system_u /var/www/dspam-passwd
$ chown root:apache /var/www/dspam-passwd
$ chmod 0640 /var/www/dspam-passwd

$ firewall-cmd --permanent --zone=public --add-port=8443/tcp
$ firewall-cmd --reload

Настройка SELinux для DSpam-web и Apache

$ nano -w dspam-httpd.te
module dspam-httpd 2.3;

require {
        type httpd_dspam_script_t;
        type passwd_file_t;
        type dspam_var_lib_t;
        class file { read getattr open append };
}

#============= httpd_dspam_script_t ==============
allow httpd_dspam_script_t dspam_var_lib_t:file append;
allow httpd_dspam_script_t passwd_file_t:file { read getattr open };

$ checkmodule -M -m dspam-httpd.te -o dspam-httpd.mod
checkmodule:  loading policy configuration from dspam-httpd.te
checkmodule:  policy configuration loaded
checkmodule:  writing binary representation (version 17) to dspam-httpd.mod
$ semodule_package -m dspam-httpd.mod -o dspam-httpd.pp
$ semodule -i dspam-httpd.pp
$ rm -f dspam-httpd.{mod,pp}

Перезапустим Apache:

$ systemctl reload httpd.service

Теперь можно открыть в браузере ссылку https://mail.example.com:8443/ для доступа к DSpam-web.

Настройка Dovecot

Для того, чтобы Dovecot письма со спамом помещал в папку Spam, нужно проделать следующее:

$ mkdir /var/spool/mail/example.com/username.sieve/
$ touch /var/spool/mail/example.com/username.sieve/roundcube.sive
$ ln -s roundcube.sieve /var/spool/mail/example.com/username.sieve/.dovecot.sieve
$ chown mail:mail /var/spool/mail/example.com/username.sieve/ -R
$ chcon -u system_u /var/spool/mail/example.com/username.sieve/ -R
$ chmod 0700 /var/spool/mail/example.com/username.sieve/

$ nano -w /var/spool/mail/example.com/username.sieve/roundcube.sive
## Generated by Roundcube Webmail SieveRules Plugin ##
require ["regex","body","imap4flags","fileinto","subaddress"];

# rule:[Удаляем безвозвратно...]
if anyof (address :is "From" "VIAGRA",
        header :contains "Subject" "VIAGRA")
{
        discard;
        stop;
}
# rule:[.Spam]
elsif allof (header :contains "X-DSPAM-Result" "SPAM",
        not header :contains "X-DSPAM-Reclassified" "Innocent")
{
        setflag "\\Seen";
        fileinto "Spam";
        stop;
}

Таким образом все письма в теме которых (или в поле автор) есть слово VIAGRA – будут автоматически удаляться. А те письма, которые DSpam пометил как Spam – будут помечаться прочитанными и попадать в папку Spam. Имейте в виду, Dovecot должен быть настроен так как описано в этой статье.

Но, как известно, в некоторых случаях письма со спамом не определяются как Spam, а некоторые письма, наоборот, отмечаются как спам по ошибке. В таких случаях необходимо сказать DSpam, что вот это письмо, к примеру, не спам, а вот это, наоборот спам. Это нужно для самообучения DSpam.
Отмечать ошибочные письма как спам/не спам можно в вебинтерфейсе DSpam, но это сложный вариант, мы настроим проще.

Установка плагина dovecot-antispam

Обновление от 08.12.2018 (данный раздел уже не актуален и оставлен только для истории, см. …).

Для Dovecot есть специальный плагин, который будет следить за перемещением писем в почтовом ящике и в случае необходимости передавать эти письма на обучение DSpam. К примеру, если письмо вытаскивают из папки Spam (кроме случаев когда эти письма кладут в корзину), такое письмо передаётся DSpam со словами – это не спам. А если письмо наоборот, кладут в папку Spam, такое письмо передаётся DSpam со словами – это спам!

Плагина, который, обеспечивает нужный нам функционал, в репозиториях CentOS нет, поэтому соберём его и установим из исходников. Для этого сделаем следующее:

$ yum -y install gcc automake autoconf
$ yum -y install openssl-devel
$ yum -y install dovecot-devel
$ cd /usr/local/src
$ wget http://dl.atrpms.net/all/dovecot-devel-2.2.10-1_14.el7.x86_64.rpm
$ rpm -ivh --nodeps dovecot-devel-2.2.10-1_14.el7.x86_64.rpm
$ wget http://hg.dovecot.org/dovecot-antispam-plugin/archive/tip.tar.gz -O dovecot-antispam.tar.gz
$ tar zxvf dovecot-antispam.tar.gz
$ cd dovecot-antispam-plugin-*/
$ ./autogen.sh
$ ./configure --prefix=/usr --with-dovecot=/usr/lib64/dovecot
$ sed -i 's/copying_via_save/copying/g' src/mailbox.c
$ make install
$ cd ../
$ rm -rf dovecot-antispam-plugin-*/

В CentOS 6 присутствовал пакет dovecot-devel в репозитории EPEL, поэтому не было нужды его скачивать с сайта atrpms.net. В CentOS 7 на момент написания статьи этого пакета в репозитории EPEL ещё не было, так что, если команда yum -y install dovecot-devel выдаст ошибку – скачайте пакет вручную и установите. А если пакет установится из репозитория – скачивать и устанавливать его вручную не нужно будет.

Если в момент выполнения команды make install мы увидим следующие ошибки:

signature-log.c: In function ‘signature_log_transaction_begin’:
signature-log.c:122: error: too many arguments to function ‘dict_init’
Failed to compile signature-log.c (plugin)!
make[3]: *** [signature-log.plugin.o] Error 1
make[2]: *** [all] Error 2
make[1]: *** [src] Error 2
make: *** [all] Error 2

нужно будет сделать следующее:

$ nano -w src/signature-log.c
меняем строки:
    if (dict_init(cfg->dict_uri, DICT_DATA_TYPE_STRING, cfg->dict_user,
                cfg->base_dir, &sltc->dict, NULL))
на строки:
    sltc->dict =
          dict_init(cfg->dict_uri, DICT_DATA_TYPE_STRING, cfg->dict_user,
          cfg->base_dir);

    if (sltc->dict == NULL)
$ make install
$ cd ../
$ rm -rf dovecot-antispam-plugin-*/

Если ошибок не будет – значит всё ок.

Теперь пропишем скомпилированный и установленный плагин в настройки dovecot:

$ nano -w /etc/dovecot/conf.d/90-plugin.conf
plugin {
  antispam_backend = dspam
  antispam_spam = Spam
  antispam_trash = Trash
  antispam_unsure = Trash
  antispam_dspam_binary = "/usr/bin/dspam"
  antispam_dspam_args = "--user;dspam;--source=error;--signature=%%s;-d;%u"
  antispam_signature = X-DSPAM-Signature
}
$ nano -w /etc/dovecot/conf.d/20-imap.conf
mail_plugins = $mail_plugins antispam

Настройка SELinux для плагина dovecot-antispam

$ nano -w dspam-dovecot.te
module dspam-dovecot 2.20;

require {
	type dovecot_t;
	type dovecot_deliver_t;
	type dspam_exec_t;
	type dspam_var_lib_t;
	type httpd_dspam_rw_content_t;
	type mysqld_t;
	type mysqld_db_t;
	type mysqld_var_run_t;
	type usr_t;
	type var_t;
	type var_lib_t;
	type cron_var_lib_t;
	class dir { search getattr };
	class file { lock rename read create append write getattr link unlink open execute execute_no_trans };
	class process signull;
	class sock_file write;
	class unix_stream_socket connectto;
}

allow dovecot_deliver_t var_t:file { rename read create write getattr link unlink open };
allow dovecot_deliver_t self:process signull;
allow dovecot_t dovecot_deliver_t:process signull;
allow dovecot_t dspam_exec_t:file { read open execute execute_no_trans };
allow dovecot_t dspam_var_lib_t:dir { search getattr };
allow dovecot_t dspam_var_lib_t:file { lock read getattr open append write };
allow dovecot_t httpd_dspam_rw_content_t:dir { search getattr };
allow dovecot_t httpd_dspam_rw_content_t:file { lock read getattr open append write };
allow dovecot_t mysqld_t:unix_stream_socket connectto;
allow dovecot_t mysqld_db_t:dir search;
allow dovecot_t mysqld_var_run_t:sock_file write;
allow dovecot_t usr_t:file { read getattr open };
allow dovecot_t var_lib_t:file { lock read getattr open append write };
allow dovecot_t cron_var_lib_t:file { lock getattr open append };

$ checkmodule -M -m dspam-dovecot.te -o dspam-dovecot.mod
checkmodule:  loading policy configuration from dspam-dovecot.te
checkmodule:  policy configuration loaded
checkmodule:  writing binary representation (version 17) to dspam-dovecot.mod
$ semodule_package -m dspam-dovecot.mod -o dspam-dovecot.pp
$ semodule -i dspam-dovecot.pp
$ rm -f dspam-dovecot.{mod,pp}

После настройки плагина – перезапустим dovecot:

$ systemctl restart dovecot
$ systemctl status dovecot
dovecot.service - Dovecot IMAP/POP3 email server
   Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled)
   Active: active (running) since Sat 2014-11-29 02:12:50 MSK; 4s ago
  Process: 32357 ExecStartPre=/usr/libexec/dovecot/prestartscript (code=exited, status=0/SUCCESS)
 Main PID: 32361 (dovecot)
   CGroup: /system.slice/dovecot.service
           ├─32361 /usr/sbin/dovecot -F
           ├─32364 dovecot/anvil
           ├─32365 dovecot/log
           └─32367 dovecot/config

Nov 29 02:12:50 example.com systemd[1]: Started Dovecot IMAP/POP3 email server.
Nov 29 02:12:51 example.com dovecot[32361]: master: Dovecot v2.2.10 starting up for imap, sieve (core dumps disabled)

Сейчас можете попробовать поместить письмо в папку Spam и посмотреть в веб-интерфейсе DSpam, поменялся ли статус у данного письма во вкладке «История».
Так же можно посмотреть, нет ли ошибок в SELinux:

$ cat /var/log/audit/audit.log | grep -e "dspam|dovecot" | grep AVC | ausearch -i

Если ошибок нет, а статус письма в веб-интерфейсе DSpam меняется – значит мы настроили всё правильно.

Обновление от 18.01.2016

Во время очередного обновления CentOS, отказались обновляться пакеты dovecot:

mail:~# yum -y update 
Loaded plugins: changelog, fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.schlundtech.de
 * epel: fedora.uib.no
 * extras: ftp-stud.fht-esslingen.de
 * updates: mirror.ratiokontakt.de
Resolving Dependencies
--> Running transaction check
---> Package dovecot.x86_64 1:2.2.10-4.el7_0.1 will be updated
---> Package dovecot.x86_64 1:2.2.10-5.el7 will be an update
---> Package dovecot-mysql.x86_64 1:2.2.10-4.el7_0.1 will be updated
---> Package dovecot-mysql.x86_64 1:2.2.10-5.el7 will be an update
---> Package dovecot-pigeonhole.x86_64 1:2.2.10-4.el7_0.1 will be updated
---> Package dovecot-pigeonhole.x86_64 1:2.2.10-5.el7 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
 Package               Arch      Version             Repository          Size
=============================================================================
Updating:
 dovecot               x86_64    1:2.2.10-5.el7      base               3.2 M
 dovecot-mysql         x86_64    1:2.2.10-5.el7      base                65 k
 dovecot-pigeonhole    x86_64    1:2.2.10-5.el7      base               303 k
 
Transaction Summary
=============================================================================
Upgrade  3 Packages

Total size: 3.5 M
Downloading packages:
Running transaction check
ERROR with transaction check vs depsolve:
dovecot = 1:2.2.10-1_14.el7 is needed by (installed) dovecot-devel-1:2.2.10-1_14.el7.x86_64
** Found 1 pre-existing rpmdb problem(s), 'yum check' output follows:
1:dovecot-devel-2.2.10-1_14.el7.x86_64 has missing requires of dovecot = ('1', '2.2.10', '1_14.el7')
Your transaction was saved, rerun it with:
 yum load-transaction /tmp/yum_save_tx.2016-01-18.09-35.YDfLDF.yumtx

yum нам предлагаем выполнить yum check, что ж, выполним:

mail:~# yum check
Loaded plugins: changelog, fastestmirror
1:dovecot-devel-2.2.10-1_14.el7.x86_64 has missing requires of dovecot = ('1', '2.2.10', '1_14.el7')
Error: check all

Ожидаемо не помогло. Окей, удалим пакет который нам мешает, обновим оригинальные пакеты, а потом опять установим dovecot-devel.

mail:~# yum -y remove dovecot-devel.x86_64 
Loaded plugins: changelog, fastestmirror
Resolving Dependencies
--> Running transaction check
---> Package dovecot-devel.x86_64 1:2.2.10-1_14.el7 will be erased
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
 Package               Arch      Version             Repository          Size
=============================================================================
Removing:
 dovecot-devel         x86_64    1:2.2.10-1_14.el7   installed          906 k
 
Transaction Summary
=============================================================================
Remove  1 Package

Installed size: 906 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Erasing    : 1:dovecot-devel-2.2.10-1_14.el7.x86_64                     1/1 
  Verifying  : 1:dovecot-devel-2.2.10-1_14.el7.x86_64                     1/1

Removed:
  dovecot-devel.x86_64 1:2.2.10-1_14.el7                                                                      

Complete!

mail:~# yum -y update 
Loaded plugins: changelog, fastestmirror
Loading mirror speeds from cached hostfile
 * base: centos.schlundtech.de
 * epel: fedora.uib.no
 * extras: ftp-stud.fht-esslingen.de
 * updates: centos.copahost.com
Resolving Dependencies
--> Running transaction check
---> Package dovecot.x86_64 1:2.2.10-4.el7_0.1 will be updated
---> Package dovecot.x86_64 1:2.2.10-5.el7 will be an update
---> Package dovecot-mysql.x86_64 1:2.2.10-4.el7_0.1 will be updated
---> Package dovecot-mysql.x86_64 1:2.2.10-5.el7 will be an update
---> Package dovecot-pigeonhole.x86_64 1:2.2.10-4.el7_0.1 will be updated
---> Package dovecot-pigeonhole.x86_64 1:2.2.10-5.el7 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================
 Package               Arch      Version             Repository          Size
=============================================================================
Updating:
 dovecot               x86_64    1:2.2.10-5.el7      base               3.2 M
 dovecot-mysql         x86_64    1:2.2.10-5.el7      base                65 k
 dovecot-pigeonhole    x86_64    1:2.2.10-5.el7      base               303 k
 
Transaction Summary
=============================================================================
Upgrade  3 Packages

Total size: 3.5 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : 1:dovecot-2.2.10-5.el7.x86_64                              1/6 
  Updating   : 1:dovecot-pigeonhole-2.2.10-5.el7.x86_64                   2/6 
  Updating   : 1:dovecot-mysql-2.2.10-5.el7.x86_64                        3/6 
  Cleanup    : 1:dovecot-mysql-2.2.10-4.el7_0.1.x86_64                    4/6 
  Cleanup    : 1:dovecot-pigeonhole-2.2.10-4.el7_0.1.x86_64               5/6 
  Cleanup    : 1:dovecot-2.2.10-4.el7_0.1.x86_64                          6/6 
  Verifying  : 1:dovecot-pigeonhole-2.2.10-5.el7.x86_64                   1/6 
  Verifying  : 1:dovecot-2.2.10-5.el7.x86_64                              2/6 
  Verifying  : 1:dovecot-mysql-2.2.10-5.el7.x86_64                        3/6 
  Verifying  : 1:dovecot-mysql-2.2.10-4.el7_0.1.x86_64                    4/6 
  Verifying  : 1:dovecot-2.2.10-4.el7_0.1.x86_64                          5/6 
  Verifying  : 1:dovecot-pigeonhole-2.2.10-4.el7_0.1.x86_64               6/6 

Updated:
  dovecot.x86_64 1:2.2.10-5.el7 dovecot-mysql.x86_64 1:2.2.10-5.el7 dovecot-pigeonhole.x86_64 1:2.2.10-5.el7

Complete!

mail:~# cd /usr/local/src
mail:/usr/local/src# wget http://dl.atrpms.net/all/dovecot-devel-2.2.10-1_14.el7.x86_64.rpm
mail:/usr/local/src# rpm -ivh --nodeps dovecot-devel-2.2.10-1_14.el7.x86_64.rpm 
warning: dovecot-devel-2.2.10-1_14.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 66534c2b: NOKEY
Preparing...                         ################################# [100%]
Updating / installing...
   1:dovecot-devel-1:2.2.10-1_14.el7 ################################# [100%]

Обновились. 🙂

Обновление от 08.12.2018

После очередного обновления CentOS, плагин dovecot-antispam перестал работать, т.к. плагины должны быть скомпилированы с актуальной версией пакета dovecot. Т.е. нужно было либо опять перекомпилировать пакет dovecot и устанавливать его, либо искать какое-нибудь более актуальное решение. Решение нашлось достаточно быстро, и плагин был удалён:

mail:~# yum -y remove dovecot-antispam.x86_64
mail:~# nano -w /etc/dovecot/conf.d/90-plugin.conf
plugin {
}
$ nano -w /etc/dovecot/conf.d/20-imap.conf
mail_plugins = $mail_plugins

$ nano -w /etc/dovecot/conf.d/90-sieve.conf
  sieve_extensions = +notify +imapflags +vnd.dovecot.pipe +vnd.dovecot.environment
  sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
  sieve_plugins = sieve_imapsieve sieve_extprograms

$ nano -w /etc/dovecot/conf.d/20-imap.conf
protocol imap {
  mail_plugins = $mail_plugins imap_sieve
}

$ nano -w /etc/dovecot/conf.d/90-sieve-extprograms.conf
plugin {
  # From elsewhere to Spam folder
  imapsieve_mailbox1_name = Spam
  imapsieve_mailbox1_causes = COPY
  imapsieve_mailbox1_before = file:/usr/lib64/dovecot/sieve/mark-as-spam.sieve

  # From Spam folder to elsewhere
  imapsieve_mailbox2_name = *
  imapsieve_mailbox2_from = Spam
  imapsieve_mailbox2_causes = COPY
  imapsieve_mailbox2_before = file:/usr/lib64/dovecot/sieve/mark-as-ham.sieve

  sieve_pipe_bin_dir = /usr/lib64/dovecot/sieve
}

# systemctl restart dovecot.service
# systemctl status dovecot.service -l
● dovecot.service - Dovecot IMAP/POP3 email server
   Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2018-12-08 23:52:24 MSK; 9s ago
     Docs: man:dovecot(1)
           http://wiki2.dovecot.org/
  Process: 8025 ExecStop=/usr/bin/doveadm stop (code=exited, status=0/SUCCESS)
  Process: 8037 ExecStart=/usr/sbin/dovecot (code=exited, status=0/SUCCESS)
  Process: 8030 ExecStartPre=/usr/libexec/dovecot/prestartscript (code=exited, status=0/SUCCESS)
 Main PID: 8040 (dovecot)
   CGroup: /system.slice/dovecot.service
           ├─8040 /usr/sbin/dovecot
           ├─8041 dovecot/anvil
           ├─8042 dovecot/log
           └─8044 dovecot/config

Dec 08 23:52:23 acmenet.ru systemd[1]: Starting Dovecot IMAP/POP3 email server...
Dec 08 23:52:24 acmenet.ru dovecot[8040]: master: Dovecot v2.2.36 (1f10bfa63) starting up for imap, sieve (core dumps disabled)
Dec 08 23:52:24 acmenet.ru systemd[1]: Started Dovecot IMAP/POP3 email server.

$ nano -w /usr/lib64/dovecot/sieve/mark-as-spam.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "dspam-learn-spam.sh" [ "${username}" ];

$ nano -w /usr/lib64/dovecot/sieve/mark-as-ham.sieve
require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];

if environment :matches "imap.mailbox" "*" {
  set "mailbox" "${1}";
}

if string "${mailbox}" "Trash" {
  stop;
}

if environment :matches "imap.user" "*" {
  set "username" "${1}";
}

pipe :copy "dspam-learn-ham.sh" [ "${username}" ];

$ nano -w /usr/lib64/dovecot/sieve/dspam-learn-spam.sh
#!/bin/sh
exec /usr/bin/dspam --client --user ${1} --class=spam --source=error

$ nano -w /usr/lib64/dovecot/sieve/dspam-learn-ham.sh
#!/bin/sh
exec /usr/bin/dspam --client --user ${1} --class=innocent --source=error

$ sievec /usr/lib64/dovecot/sieve/mark-as-spam.sieve
$ sievec /usr/lib64/dovecot/sieve/mark-as-ham.sieve
$ chmod +x /usr/lib64/dovecot/sieve/dspam-learn-ham.sh /usr/lib64/dovecot/sieve/dspam-learn-spam.sh

Если в mail warning log'е будут появляться ошибки вида:
2018 Dec  9 00:05:06 dspam[8739]: Signature retrieval for '5c0c155726779832043448
' failed
2018 Dec  9 00:05:06 dspam[8739]: Unable to find a valid signature. Aborting.
2018 Dec  9 00:05:06 dspam[8739]: process_message returned error -5.  dropping message.

Значит нужно раскомментировать одну строку в конфигурационном файле DSpam'а.
$ nano -w /etc/dspam.conf
Broken lineStripping

Comments

  1. Анатолий
    05.03.2015 - 01:43

    Добрый день! Спасибо за отличную статью!
    Хотел узнать, пробовали ли вы использовать dspam-milter, для интеграции dspam с postfix?
    Если да, был бы очень признателен за описание процесса настройки.
    Успехов!

    • Добрый.
      Не очень понял вопрос. Дспам ведь и так интегрируется с постфиксом. Постфикс каждое письмо обрабатывает дспамом. Разве нет?

      • Анатолий
        05.03.2015 - 13:35

        В вашем примере dspam интегрируется с postfix посредством SMTP протокола. Мой вопрос был про интеграцию посредством технологии milter, что дает ряд преимуществ. Нативной поддержки milter в dspam нет, но есть пакет dspam-milter (https://github.com/whyscream/dspam-milter), который позволяет настроить взаимодействие postfix и dspam, посредством данной технологии.

        • Понято. Пока не делал. Дополнительно только dkim прикрутил. Надо будет выложить описание.

  2. Андрей
    28.10.2015 - 15:29

    Подскажите пожалуйста, почему возникает такая ошибка?
    В интернете много информации по написанию .te файлов и по анализу ошибок selinux, много чего перепробовал,но пока не нашёл решения. Подскажите пожалуйста в каком направлении искать

    $ semodule -i dspam-dovecot.pp
    libsepol.print_missing_requirements: dspam-dovecot’s global requirements were not met: type/attribute httpd_dspam_rw_content_t (No such file or directory).
    libsemanage.semanage_link_sandbox: Link packages failed (No such file or directory).
    semodule: Failed!

Добавить комментарий