28 KiB
| title | date | draft | description | tags | categories | series | series_order | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Почтовый сервер на Debian 12: полное руководство от установки до production. Часть 3 - Защита от спама и вирусов | 2026-03-16 | false | Настройка Amavis, ClamAV, SpamAssassin и Postgrey для защиты от вирусов и спама. Fail2ban для защиты от брутфорса SMTP/IMAP. Обучение антиспама, белые списки, мониторинг. |
|
|
|
3 |
Защита от спама и вирусов
Почтовый сервер без защиты - это открытые ворота для спама и вирусов. Сейчас настроим многоуровневую оборону, которая отсечет 90%+ мусора еще до попадания в ящики.
Четыре уровня защиты:
- Postgrey - отбрасывает спам-ботов на входе (greylisting)
- ClamAV - проверяет вложения на вирусы
- SpamAssassin - анализирует содержимое писем
- Fail2ban - блокирует IP при брутфорсе паролей
Перед началом
У тебя должно быть:
- Рабочий Postfix + Dovecot из предыдущей части
{{< article link="/posts/mailserver-part-2-postfix-dovecot/">}}
- Минимум 2GB RAM (ClamAV прожорлив)
- Дисковое пространство для базы вирусов (~500MB)
Проверь что Postfix работает:
sudo systemctl status postfix
Установка компонентов
Ставим все сразу
sudo apt install -y \
amavisd-new \
clamav \
clamav-daemon \
clamav-freshclam \
spamassassin \
postgrey
Что установили:
amavisd-new- прослойка между Postfix и антивирусом/антиспамомclamav- антивирусный движокclamav-daemon- демон ClamAV для фоновой работыclamav-freshclam- автообновление вирусных базspamassassin- антиспам фильтрpostgrey- greylisting демон
Создание необходимых файлов и директорий
Создаем mailname (используется Amavis)
echo "mail.example.com" | sudo tee /etc/mailname
Создаем директорию для PID файла Amavis
sudo mkdir -p /var/run/amavis
sudo chown amavis:amavis /var/run/amavis
sudo chmod 755 /var/run/amavis
Создаем tmpfiles конфиг для автоматического создания директории
sudo nano /etc/tmpfiles.d/amavis.conf
Добавь:
d /run/amavis 0755 amavis amavis -
Примени конфиг:
sudo systemd-tmpfiles --create
Замени mail.example.com на свое полное имя хоста.
Обновляем базу вирусов
ClamAV нужна актуальная база вирусов:
sudo systemctl stop clamav-freshclam
sudo freshclam
sudo systemctl start clamav-freshclam
Это займет 2-5 минут. Freshclam скачает ~200-300MB данных.
Проверь статус:
sudo systemctl status clamav-freshclam
Должен быть active (running).
Настройка ClamAV
Проверяем что демон запущен
sudo systemctl status clamav-daemon
Если не запущен(что скорее всего):
sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemon
Настройка сокета
ClamAV слушает через UNIX-сокет. Проверь:
ls -la /var/run/clamav/clamd.ctl
Должен быть сокет с правами для группы clamav.
Добавь пользователя amavis в группу clamav:
sudo adduser clamav amavis
sudo adduser amavis clamav
Перезапусти ClamAV:
sudo systemctl restart clamav-daemon
Настройка Amavis
Amavis - это диспетчер, который принимает письма от Postfix, прогоняет через ClamAV и SpamAssassin, и возвращает обратно.
Основной конфиг
Открой:
sudo nano /etc/amavis/conf.d/15-content_filter_mode
Раскомментируй:
@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
Что сделали: Включили проверку на вирусы и спам.
Настройка интеграции
Открой:
sudo nano /etc/amavis/conf.d/50-user
Добавь в конец:
# Домен
$mydomain = 'example.com';
$myhostname = 'mail.example.com';
# Интерфейс
$inet_socket_bind = '127.0.0.1';
# Порты
$inet_socket_port = 10024;
# Политика для локальных доменов
$policy_bank{'MYNETS'} = {
originating => 1,
os_fingerprint_method => undef,
};
# Антиспам
$sa_tag_level_deflt = -999; # Всегда добавлять заголовки
$sa_tag2_level_deflt = 5.0; # Помечать как спам при 5+ баллах
$sa_kill_level_deflt = 10.0; # Отклонять при 10+ баллах
# Антивирус
$virus_admin = "postmaster\@$mydomain";
# Уведомления
$virus_quarantine_to = "virus-quarantine\@$mydomain";
$spam_quarantine_to = "spam-quarantine\@$mydomain";
# Обязательно в конце (по умолчанию уже присутствует)
1;
Замени:
example.comна свой доменmail.example.comна свое имя хоста
Что настроили:
Основные параметры:
- Слушаем на localhost:10024
- Домен и hostname для заголовков
Антиспам:
-999- всегда добавлять X-Spam заголовки5.0- при 5+ баллах помечать как спам (X-Spam-Flag: YES)10.0- при 10+ баллах отклонять письмо
Антивирус:
- Всегда проверять через ClamAV
- Карантин для вирусов и спама
Права на директории
sudo chown -R amavis:amavis /var/lib/amavis
sudo chmod 750 /var/lib/amavis
Запуск Amavis
sudo systemctl enable amavis
sudo systemctl start amavis
sudo systemctl status amavis
Должен быть active (running).
Проверь порт:
sudo ss -tulnp | grep 10024
Должно быть:
tcp LISTEN 0 4096 127.0.0.1:10024 0.0.0.0:* users:(("/usr/sbin/amavi",pid=43480,fd=5),("/usr/sbin/amavi",pid=43479,fd=5),("/usr/sbin/amavi",pid=43456,fd=5))
Настройка SpamAssassin
SpamAssassin работает через Amavis, но нужно настроить его правила.
Основной конфиг
Открой:
sudo nano /etc/spamassassin/local.cf
Добавь в самый конец:
# Требуемый балл для спама
required_score 5.0
# Использовать Bayesian фильтр
use_bayes 1
bayes_auto_learn 1
# DNSBL проверки
use_razor2 0
use_pyzor 0
# Сетевые проверки (SPF, DKIM)
use_dcc 0
# Автообучение
bayes_auto_learn_threshold_nonspam -0.1
bayes_auto_learn_threshold_spam 6.0
# Путь к базе Bayes
bayes_path /var/lib/amavis/.spamassassin/bayes
# Язык
ok_languages en ru
ok_locales en ru
# Размер письма для проверки (500KB)
report_safe 0
Что настроили:
required_score 5.0:
- Порог для пометки спама
Bayesian фильтр:
- Обучаемая модель на основе примеров
- Автообучение включено
DNSBL:
- Razor/Pyzor/DCC отключены (используем встроенные DNSBL)
Автообучение:
- Письма с баллами < -0.1 учатся как не-спам
- Письма с баллами > 6.0 учатся как спам
Создаем директорию для Bayes
sudo mkdir -p /var/lib/amavis/.spamassassin
sudo chown -R amavis:amavis /var/lib/amavis/.spamassassin
sudo chmod 700 /var/lib/amavis/.spamassassin
Запуск SpamAssassin
sudo systemctl enable spamassassin
sudo systemctl start spamassassin
sudo systemctl status spamassassin
Должен быть active (running).
Перезапуск Amavis
sudo systemctl restart amavis
Настройка Postgrey
Postgrey - это greylisting("временная задержка"). Принцип: первое письмо от нового отправителя откладывается на 5 минут. Легальные серверы повторят попытку, спам-боты - нет.
Конфигурация
Открой:
sudo nano /etc/default/postgrey
Найди и измени:
POSTGREY_OPTS="--inet=127.0.0.1:10023 --delay=300"
Что настроили:
--inet=127.0.0.1:10023- слушать на localhost:10023--delay=300- задержка 5 минут (300 секунд)
Белые списки
Postgrey имеет встроенные белые списки для крупных отправителей (Google, Microsoft, и т.д.).
Посмотреть:
cat /etc/postgrey/whitelist_clients
Добавить свои (опционально):
sudo nano /etc/postgrey/whitelist_clients.local
Формат:
/^.*\.trusted-domain\.com$/
192.168.1.0/24
specific-server.example.com
На примере Yandex:
/^.*\.yandex\.ru$/
/^.*\.ya\.ru$/
Запуск
sudo systemctl enable postgrey
sudo systemctl start postgrey
sudo systemctl status postgrey
Должен быть active (running).
Проверь порт:
sudo ss -tulnp | grep 10023
Должно быть:
tcp LISTEN 0 5 127.0.0.1:10023 ...
Интеграция с Postfix
Сейчас настроим Postfix для прогона всех писем через Amavis и Postgrey.
Настройка content_filter
Открой:
sudo nano /etc/postfix/main.cf
В конце секции smtpd_recipient_restrictions, созданную на предыдущих этапах, добавь строку:
# Postgrey для greylisting
check_policy_service inet:127.0.0.1:10023
И добавь в конец файла:
# Content filter через Amavis
content_filter = smtp-amavis:[127.0.0.1]:10024
Что добавили:
content_filter:
- Все письма идут через Amavis на порт 10024
- Amavis проверяет через ClamAV и SpamAssassin
- Возвращает обратно в Postfix на порт 10025
smtpd_recipient_restrictions:
- Добавили
check_policy_service inet:127.0.0.1:10023- проверка через Postgrey
Настройка master.cf
Открой:
sudo nano /etc/postfix/master.cf
Добавь в конец:
# Отправка в Amavis
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
# Прием из Amavis обратно
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-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 smtpd_restriction_classes=
-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,no_milters
-o local_header_rewrite_clients=
Что настроили:
smtp-amavis:
- Транспорт для отправки в Amavis
- Таймаут 1200 секунд (для больших писем)
- Максимум 20 использований соединения
127.0.0.1:10025:
- Прием обратно из Amavis
- Отключаем повторные проверки (content_filter пустой)
- Пропускаем только с localhost
Перезапуск Postfix
Проверь конфиг:
sudo postfix check
Если ошибок нет - перезапускай:
sudo postfix reload
Проверь статус:
sudo systemctl status postfix
Тестирование защиты
Тест 1: Проверка антивируса
Отправь тестовый вирус EICAR (безопасная тестовая сигнатура):
telnet localhost 25
EHLO test.local
MAIL FROM:<test@example.com>
RCPT TO:<admin@example.com>
DATA
Subject: Virus test
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
.
QUIT
Проверь логи:
sudo grep -i "eicar\|infected\|virus" /var/log/mail.log | tail -20
Должно быть:
... mail amavis[44437]: (44437-01) Blocked INFECTED (Eicar-Signature) {DiscardedOutbound,Quarantined}, MYNETS LOCAL [127.0.0.1]:6674 <test@example.com> -> <admin@example.com>, quarantine: virus-quarantine@example.com, Queue-ID: 6B6C425808, Message-ID: <20260317085556.6B6C425808@mail.example.com>, mail_id: fqAsJO87JdbS, Hits: -, size: 375, 454 ms
... mail postfix/smtp[47529]: 6B6C425808: to=<admin@example.com>, relay=127.0.0.1[127.0.0.1]:10024, delay=24, delays=24/0.02/0.09/0.39, dsn=2.7.0, status=sent (250 2.7.0 Ok, discarded, id=44437-01 - INFECTED: Eicar-Signature)
... mail postfix/lmtp[47533]: B34582580B: to=<virus-quarantine@example.com>, relay=mail.example.com[private/dovecot-lmtp], delay=0.12, delays=0.01/0.02/0.04/0.06, dsn=5.1.1, status=bounced (host mail.example.com[private/dovecot-lmtp] said: 550 5.1.1 <virus-quarantine@example.com> User doesn't exist: virus-quarantine@example.com (in reply to RCPT TO command))
Письмо отклонено - антивирус работает.
Тест 2: Проверка антиспама
Отправь письмо с внешнего почтового ящика (Gmail, Yandex) на свой сервер с текстом:
Subject: BUY CHEAP VIAGRA NOW!!!
Body:
CLICK HERE FOR AMAZING DEALS!!!
FREE MONEY! ACT NOW!
BUY VIAGRA CIALIS CHEAP!
100% GUARANTEED! NO PRESCRIPTION!
MAKE MONEY FAST! LIMITED TIME!
Важно: Тест через telnet localhost 25 не покажет X-Spam заголовки, т.к. письмо будет считаться исходящим от своих (MYNETS).
Проверь логи:
sudo grep "amavis" /var/log/mail.log | tail -5
Должна приблизительно быть строка:
... mail amavis[51765]: (51765-01) Passed SPAMMY {RelayedOutbound}, MYNETS LOCAL [127.0.0.1]:45220 <spam@spam.com> -> <admin@example.com>, Queue-ID: 526902584D, Message-ID: <20260317101453.526902584D@mail.example.com>, mail_id: yUPoX6uzzm6f, Hits: 6.549, size: 375, queued_as: 9DA0D2584F, 1259 ms
Passed CLEAN— не спам (баллов < 5.0)Passed SPAMMY— спам (баллов >= 5.0)Hits: X.XX— количество баллов SpamAssassin
Если баллов >= 5.0, письмо помечено как спам и в заголовках будет:
X-Spam-Flag: YES
X-Spam-Score: 15.2
X-Spam-Status: Yes, score=15.2
Проверь письмо:
sudo ls -t /var/mail/example.com/admin/new/ | head -1 | xargs -I {} sudo cat /var/mail/example.com/admin/new/{} | grep X-Spam
Если баллов мало (< 5.0):
Это нормально — письмо от доверенного провайдера (Yandex, Gmail) с валидной DKIM подписью получает мало баллов. SpamAssassin работает правильно, отличая легитимную почту от спама.
Уточнение: В качестве спам рассылки я использовал почту Yandex.
Логи испытания:
... mail amavis[51765]: (51765-01) Passed SPAMMY {RelayedOutbound}, MYNETS LOCAL [127.0.0.1]:45220 <spam@spam.com> -> <admin@example.com>, Queue-ID: 526902584D, Message-ID: <20260317101453.526902584D@mail.example.com>, mail_id: yUPoX6uzzm6f, Hits: 6.549, size: 375, queued_as: 9DA0D2584F, 1259 ms
... mail amavis[51766]: (51766-01) Passed CLEAN {RelayedOpenRelay}, [178.154.239.223]:36200 [2a02:6b8:c42:e720:0:640:3001:0] <oakazanin@ya.ru> -> <admin@example.com>, Queue-ID: AA84721409, Message-ID: <121751773743278@mail.yandex.ru>, mail_id: V5iYivtYPpbe, Hits: 1.567, size: 1912, queued_as: 948F02584F, 853 ms
Из логов видно, что в начале письмо получает Passed SPAMMY, а затем Passed CLEAN, Hits: 1.567(колличество баллов, что < 5.0). Причины:
- Отправитель - Yandex (доверенный провайдер)
- Валидная DKIM подпись:
DKIM-Signature: v=1; a=rsa-sha256; d=ya.ru; s=mail;
- IP не в блэклистах
Тест 3: Проверка Postgrey
Отправь письмо с другого IP (запрос с внешнего сервера):
telnet mail.example.com 25
где, mail.example.com - полное доменное имя или IP твоего почтового сервера.
EHLO mail.google.com
MAIL FROM:<test@newdomain.com>
RCPT TO:<admin@example.com>
DATA
Subject: Greylisting test
.
QUIT
При первой попытке должен получить:
450 4.2.0 <admin@example.com>: Recipient address rejected: Greylisted, see http://postgrey.schweikert.ch/help/example.com.html
Подожди 5 минут и повтори - письмо пройдет.
Проверь статус Postgrey:
sudo grep "postgrey" /var/log/mail.log | tail -10
Должна быть запись о Greylisted.
Обучение SpamAssassin
Чем больше примеров спама и не-спама покажешь SpamAssassin, тем точнее он работает.
Ручное обучение
Пометить письмо как спам:
sudo sa-learn --spam /var/mail/example.com/admin/.Spam/cur/*
Пометить как не-спам:
sudo sa-learn --ham /var/mail/example.com/admin/cur/*
Проверить статистику обучения
sudo sa-learn --dump magic
Вывод:
0.000 0 3 0 non-token data: bayes db version
0.000 0 150 0 non-token data: nspam
0.000 0 450 0 non-token data: nham
nspam - количество спам-писем в базе
nham - количество не-спам писем в базе
После обучения перезапусти Amavis:
sudo systemctl restart amavis
Автообучение
SpamAssassin автоматически учится на письмах с четкими признаками (настроили в local.cf):
- Баллы < -0.1 → автоматически не-спам
- Баллы > 6.0 → автоматически спам
Через неделю-две база накопится, точность вырастет.
Fail2ban для почтовых сервисов
Защита от брутфорса паролей SMTP/IMAP.
Проверка установки
Fail2ban должен быть установлен из статьи по базовой настройке сервера:
{{< article link="/posts/tips-debian-12-hardening/">}}
Проверь:
sudo systemctl status fail2ban
Настройка jail для почты
Открой:
sudo nano /etc/fail2ban/jail.local
Добавь в конец:
[postfix-sasl]
enabled = true
port = smtp,submission,smtps
filter = postfix[mode=auth]
logpath = /var/log/mail.log
maxretry = 3
bantime = 600
[dovecot]
enabled = true
port = imap,imaps,pop3,pop3s
filter = dovecot
logpath = /var/log/mail.log
maxretry = 3
bantime = 600
Что настроили:
postfix-sasl:
- Защита SMTP AUTH (порты 25, 587, 465)
- Максимум 3 неудачных попытки
- Бан на 10 минут
dovecot:
- Защита IMAP/POP3 (порты 143, 993, 110, 995)
- Максимум 3 неудачных попытки
- Бан на 10 минут
Перезапуск Fail2ban
sudo systemctl reload fail2ban
Проверь тюрьмы:
sudo fail2ban-client status
Должно быть:
Status
|- Number of jail: 3
`- Jail list: dovecot, postfix-sasl, sshd
Тест Fail2ban
Попробуй подключиться с неправильным паролем 3 раза:
telnet localhost 587
EHLO test.local
AUTH PLAIN dGVzdEBleGFtcGxlLmNvbQB3cm9uZ3Bhc3N3b3Jk
AUTH PLAIN dGVzdEBleGFtcGxlLmNvbQB3cm9uZ3Bhc3N3b3Jk
AUTH PLAIN dGVzdEBleGFtcGxlLmNvbQB3cm9uZ3Bhc3N3b3Jk
После 3-й попытки твой IP должен быть забанен.
Проверь:
sudo fail2ban-client status postfix-sasl
Должен появиться IP в Banned IP list.
Мониторинг защиты
Статистика Amavis
sudo amavisd-nanny
Команда выводит состояние worker-процессов в реальном времени. Точки (.) — процесс idle, звездочки (*) — обрабатывает письмо.
Статистика ClamAV
sudo clamdscan --version
sudo freshclam --version
Проверь обновление баз:
sudo cat /var/log/clamav/freshclam.log | tail -20
Статистика SpamAssassin
sudo sa-learn --dump magic
Вывод:
0.000 0 3 0 non-token data: bayes db version
0.000 0 234 0 non-token data: nspam
0.000 0 789 0 non-token data: nham
0.000 0 45123 0 non-token data: ntokens
0.000 0 1773745892 0 non-token data: oldest atime
0.000 0 1773831245 0 non-token data: newest atime
0.000 0 0 0 non-token data: last journal sync atime
0.000 0 0 0 non-token data: last expiry atime
0.000 0 0 0 non-token data: last expire atime delta
0.000 0 0 0 non-token data: last expire reduction count
Где:
nspam: 234 — количество спам-писем в обучающей базе nham: 789 — количество не-спам писем в обучающей базе ntokens: 45123 — количество токенов (слов) в базе
Логи
Все логи почты в одном месте:
sudo tail -f /var/log/mail.log
Фильтруй по ключевым словам:
# Вирусы
sudo grep "Blocked INFECTED" /var/log/mail.log
# Спам
sudo grep "Passed SPAM" /var/log/mail.log
# Greylisting
sudo grep "Greylisted" /var/log/mail.log
# Fail2ban баны
sudo grep "Ban" /var/log/fail2ban.log
Тонкая настройка
Увеличить порог спама
Если много ложных срабатываний, увеличь required_score:
sudo nano /etc/spamassassin/local.cf
Измени:
required_score 7.0
Перезапусти:
sudo systemctl restart amavis
Добавить домен в белый список Postgrey
sudo nano /etc/postgrey/whitelist_clients.local
Добавь:
/^.*\.important-partner\.com$/
Перезапусти:
sudo systemctl restart postgrey
Отключить greylisting для авторизованных
Если не хочешь задержек для своих пользователей, в Postfix измени:
sudo nano /etc/postfix/main.cf
В smtpd_recipient_restrictions перед check_policy_service добавь:
permit_sasl_authenticated,
Чтобы получилось:
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service inet:127.0.0.1:10023
Перезагрузи:
sudo postfix reload
Типичные проблемы
ClamAV жрет всю память
ClamAV требует ~500-700MB RAM. Если сервер слабый:
Открой:
sudo nano /etc/clamav/clamd.conf
Уменьши:
MaxThreads 10
MaxConnectionQueueLength 15
Перезапусти:
sudo systemctl restart clamav-daemon
Письма застревают в очереди
Проверь очередь:
sudo postqueue -p
Причина может быть в медленной проверке. Увеличь таймаут:
sudo nano /etc/postfix/master.cf
Найди smtp-amavis и увеличь:
smtp_data_done_timeout=1800
Перезагрузи:
sudo postfix reload
SpamAssassin не учится
Проверь права на базу Bayes:
ls -la /var/lib/amavis/.spamassassin/
Должен быть владелец amavis:amavis.
Исправь:
sudo chown -R amavis:amavis /var/lib/amavis/.spamassassin
sudo chmod 700 /var/lib/amavis/.spamassassin
Postgrey блокирует легальную почту
Добавь отправителя в белый список:
sudo nano /etc/postgrey/whitelist_clients.local
sender-domain.com
Перезапусти:
sudo systemctl restart postgrey
Что получилось
Сейчас у тебя:
Работает:
- Антивирусная проверка всех входящих писем (ClamAV)
- Антиспам с обучением (SpamAssassin + Bayes)
- Greylisting для новых отправителей (Postgrey)
- Защита от брутфорса SMTP/IMAP (Fail2ban)
Потребление ресурсов:
- ClamAV: ~500-700 MB RAM
- SpamAssassin: ~200-300 MB на процесс
- Amavis: ~50-100 MB
- Postgrey: ~10-20 MB
- Итого: +800MB-1.2GB RAM
Проблемы:
- Пароли все еще передаются открытым текстом (нет TLS)
- Нет DKIM подписей (письма могут улетать в спам)
- Нет веб-интерфейса
Это защищенный сервер, но еще не production-ready.
Следующий шаг
В следующей части настроим шифрование и репутацию:
- TLS через Let's Encrypt (шифрование соединений)
- DKIM подписи (доверие к твоим письмам)
- SPF и DMARC записи (защита от подделки домена)
После этого письма перестанут улетать в спам у Gmail/Outlook.