Настройка amavis ubuntu postfix

Обновлено: 04.07.2024

DomainKeys Identified Mail (DKIM) is a method for E-mail authentication, allowing a person who receives email to verify that the message actually comes from the domain that it claims to have come from. The need for this type of authentication arises because spam often has forged headers.

DKIM uses public-key cryptography to allow the sender to electronically sign legitimate emails in a way that can be verified by recipients.

DKIM also guards against tampering with mail, offering almost end-to-end integrity from a signing to a verifying Mail transfer agent (MTA).

dkim-milter is a milter-based application (dkim-filter) which plugs in to Postfix to provide DomainKeys Identified Mail service for your mail server. dkim-milter is no longer being developed, and it's original author has forked the source and is now developing opendkim. For Lucid and later releases, opendkim is preferred over dkim-filter. The instructions on this page should be the same (just with adjusted package names as needed).

We assume you already successfully installed Postfix MTA, if not, please read the Postfix dedicated page.

To install opendkim, you need Universe repositories added, if so, use your favorite package manager and install the package.

Important: For 12.04 Precise you must install opendkim from the precise backports. Note that backports are enabled only by using /precise-backports on a given package, so this will not affect any other packages you have installed.

opendkim configuration consists of two files:

Use your favorite editor to edit those files. Here's an example of /etc/opendkim.conf file already edited to suit my needs:

Actually /etc/opendkim.conf is the most important file. It provides our milter with required information about selector (used for DNS requests and email verifications) and used signing key (the key is used for signing the outgoing emails).

Here's an example of /etc/default/opendkim This file is used to connect the milter to MTA:

In my case, this file needs no additional editing.

Now, to tell the Postfix about the existing milter, and where to connect with it, edit your Postfix main.cf file /etc/postfix/main.cf, and append to its content the following data:

If you are using already some milter (for example Postfix/DomainKeys), you can add the new one like this:

The opendkim-tools package provides a tool, opendkim-genkey for creating your key pairs:

This will generate two files: mail.private which is your private key, and mail.txt which is your DNS record containing your public key.

The -s argument supplies the selector (in our case "mail"), the -d argument supplies the domain, and the -t argument says that we are running DKIM in test mode. This indicates that verifiers shouldn't drop your mail if something's wrong with the signature. Its seems that the majority using DKIM run it in test mode.

Copy your private key in place:

Now create your DNS record as supplied in mail.txt, which should look like this:

Once configuration above was done, the daemon can be started with:

Instead of using sudo service opendkim start you can run dkim-filter directly:

If you get the error like: dkim-filter: milter socket must be specified Then try manually specifying the socket. Use this to specify local (which does not match /etc/default/dkim-filter above):

Now restart the Postfix MTA, and check for email signing:

http://stas.nerd.ro/blog/data/dkim-filter.jpg

Testing results should look like this in Gmail:

Missing signature

If something is not functioning properly (emails are not being signed) look for errors in the log:

The following error indicates the filter ran properly however could not match the outgoing email domain with a filter (and thus no signature was generated):

Consider changing the domain to a wildcard in /etc/opendkim.conf:

Using a domain of * will require putting the dkim key into EACH domain's DNS zone file for those domains that send email using this server. The dkim signing will work for your server, but without updating each DNS zone file, the public key will not be found by the recipient mail server.

Multiple signatures

If amavis-new is installed and dkim signs emails multiple times with same domain and selector, is the configuration error likely to be how you feed messages back to postfix from amavis.

Head to /etc/postfix/master.cf look for the section starting with:

Find the option -o receive_override_options= and add ,no_milters to the end of that line. A corrected config could look something like this:

Postfix/DKIM (последним исправлял пользователь kvamlnk 2014-05-08 01:36:57)

The material on this wiki is available under a free license, see Copyright / License for details
You can contribute to this wiki, see Wiki Guide for details

Amavisd-new - это программная оболочка, которая может вызывать любое количество фильтрующих программ по обнаружению спама, антивирусов и т.п.

ClamAV - антивирусное приложение с открытым кодом.

opendkim является почтовым фильтром Sendmail для стандарта DKIM (почты, заверенной доменными ключами).

python-policyd-spf обеспечивает проверку SPF (структуры политики отправителя) с Postfix.

А здесь то, как эти части работают вместе:

Установка

Смотрите раздел Postfix для установки и настройки Postfix.

Чтобы установить основные приложения введите следующее в терминале:

Существуют некоторые общие пакеты, подключаемые к Spamassassin для лучшего определения спама:

Поскольку основным фильтрующим приложениям требуются утилиты архивации для обработки прикрепленных файлов:

Если какие-то пакеты не были найдены, проверьте что хранилище multiverse разрешено в /etc/apt/sources.list.

Если вы внесли изменения в этот файл, убедитесь, что выполнили

перед повторной попыткой установки.

Настройка

Теперь настроим чтобы все работало и фильтровало почту.

ClamAV

Стандартное поведение ClamAV вполне подходит для наших нужд. Для дополнительных опций настройки смотрите конфигурационные файлы в /etc/clamav.

Добавьте пользователя clamav в группу amavis, чтобы Amavisd-new имел соответствующие права доступа для сканирования файлов:

Spamassassin

Spamassassin автоматически определяет общие компоненты и использует их, если они присутствуют. Это означает, что нет необходимости настраивать pyzor и razor.

Отредактируйте /etc/default/spamassassin для активации сервиса Spamassassin. Измените

Теперь запустим сервис:

Amavisd-new

Сначала активируем проверку на спам и вирусы в Amavisd-new, отредактировав /etc/amavis/conf.d/15-content_filter_mode:

Возврат спама может быть плохой идеей, поскольку обратный адрес часто неверный. Подумайте над тем, чтобы изменить в /etc/amavis/conf.d/20-debian_defaults установку $final_spam_destiny на D_DISCARD вместо D_BOUNCE, как показано ниже:

Если сетевое имя сервера отличается от MX записи домена, вам может потребоваться установить вручную опцию $myhostname. Также, если сервер принимает почту для нескольких доменов, опцию @local_domains_acl потребуется изменить. Отредактируйте файл /etc/amavis/conf.d/50-user:

Если вы хотите покрывать несколько доменов, вы можете использовать следующее в файле /etc/amavis/conf.d/50-user:

После настройки Amavisd-new требуется перезапустить:

Белые списки DKIM

Amavisd-new может быть настроен на автоматическое занесение адресов в белый список из доменов с действительными доменными ключами. Есть несколько предварительно настроенных доменов в /etc/amavis/conf.d/40-policy_banks.

Существует несколько вариантов настройки белого списка для домена:

Домен может иметь несколько настроек белого списка. После редактирования файла, перезапустите amavisd-new:

Postfix

Для интеграции Postfix, введите следующее из терминала:

Далее отредактируйте /etc/postfix/master.cf, добавив следующее в коне файла:

Также добавьте следующие две строки непосредственно после транспортного сервиса "pickup":

Теперь перезапустите Postfix:

Фильтрация содержимого с поиском спама и вирусов теперь включена.

Amavisd-new и Spamassassin

Существует несколько вариантов разрешить эту ситуацию:

Измените /usr/sbin/amavisd-new-cronjob на проверку, что use_bayes установлен в 0. Например, отредактируйте /usr/sbin/amavisd-new-cronjob, добавив следующее в начало до строк проверки:

Проверка

Для начала проверьте, что Amavisd-new SMTP активен:

Ваш вариант может отличаться, но важно чтобы присутствовали записи X-Virus-Scanned и X-Spam-Status.

Разрешение проблем

Лучший способ обнаружить, что что-то идет не так - проверить файлы журнала.

1. Для инструкций по журналам Postfix смотрите раздел Разрешение проблем.

Приступаем к настройке.

Все действия в этой статье выполняются от пользователя root.

1. Настройка Amavisd-new

Устанавливаем необходимые пакеты

Добавим пользователя clamav в группу amavis

Приступаем к настройке amavis

Редактируем файл /etc/amavis/conf.d/15-content_filter_mode раскоментировав в нём следующие строки

Теперь редактируем файл /etc/amavis/conf.d/20-debian_defaults

Всё остальное я оставил по умолчанию.

Теперь переходим в каталог /usr/sbin/

И редактируем файл amavisd-new Находим в нём строки

2. Настройка DSPAM

Теперь приступаем к настройке Dspam.

На данном этапе существует 2-а способа установки dspam:

1. Установка старой версии 3.6.8 из репозитория ubuntu

2. Установка последней версии 3.9.1-RC1 из исходников

В данной статье я опишу оба способа, выбирайте кому какой больше нравится. Стоит отметить что в последней версии присутствует русифицированный web интерфейс. Остальные различия думаю найдёте сами

2.1. Установка dspam из репозитория ubuntu

Устанавлмваем необходимые пакеты

В процессе установки вас спросят создавать ли базу для dspam, соглашаемся, необходимо будет указать root пароль от mysql и пароль для пользователя от которого будет работать dspam с mysql.

Переходим в каталог /etc/dspam и приступаем к редактированию dspam.conf Ниже я приведу свой конфиг dspam с некоторыми коментариями

Приступаем к настройке web интерфейса dspam

Создаём файл .htpasswd в каталоге /var/www/dspam/ и запишем в него пароль для пользователя amavis

Даём права группе www-data на этот файл

Теперь создаём файл dspam в каталоге /etc/apache2/conf.d/

и вставляем в него следующее содержимое

Установим недостающий модуль для apache и активируем его

Устанавливаем пользователя amavis в качестве админа в web интерфейсе dspam

Теперь необходимо отредактировать файл /etc/dspam/webfrontend.conf заменив значение одной строки на свой домен

Далее редактируем файл /etc/dspam/conf.d/mysql.conf убрав коментарий с параметра MySQLUIDInSignature

И разрешим доступ к этому файлу группе amavis

Отредактируем файл /etc/default/dspam заменив в нём значение параметра START с no на yes.

2.2. Установка dspam из исходников

Установим необходимые пакеты для сборки dspam

Установим procmail (используется в качестве доставщика в dspam)

Добавим пользователя dspam

Переходим в каталог /usr/src и скачиваем последнюю версию dspam (версия 3.9.1-RC1 последняя на момент написания статьи)

Распаковываем полученный архив

Переходим в папку dspam-3.9.1-RC1

Если всё прошло нормально то устанавливаем

Добавляем базу dspam в mysql

Создаём таблицы в БД dspam

Заходим в mysql

и добавляем пользователя dspam, так же даём этому пользователю все права на БД dspam

Для выхода набираем

Назначаем права на запуск dspam

Переходим к установке web интерфейса

Создадим необходимый каталог и установим на него права

Копируем файлы web интерфейса в созданный каталог, назначаем права на скопированные файлы

Удаляем make файлы, они нам не нужны

Создаём символическую ссылку на файл пользовательских настроек по умолчанию, в каталог /etc/dspam, для того чтоб эти настройки были видны демону dspam

Создаём файл .htpasswd в каталоге /var/www/dspam/ и запишем в него пароль для пользователя amavis

Даём права группе www-data на этот файл

Теперь создаём файл dspam в каталоге /etc/apache2/conf.d/

и вставляем в него следующее содержимое

Установим недостающий модуль для apache и активируем его

Устанавливаем дополнительные пакеты для того чтоб в web интерфейсе отображались графики

Устанавливаем пользователя amavis в качестве админа в web интерфейсе dspam

Теперь необходимо отредактировать файл /var/www/dspam/configure.pl

В следующей строке укажите ваш домен

Следующие строки отредактируйте как в примере, убрав комментарии и заменив значения на те что показаны ниже

Разрешим доступ к конфигурационному файлу dspam группе amavis

Переходим в каталог /etc/dspam и редактируем файл dspam.conf Ниже приведен мой конфиг. Этот конфиг во многом совпадает с конфигом который описывался выше для версии из убунтовского репозитория, Начиная с версии 3.8.0 в dspam появился параметр Tokenizer, более подробно читайте о нём здесь

Создадим каталог /var/run/dspam и назначим ему права

Совсем не обязательно запускать dspam в качестве демона, так как amavis сам при каждой проверки запускает dspam с необходимыми параметрами, но если вы всё таки хотите чтоб dspam стартовал в качестве демона при загрузке сервера вам необходимо выполнить следующее:

создать два файла

в этот файл запишите

и создать скрипт запуска в /etc/init.d (скрипт взят из пакета dspam в репозитории ubuntu)

содержимое этого скрипта

Установите права на скрипт

Создайте символические ссылки на скрипт в rcX.d для автоматического запуска dspam при загрузке сервера.

2.3 Настройка автоматической очистки базы dspam от устаревших записей

Копируем необходимые sql файлы

Создаём файл с названием dspam

и кладём этот скрипт в /etc/cron.daily

Устанавливаем права на скрипт

2.4 Настройка ротации логов dspam

Создаём файл с названием dspam

и кладём его в /etc/logrotate.d

Вот собственно и всё, настройка dspam законченна.

3. Подключение amavis и dspam в postfix

редактируем master.cf добавив в конец файла следующие строки

Создаём файл /etc/postfix/transports и записываем в него

Преобразуем данный файл в базу данных

Если не создавали скрипт запуска dspam то эту команду выполнять не нужно

На всякий случай проверяем статус clamav-daemon

если * clamd is running то всё ок если нет то запускаем

4. Добавление пользователя amavis в базу dspam.

Создадим файл message.txt с произвольным содержанием

И выполним команду

После чего в домашнем каталоге dspam должна появится папка

внутри которой будут файлы amavis.log, amavis.stats.

Установим права на домашний каталог dspam и всё его содержимое

Всё, настройка amavis + dspam + clamav закончена.

5. Тестирование

In this howto, Postfix integration with amavis-new will be presented. Amavis-new is a wrapper that can call any number of content filtering programs for spam detection, antivirus, etc. In this howto, integration with Spamassassin and Clamav will be presented. This is a classical installation of Postfix + Amavis-new + Spamassassin + Clamav.

You should have a functional Postfix server installed. If this is not the case, follow the Postfix guide.

To begin, install (see InstallingSoftware) the following packages:

Install the optional packages for better spam detection (who does not want better spam detection?):

Install these optional packages to enable better scanning of attached archive files:

Note: Ubuntu 12.04 LTS doesn't have unzoo. Ubuntu 14.04 LTS doesn't have lha. You may try to substitute lhasa.

Clamav

The default behaviour of Clamav will fit our needs. A daemon is launched (clamd) and signatures are fetched every day. For more Clamav configuration options, check the configuration files in /etc/clamav.

Add clamav user to the amavis group and vice versa in order for Clamav to have access to scan files:

Note: especially when driven on small cloud instances, VPS or routers there were concerns about the memory consumption. There is a good summary why virus scanning in general has a rather high memory consumption in general. An admin setting up such a solution needs to consider that

200-350mb seem to be rather normal.

Spamassassin

As amavis is its own spamassassin-daemon (amavis uses the spamassassin libraries), there is no need in configuring or starting spamassassin. amavis will not use any running instance of spamd!

The use of razor and pyzormust be enabled by

There is no need of configuring razor or pyzor.

Amavis

First, activate spam and antivirus detection in Amavis by editing /etc/amavis/conf.d/15-content_filter_mode:

After configuration Amavis needs to be restarted:

Postfix integration

For postfix integration, you need to add the content_filter configuration variable to the Postfix configuration file /etc/postfix/main.cf. This instructs postfix to pass messages to amavis at a given IP address and port:

The following postconf command, run as root because of the preceding sudo command, adds the content_filter specification line above to main.cf:

Alternatively, you can manually edit main.cf yourself to add the content_filter line.

Next edit /etc/postfix/master.cf and add the following to the end of the file:

Also add the following two lines immediately below the "pickup" transport service:

This will prevent messages that are generated to report on spam from being classified as spam.

Now content filtering with spam and virus detection is enabled.

First, test that the amavis SMTP is listening:

Check on your /var/log/mail.log that everything goes well. If you raise the log level, you can check every step of the content filtering: spam check, virus check, etc. Don't forget to lower the log level after your checks!

On messages that go through the content filter you should see:

Note: $sa_tag_level in /etc/amavis/conf.d/20-debian_defaults must be lower than spam hit rating for the header to appear on the message. For troubleshooting set $sa_tag_level to -999

If the filtering is not happening, adding the following to /etc/amavis/conf.d/50-user may help:

If you receive mail for other domains, add them to the list. This information was obtained from the Amavis-New FAQ here.

If you see the following error in /var/log/syslog when amavisd is trying to scan a message:

amavis[30807]: (30807-01) (!!) ask_av (ClamAV-clamd) FAILED - unexpected result: /var/lib/amavis/tmp/amavis-20070615T125025-30807/parts: lstat() failed. ERROR\n

Try changing the permissions on /var/lib/amavis/tmp:

You can also change AllowSupplementaryGroups in /etc/clamav/clamd.conf:

Another way to trouble shoot errors associated with Amavisd-new, Spamassassin, Postfix, or Clamav is to restart all the services with Amavisd-new being the last one to start:

Then check /var/log/mail.log and see if the error has gone away.

Note: $sa_tag_level in /etc/amavis/conf.d/20-debian_defaults must be lower than spam hit rating for the header to appear on the message. For troubleshooting set $sa_tag_level to -999

To increase the number of processes that amavisd-new uses above the default 2 edit the file /etc/amavis/conf.d/50-user inserting the line:

where X is the number of processes you wish amavis to use.

Amend the following line in /etc/postfix/master.cf with the same value for the max_procs (marked below as X)

Restart amavis and reload postfix's config

You can check the configuration change has taken affect by running amavisd-nanny:

For guidance on how many processes to set this value to please see:


Note: This guide has been tested on Ubuntu 7.10 (Gutsy Gibbon), Ubuntu 10.04 LTS Server (Lucid Lynx), Ubuntu 12.04.3 LTS (Precise Pangolin), and Ubuntu 14.04.2 LTS (Trusty Tahr).

PostfixAmavisNew (последним исправлял пользователь dominic-timedicer 2019-09-25 10:55:39)

The material on this wiki is available under a free license, see Copyright / License for details
You can contribute to this wiki, see Wiki Guide for details

Есть масса инструкций, как поднять почтовый сервер на связке postfix — amavisd-new — dovecot. И подавляющее большинство из них повторяют друг друга почти дословно, включая ошибки и неточности.

Мне кажется скучным бездумно нажимать кнопки, поэтому я решил оптимизировать стандартную конфигурацию: что если построить взаимодействие postfix и amavisd-new не через localhost, а на unix socket?

Как оказалось, всё не так просто, но я это сделал! Инструкция и патч под катом.

Честно сказать, я вообще не люблю взаимодействие через localhost в пределах одной машины. Если требуется организовать обмен данными между двумя приложениями, то гораздо правильнее, безопаснее и менее ресурсоёмко сделать это через unix socket на файловой системе. Тем более, что так можно организовать защиту (средствами прав на файловой системе) даже там, где она отсутствует на уровне приложения или протокола.

Итак, путь почты в обсуждаемой связке выгладит так:


Выходит, нам нужно организовать две стыковки: при передаче на фильтрацию и при возврате обратно в MTA. Так как сокет создаёт слушатель, то в первом случае это будет amavisd, а во втором — postfix.

Начнём со второго, ибо это проще и лучше описано. Для того, чтобы postfix создал слушающий сокет, нужно просто во второй колонке master.cf (колонка type) указать unix, а не inet. В этом случае первая колонка определяет путь и имя файла сокета.

Так как процессы postfix работают в chroot (это можно отключить для конкретного процесса, но не стоит), то папку нужно создать внутри домашней директории postfix: /var/spool/postfix. В ней будут оба сокета:


Ну и конфигурация postfix:


Конкретные опции зависят от вашей настройки, это мой вариант.

Тут есть две беды:

  1. Путь будет относительно /var/spool/postfix/private, на которую навешаны очень строгие права.
  2. Не уверен, что во всех дистрибутивах так, но в Ubuntu точно. Права на папку лучше не трогать (там лежат сокеты всех сервисов postfix), лучше просто создать symlink.
  3. Помимо сокета, postfix создаёт и pid-файл для процесса, имя которого генерируется автоматически по маске $type.$name. Где type будет равен unix, а name берётся из первой колонки master.cf. Получается unux.amavis/postfix-in т.е. файл в подпапке. Сам он её не создаст и упадёт с ошибкой.


Не очень красиво, но и не деструктивно для штатной структуры папок пакета.

Перезапускаем postfix и убеждаемся, что файл сокета появился в папке amavis, а pid-файл в pid/unix.amavis. К сожалению, права на сокет — 666, но права на папку, которую создали ранее, защитят файл от лишних глаз.

Проверить работу можно командой:


Отлично, с этим справились. Теперь к amavisd.

Сначала настроим обратный путь почты через unix socket, принадлежащий postfix. Это работает из коробки:


Ну а теперь самое сложное — настроить сокеты в amavisd. Решение можно найти в интернете, но там предлагается использовать единственный сокет, задаваемый параметром $unix_socketname. Мне же хотелось, чтобы и собственный протокол amavisd-new (AM.PDP) и приём почты происходили через сокеты.

Файл с конфигурацией по умолчанию содержит упоминание дерективы @listen_sockets, но никакого описания для неё нет. Зато оно есть в release notes, даже с примерами! Правда и там сокет всего один, но что мешает попробовать?

ОК, а как задать протокол для сокета (который указывается в policy bank)? Во всех примерах пишут просто SOCK. По аналогии с inet-сокетами (там можно указать хост-порт) я предположил, что нужно указывать полный путь к файлу сокета. Вот что получилось:


Перезапускаю, проверяю — действительно, создались оба сокета! Победа? Не совсем, при попытке подключиться к сокету, ничего не происходит, а в лог записывается ошибка, что протокол для него не определён. Выходит, policy bank к ним не применяются.

Как же так? Пришлось идти в код.


Плохая — что $unix_socket_path приходит в эту функцию пустым. Заполняется он следующим образом:


И оба свойства там пустые.

Изучение документации подсказало такой вариант:


И это заработало! Готовый .patch можно сказать здесь.

Остался последний штрих. Так как amavisd создаёт свой сокет с правами только на себя, а доступ для остальных мы запретили (что верно), то нужно добавить postfix в группу amavis, чтобы он смог писать в сокет:

Читайте также: