1086 lines
28 KiB
Markdown
1086 lines
28 KiB
Markdown
---
|
||
title: "Почтовый сервер на Debian 12: полное руководство от установки до production. Часть 3 - Защита от спама и вирусов"
|
||
date: 2026-03-16
|
||
draft: false
|
||
description: "Настройка Amavis, ClamAV, SpamAssassin и Postgrey для защиты от вирусов и спама. Fail2ban для защиты от брутфорса SMTP/IMAP. Обучение антиспама, белые списки, мониторинг."
|
||
tags: ["amavis", "clamav", "spamassassin", "postgrey", "fail2ban"]
|
||
categories: ["Системное администрирование", "Электронная почта"]
|
||
series: ["Почтовый сервер на Debian 12"]
|
||
series_order: 3
|
||
---
|
||
|
||
# Защита от спама и вирусов
|
||
|
||
Почтовый сервер без защиты - это открытые ворота для спама и вирусов. Сейчас настроим многоуровневую оборону, которая отсечет 90%+ мусора еще до попадания в ящики.
|
||
|
||
Четыре уровня защиты:
|
||
1. **Postgrey** - отбрасывает спам-ботов на входе (greylisting)
|
||
2. **ClamAV** - проверяет вложения на вирусы
|
||
3. **SpamAssassin** - анализирует содержимое писем
|
||
4. **Fail2ban** - блокирует IP при брутфорсе паролей
|
||
|
||
## Перед началом
|
||
|
||
У тебя должно быть:
|
||
- Рабочий Postfix + Dovecot из предыдущей части
|
||
|
||
{{< article link="/posts/mailserver-part-2-postfix-dovecot/">}}
|
||
|
||
- Минимум **2GB RAM** (ClamAV прожорлив)
|
||
- Дисковое пространство для базы вирусов (~500MB)
|
||
|
||
Проверь что Postfix работает:
|
||
|
||
```bash
|
||
sudo systemctl status postfix
|
||
```
|
||
|
||
## Установка компонентов
|
||
|
||
### Ставим все сразу
|
||
|
||
```bash
|
||
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)
|
||
|
||
```bash
|
||
echo "mail.example.com" | sudo tee /etc/mailname
|
||
```
|
||
Создаем директорию для PID файла Amavis
|
||
|
||
```bash
|
||
sudo mkdir -p /var/run/amavis
|
||
sudo chown amavis:amavis /var/run/amavis
|
||
sudo chmod 755 /var/run/amavis
|
||
```
|
||
|
||
Создаем tmpfiles конфиг для автоматического создания директории
|
||
```bash
|
||
sudo nano /etc/tmpfiles.d/amavis.conf
|
||
```
|
||
|
||
Добавь:
|
||
|
||
```
|
||
d /run/amavis 0755 amavis amavis -
|
||
```
|
||
|
||
Примени конфиг:
|
||
|
||
```bash
|
||
sudo systemd-tmpfiles --create
|
||
```
|
||
|
||
**Замени** `mail.example.com` на свое полное имя хоста.
|
||
|
||
|
||
### Обновляем базу вирусов
|
||
|
||
ClamAV нужна актуальная база вирусов:
|
||
|
||
```bash
|
||
sudo systemctl stop clamav-freshclam
|
||
sudo freshclam
|
||
sudo systemctl start clamav-freshclam
|
||
```
|
||
|
||
Это займет 2-5 минут. Freshclam скачает ~200-300MB данных.
|
||
|
||
Проверь статус:
|
||
|
||
```bash
|
||
sudo systemctl status clamav-freshclam
|
||
```
|
||
|
||
Должен быть `active (running)`.
|
||
|
||
## Настройка ClamAV
|
||
|
||
### Проверяем что демон запущен
|
||
|
||
```bash
|
||
sudo systemctl status clamav-daemon
|
||
```
|
||
|
||
Если не запущен(что скорее всего):
|
||
|
||
```bash
|
||
sudo systemctl enable clamav-daemon
|
||
sudo systemctl start clamav-daemon
|
||
```
|
||
|
||
### Настройка сокета
|
||
|
||
ClamAV слушает через UNIX-сокет. Проверь:
|
||
|
||
```bash
|
||
ls -la /var/run/clamav/clamd.ctl
|
||
```
|
||
|
||
Должен быть сокет с правами для группы `clamav`.
|
||
|
||
Добавь пользователя `amavis` в группу `clamav`:
|
||
|
||
```bash
|
||
sudo adduser clamav amavis
|
||
sudo adduser amavis clamav
|
||
```
|
||
|
||
Перезапусти ClamAV:
|
||
|
||
```bash
|
||
sudo systemctl restart clamav-daemon
|
||
```
|
||
|
||
## Настройка Amavis
|
||
|
||
Amavis - это диспетчер, который принимает письма от Postfix, прогоняет через ClamAV и SpamAssassin, и возвращает обратно.
|
||
|
||
### Основной конфиг
|
||
|
||
Открой:
|
||
|
||
```bash
|
||
sudo nano /etc/amavis/conf.d/15-content_filter_mode
|
||
```
|
||
|
||
Раскомментируй:
|
||
|
||
```perl
|
||
@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);
|
||
```
|
||
|
||
**Что сделали:** Включили проверку на вирусы и спам.
|
||
|
||
### Настройка интеграции
|
||
|
||
Открой:
|
||
|
||
```bash
|
||
sudo nano /etc/amavis/conf.d/50-user
|
||
```
|
||
|
||
Добавь в конец:
|
||
|
||
```perl
|
||
# Домен
|
||
$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
|
||
- Карантин для вирусов и спама
|
||
|
||
### Права на директории
|
||
|
||
```bash
|
||
sudo chown -R amavis:amavis /var/lib/amavis
|
||
sudo chmod 750 /var/lib/amavis
|
||
```
|
||
|
||
### Запуск Amavis
|
||
|
||
```bash
|
||
sudo systemctl enable amavis
|
||
sudo systemctl start amavis
|
||
sudo systemctl status amavis
|
||
```
|
||
|
||
Должен быть `active (running)`.
|
||
|
||
Проверь порт:
|
||
|
||
```bash
|
||
sudo ss -tulnp | grep 10024
|
||
```
|
||
|
||
Должно быть:
|
||
|
||
```bash
|
||
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, но нужно настроить его правила.
|
||
|
||
### Основной конфиг
|
||
|
||
Открой:
|
||
|
||
```bash
|
||
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
|
||
|
||
```bash
|
||
sudo mkdir -p /var/lib/amavis/.spamassassin
|
||
sudo chown -R amavis:amavis /var/lib/amavis/.spamassassin
|
||
sudo chmod 700 /var/lib/amavis/.spamassassin
|
||
```
|
||
|
||
### Запуск SpamAssassin
|
||
|
||
```bash
|
||
sudo systemctl enable spamassassin
|
||
sudo systemctl start spamassassin
|
||
sudo systemctl status spamassassin
|
||
```
|
||
|
||
Должен быть `active (running)`.
|
||
|
||
### Перезапуск Amavis
|
||
|
||
```bash
|
||
sudo systemctl restart amavis
|
||
```
|
||
|
||
## Настройка Postgrey
|
||
|
||
Postgrey - это greylisting("временная задержка"). Принцип: первое письмо от нового отправителя откладывается на 5 минут. Легальные серверы повторят попытку, спам-боты - нет.
|
||
|
||
### Конфигурация
|
||
|
||
Открой:
|
||
|
||
```bash
|
||
sudo nano /etc/default/postgrey
|
||
```
|
||
|
||
Найди и измени:
|
||
|
||
```bash
|
||
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, и т.д.).
|
||
|
||
Посмотреть:
|
||
|
||
```bash
|
||
cat /etc/postgrey/whitelist_clients
|
||
```
|
||
|
||
Добавить свои (опционально):
|
||
|
||
```bash
|
||
sudo nano /etc/postgrey/whitelist_clients.local
|
||
```
|
||
|
||
Формат:
|
||
|
||
```
|
||
/^.*\.trusted-domain\.com$/
|
||
192.168.1.0/24
|
||
specific-server.example.com
|
||
```
|
||
|
||
На примере Yandex:
|
||
|
||
```
|
||
/^.*\.yandex\.ru$/
|
||
/^.*\.ya\.ru$/
|
||
```
|
||
|
||
### Запуск
|
||
|
||
```bash
|
||
sudo systemctl enable postgrey
|
||
sudo systemctl start postgrey
|
||
sudo systemctl status postgrey
|
||
```
|
||
|
||
Должен быть `active (running)`.
|
||
|
||
Проверь порт:
|
||
|
||
```bash
|
||
sudo ss -tulnp | grep 10023
|
||
```
|
||
|
||
Должно быть:
|
||
|
||
```
|
||
tcp LISTEN 0 5 127.0.0.1:10023 ...
|
||
```
|
||
|
||
## Интеграция с Postfix
|
||
|
||
Сейчас настроим Postfix для прогона всех писем через Amavis и Postgrey.
|
||
|
||
### Настройка content_filter
|
||
|
||
Открой:
|
||
|
||
```bash
|
||
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
|
||
|
||
Открой:
|
||
|
||
```bash
|
||
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
|
||
|
||
Проверь конфиг:
|
||
|
||
```bash
|
||
sudo postfix check
|
||
```
|
||
|
||
Если ошибок нет - перезапускай:
|
||
|
||
```bash
|
||
sudo postfix reload
|
||
```
|
||
|
||
Проверь статус:
|
||
|
||
```bash
|
||
sudo systemctl status postfix
|
||
```
|
||
|
||
## Тестирование защиты
|
||
|
||
### Тест 1: Проверка антивируса
|
||
|
||
Отправь тестовый вирус EICAR (безопасная тестовая сигнатура):
|
||
|
||
```bash
|
||
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
|
||
```
|
||
|
||
Проверь логи:
|
||
|
||
```bash
|
||
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`).
|
||
|
||
Проверь логи:
|
||
|
||
```bash
|
||
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
|
||
```
|
||
|
||
Проверь письмо:
|
||
|
||
```bash
|
||
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 (запрос с внешнего сервера):
|
||
|
||
```bash
|
||
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:
|
||
|
||
```bash
|
||
sudo grep "postgrey" /var/log/mail.log | tail -10
|
||
```
|
||
|
||
Должна быть запись о Greylisted.
|
||
|
||
## Обучение SpamAssassin
|
||
|
||
Чем больше примеров спама и не-спама покажешь SpamAssassin, тем точнее он работает.
|
||
|
||
### Ручное обучение
|
||
|
||
**Пометить письмо как спам:**
|
||
|
||
```bash
|
||
sudo sa-learn --spam /var/mail/example.com/admin/.Spam/cur/*
|
||
```
|
||
|
||
**Пометить как не-спам:**
|
||
|
||
```bash
|
||
sudo sa-learn --ham /var/mail/example.com/admin/cur/*
|
||
```
|
||
|
||
### Проверить статистику обучения
|
||
|
||
```bash
|
||
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:**
|
||
|
||
```bash
|
||
sudo systemctl restart amavis
|
||
```
|
||
|
||
### Автообучение
|
||
|
||
SpamAssassin автоматически учится на письмах с четкими признаками (настроили в `local.cf`):
|
||
|
||
- Баллы < -0.1 → автоматически не-спам
|
||
- Баллы > 6.0 → автоматически спам
|
||
|
||
Через неделю-две база накопится, точность вырастет.
|
||
|
||
## Fail2ban для почтовых сервисов
|
||
|
||
Защита от брутфорса паролей SMTP/IMAP.
|
||
|
||
### Проверка установки
|
||
|
||
Fail2ban должен быть установлен из статьи по базовой настройке сервера:
|
||
|
||
{{< article link="/posts/tips-debian-12-hardening/">}}
|
||
|
||
Проверь:
|
||
|
||
```bash
|
||
sudo systemctl status fail2ban
|
||
```
|
||
|
||
### Настройка jail для почты
|
||
|
||
Открой:
|
||
|
||
```bash
|
||
sudo nano /etc/fail2ban/jail.local
|
||
```
|
||
|
||
Добавь в конец:
|
||
|
||
```ini
|
||
[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
|
||
|
||
```bash
|
||
sudo systemctl reload fail2ban
|
||
```
|
||
|
||
Проверь тюрьмы:
|
||
|
||
```bash
|
||
sudo fail2ban-client status
|
||
```
|
||
|
||
Должно быть:
|
||
|
||
```
|
||
Status
|
||
|- Number of jail: 3
|
||
`- Jail list: dovecot, postfix-sasl, sshd
|
||
```
|
||
|
||
### Тест Fail2ban
|
||
|
||
Попробуй подключиться с неправильным паролем 3 раза:
|
||
|
||
```bash
|
||
telnet localhost 587
|
||
```
|
||
|
||
```
|
||
EHLO test.local
|
||
AUTH PLAIN dGVzdEBleGFtcGxlLmNvbQB3cm9uZ3Bhc3N3b3Jk
|
||
AUTH PLAIN dGVzdEBleGFtcGxlLmNvbQB3cm9uZ3Bhc3N3b3Jk
|
||
AUTH PLAIN dGVzdEBleGFtcGxlLmNvbQB3cm9uZ3Bhc3N3b3Jk
|
||
```
|
||
|
||
После 3-й попытки твой IP должен быть забанен.
|
||
|
||
Проверь:
|
||
|
||
```bash
|
||
sudo fail2ban-client status postfix-sasl
|
||
```
|
||
|
||
Должен появиться IP в `Banned IP list`.
|
||
|
||
## Мониторинг защиты
|
||
|
||
### Статистика Amavis
|
||
|
||
```bash
|
||
sudo amavisd-nanny
|
||
```
|
||
Команда выводит состояние worker-процессов в реальном времени.
|
||
Точки (.) — процесс idle, звездочки (*) — обрабатывает письмо.
|
||
|
||
### Статистика ClamAV
|
||
|
||
```bash
|
||
sudo clamdscan --version
|
||
sudo freshclam --version
|
||
```
|
||
|
||
Проверь обновление баз:
|
||
|
||
```bash
|
||
sudo cat /var/log/clamav/freshclam.log | tail -20
|
||
```
|
||
|
||
### Статистика SpamAssassin
|
||
|
||
```bash
|
||
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 — количество токенов (слов) в базе
|
||
|
||
|
||
### Логи
|
||
|
||
Все логи почты в одном месте:
|
||
|
||
```bash
|
||
sudo tail -f /var/log/mail.log
|
||
```
|
||
|
||
Фильтруй по ключевым словам:
|
||
|
||
```bash
|
||
# Вирусы
|
||
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`:
|
||
|
||
```bash
|
||
sudo nano /etc/spamassassin/local.cf
|
||
```
|
||
|
||
Измени:
|
||
|
||
```
|
||
required_score 7.0
|
||
```
|
||
|
||
Перезапусти:
|
||
|
||
```bash
|
||
sudo systemctl restart amavis
|
||
```
|
||
|
||
### Добавить домен в белый список Postgrey
|
||
|
||
```bash
|
||
sudo nano /etc/postgrey/whitelist_clients.local
|
||
```
|
||
|
||
Добавь:
|
||
|
||
```
|
||
/^.*\.important-partner\.com$/
|
||
```
|
||
|
||
Перезапусти:
|
||
|
||
```bash
|
||
sudo systemctl restart postgrey
|
||
```
|
||
|
||
### Отключить greylisting для авторизованных
|
||
|
||
Если не хочешь задержек для своих пользователей, в Postfix измени:
|
||
|
||
```bash
|
||
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
|
||
```
|
||
|
||
Перезагрузи:
|
||
|
||
```bash
|
||
sudo postfix reload
|
||
```
|
||
|
||
## Типичные проблемы
|
||
|
||
### ClamAV жрет всю память
|
||
|
||
ClamAV требует ~500-700MB RAM. Если сервер слабый:
|
||
|
||
Открой:
|
||
|
||
```bash
|
||
sudo nano /etc/clamav/clamd.conf
|
||
```
|
||
|
||
Уменьши:
|
||
|
||
```
|
||
MaxThreads 10
|
||
MaxConnectionQueueLength 15
|
||
```
|
||
|
||
Перезапусти:
|
||
|
||
```bash
|
||
sudo systemctl restart clamav-daemon
|
||
```
|
||
|
||
### Письма застревают в очереди
|
||
|
||
Проверь очередь:
|
||
|
||
```bash
|
||
sudo postqueue -p
|
||
```
|
||
|
||
Причина может быть в медленной проверке. Увеличь таймаут:
|
||
|
||
```bash
|
||
sudo nano /etc/postfix/master.cf
|
||
```
|
||
|
||
Найди `smtp-amavis` и увеличь:
|
||
|
||
```
|
||
smtp_data_done_timeout=1800
|
||
```
|
||
|
||
Перезагрузи:
|
||
|
||
```bash
|
||
sudo postfix reload
|
||
```
|
||
|
||
### SpamAssassin не учится
|
||
|
||
Проверь права на базу Bayes:
|
||
|
||
```bash
|
||
ls -la /var/lib/amavis/.spamassassin/
|
||
```
|
||
|
||
Должен быть владелец `amavis:amavis`.
|
||
|
||
Исправь:
|
||
|
||
```bash
|
||
sudo chown -R amavis:amavis /var/lib/amavis/.spamassassin
|
||
sudo chmod 700 /var/lib/amavis/.spamassassin
|
||
```
|
||
|
||
### Postgrey блокирует легальную почту
|
||
|
||
Добавь отправителя в белый список:
|
||
|
||
```bash
|
||
sudo nano /etc/postgrey/whitelist_clients.local
|
||
```
|
||
|
||
```
|
||
sender-domain.com
|
||
```
|
||
|
||
Перезапусти:
|
||
|
||
```bash
|
||
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. |