Установка и настройка crowdsec

Введение

Данная статья будет актуальна для тех, кто сам выполнил установку и настройку postfix или воспользовался готовой сборкой на базе iredmail. Это что касается материалов моего сайта. А в целом все описанное ниже будет актуально для любого почтового сервера, который хранит почту в формате maildir.

Скажу пару слов, почему именно maildir. Лично я этот формат использую за его удобство. В нем каждое письмо это отдельный файл, который можно посмотреть любым текстовым редактором. Эти файлы удобно бэкапить, анализировать содержимое, сортировать по каким-то признакам. В общем, с ними можно работать как с обычными текстовыми файлами. На основе этих плюсов и выполняется вся дальнейшая работа в статье. Из минусов вижу только один — огромное количество мелких файлов создают большую нагрузку на дисковую подсистему.

Приведу для наглядности пример, который позволит оценить нагрузку на диски. Для синхронизации с помощью rsync почтовой базы объемом примерно 1 терабайт, расположенной на raid10 обычных 3.5 sata дисков, на одиночный такой же диск для бэкапа, уходит где-то пару часов в основном на сравнение файлов между источником и приемником. Само копирование файлов проходит быстро, но чтобы сравнить изменения за день, приходится выполнять длительную операцию. При этом в целом работа пользователей (~30-40 человек) с этой базой вполне комфортна, каких-то тормозов не наблюдается.

То есть по сути, для такого количества пользователей, сервером может быть обычный десктопный компьютер с 2-4 обычными sata дисками. Хватит производительности любого процессора и примерно 2-4 гигабайта оперативной памяти. Отдельный вопрос, конечно, к надежности обычного системника. Я сервера на них не рекомендую собирать, но при большом желании можно.

Приведенные далее скрипты для очистки почтовой базы писались в разное время на разных серверах. Иногда может показаться, что все сделано нелогично или как-то сложно. Громоздкие конструкции часто возникали там, где появлялись проблемы с пробелами или спецсимволами в именах папок на русском языке, которые при переводе в UTF-7 (кодировка названия imap папок в dovecot) превращаются в весьма неудобные для обработки строки. Дальше будет понятно, что я имею ввиду.

Перейдем теперь к конкретным примерам.

Установка Dovecot

Я уже давно для себя выбрал CentOS как основу для серверов. Поэтому все команды установки софта будут именно для этой операционной системы. Я крайне не советую ставить основные программы из исходников командами типа make, make install и т.д. Это приведет только к невозможности получения обновлений в удобной форме.

В процессе отладки я наступал на разные грабли, список которых выделил в отдельную страницу «размышления по ходу отладки». Не поленитесь, посмотрите, вдруг что-то пригодится.

yum install dovecot
yum install dovecot-mysql
chkconfig dovecot on

Вот и все, дальше надо настраивать конфиг.

auth-passwdfile.conf.ext

  • Passwd-file

  • Password Schemes

Настроем файл auth-passwdfile.conf.ext, в котором укажем, что имена и пароли пользователей, требующих , должны храниться в файле /etc/dovecot/users.

Записи в файле /etc/dovecot/users должны храниться в формате

user:password:uid:gid:(gecos):home:(shell):extra_fields

Поле user в виде user@domain, а поле password шифроваться при помощи SHA256-CRYPT

conf.d/auth-passwdfile.conf.ext
passdb {
  driver = passwd-file
  args = scheme=SHA256-CRYPT username_format=%u etcdovecotusers
}
 
userdb {
  driver = passwd-file
  args = username_format=%u etcdovecotusers
}

Создадим хеш для поля password используя тестового пользователя [email protected] с паролем 12345:

# doveadm pw -s SHA256-CRYPT -u [email protected] -p 12345
{SHA256-CRYPT}$5$/y05qudkNwZipDS8$qur95mpxvQM6jneu5BnWeX8pzocdUMWCDkZn0mEca9C

Добавим полную запись в /etc/dovecot/users:

[email protected]:{SHA256-CRYPT}$5$/y05qudkNwZipDS8$qur95mpxvQM6jneu5BnWeX8pzocdUMWCDkZn0mEca9C:postfix:postfix

Протестируем полученную запись для SMTP и IMAP при помощи утилиты doveadm

# doveadm auth -x service=smtp -x rip=192.0.2.143 [email protected] 12345
passdb: [email protected] auth succeeded
extra fields:
  [email protected]

Скрипт создания пользователя

Bash скрипт для добавления нового пользователя в Dovecot SASL

users_pw.sh
#!/bin/bash
 
FUSERS='/etc/dovecot/users'
 
echo -n 'Please enter username: '
read
USER1=$REPLY
HP2=`/usrbindoveadm pw -s SHA256-CRYPT -u $USER1`
USERADD="$USER1:$HP2::postfix:postfix"
echo $USERADD >> $FUSERS
echo -n $USERADD
echo -e "\n\nDONE\n"

Новое на сайте

13 май

почтовый сервер на основе Postfix с пользователями в MySQL и Dovecot как MDA

как установить почтовый сервер Postfix (MTA) для произвольного числа доменов и Dovecot 2.x в качестве MDA, использовать MySQL и PostfixAdmin, задействовать квоты, обеспечить защиту от спама и вирусов используя цифровую подпись DKIM, dspam и ClavaAV

подробнее…

18 апр

До опредленного времени, нежелательные сайты в офисе блокировались «прозрачным» SQUID-ом. Однако SQUID3 не может работать с SSL соединениями в режиме transparent и, соответственно, не может блокировать социалки, доступные по https. iptables нам поможет!

подробнее…

22 сент

настройка прозрачного squid3 с пулами задержки или как навести порядок в офисе

Работа в типичном офисе и социальные сети не совместимы. Любой администратор рано или поздно решает задачу — как запретить развлекательный контент и социальные сети в офисе и ограничить скорость Интернета. В этих начинаниях нам поможет Squid3.

подробнее…

18 мар

конечно можно настроить sftp или даже ftp на худой конец и деплоить каждый чих в своем приложении/сайте прямо из вашей любимой IDE, однако удобнее использовать опцию shared folders, которая идёт с VirtualBox прямо «из коробки».

подробнее…

17 фев

монтируем новый жёсткий диск в Debian или решаем проблемы со свободным местом

Знакомая ситуация  — заканчивается место на жёстком диске на виртуальном сервере разработки Debian (VirualBox). Разберёмся, как подключить новый жесткий диск, создать на нём ext4 раздел и смонтировать его через fstab по UUID.

подробнее…

06 янв

быстрый старт bower + grunt или дань моде

Часто приходится настраивать связку bower+grunt. Bower — незаменимый менеджер пакетов. Grunt — замечательное средство для автоматизации рутинны со статикой проекта. Ах да, для установки всего этого безобразия нам ещё потребуется Node.js

подробнее…

09 сент

настройка почтового сервера как резервного (backup MX) или пересылка почты для домена клиента

Нобходимо настроить наш сервер как резервный Backup MX для отдельных клиентов. Ситуацию усложняет необходимость иметь несколько активных ящиков на нашем сервере, вне зависимости есть они или нету на основном почтовом сервере. Зачем же это было нужно?

подробнее…

22 май

настройка квоты домена в MDA Dovecot используя dict + mysql

Дело вкуса, но жизнь требует возможности настройки квот на уровне домена по той или иной причине. Как же настроить квоты для доменов в Dovecot, если используется mysql и dict соответственно. Ответ прост — никак. Детали — под катом.

подробнее…

16 май

настройка «greylisting» для postfix (postgrey) или борьба со спамом продолжается

Еще один инструмент для борьбы со спамом – грейлистинг. Суть – временно отклонять почту от новых отправителей со словами «зайдите завтра». Добропорядочный сервер обязательно «зайдет». Типичный спаммер – нет. Итак, Postgray для Postfix.

подробнее…

15 май

настройка Fail2Ban для защиты служб сервера от атак извне или как сделать логи аккуратными

Благая цель – избавить сервер от лишней работы (нагрузки) и блокировать попытки перебора паролей и хакерских атак – крайне благородна. Настроим инструмент fail2ban для мониторинга лог-файлов служб на сервере и блокирования вредителей по IP…

подробнее…

E-mail:
Skype: dmitry_rendov
Тел.:
включите javascript чтобы видеть номер

Все обновления в Twitter twitter.com/DmitryRendov

Шаг 5. Проверка настроек

Этот шаг не является обязательным, но всё же имеет смысл проверить, что всё работает как было задумано. Посмотреть полный список правил, которыми руководствуется программа при мониторинге активности можно с помощью команды

sudo iptables –L

Также для выполнения проверки достаточно несколько раз ввести неправильный пароль при авторизации и убедиться, что дальнейшие запросы от вас не обрабатываются

Следует обратить внимание на следующее:

желательно проверку производить не с того же IP, с которого осуществляете настройку (чтобы иметь возможность разбанить себя и отредактировать конфиг).
для проверки время бана лучше выставить поменьше.
необходимо убедиться, что IP, с которого производится проверка, не был указан в ignoreip.
важно знать, как удалить IP-адрес из чёрного списка:

sudo fail2ban-client set SECTION unbanip IP 

где SECTION — название секции в конфигурационном файле, в соответствии с правилами которой IP был заблокирован, а IP — адрес, который требуется разблокировать. В нашем случае команда выглядит так:

sudo fail2ban-client set sshd unbanip XXX.XXX.XXX.XXX

Итак, пробуем: для теста я поставил maxretry = 2, bantime = 600, то есть при двух ошибках мой IP-адрес будет заблокирован на 10 минут.

$ ssh [email protected]@95.213.195.80's password: Permission denied, please try [email protected]'s password: 

После второй попытки консоль пару минут ожидала ответа от сервера, но в итоге соединение было разорвано. Дальнейшие попытки соединения в течение 10 минут отклонялись на стороне сервера ещё до запроса пароля, как и ожидалось:

$ ssh [email protected]: connect to host 95.213.195.80 port 22: Connection refused

Настройка fail2ban для защиты Postfix на Centos

Июль 8th, 2014 Evgeniy Kamenev

# yum install fail2ban

1 # yum install fail2ban

# chkconfig —level 235 fail2ban on

1 # chkconfig —level 235 fail2ban on

# nano /etc/fail2ban/fail2ban.conf

1 # nano /etc/fail2ban/fail2ban.conf

loglevel = 3
logtarget = /var/log/fail2ban.log
socket = /var/run/fail2ban/fail2ban.sock
pidfile = /var/run/fail2ban/fail2ban.pid

1
2
3
4
5

Definition

loglevel=3

logtarget=varlogfail2ban.log

socket=varrunfail2banfail2ban.sock

pidfile=varrunfail2banfail2ban.pid

# nano /etc/fail2ban/jail.conf

1 # nano /etc/fail2ban/jail.conf

ignoreip = 127.0.0.1/8  77.120.XXX.YYY/32
bantime = 3600
findtime = 600
maxretry = 5
backend = auto
usedns = warn

1
2
3
4
5
6

ignoreip=127.0.0.18 77.120.XXX.YYY32

bantime=3600

findtime=600

maxretry=5

backend=auto

usedns=warn

# Для блокировки подбора логина/пароля при использовании SASL-аутентификации

1
2
3
4
5
6
7
8
9

postfix25-iptables

enabled=true

filter=postfix-sasl

action=iptablesname=Postfix-smtp,port=smtp,protocol=tcp

sendmailname=Postfix-smtp,dest=your@email,[email protected]

logpath=varlogmaillog

bantime=86400

maxretry=3

findtime=3600

И для блокировки пересылки через Ваш почтовый сервер и др.

1
2
3
4
5
6
7
8
9

postfix-iptables

enabled=true

filter=postfix

action=iptablesname=Postfix-smtp,port=smtp,protocol=tcp

sendmailname=Postfix-smtp,dest=your@email,[email protected]

logpath=varlogmaillog

bantime=86400

maxretry=3

findtime=3600

# nano /etc/fail2ban/filter.d/postfix-sasl.conf

1 # nano /etc/fail2ban/filter.d/postfix-sasl.conf

# Fail2Ban filter for postfix authentication failures

before = common.conf

_daemon = postfix/smtpd
failregex = ^%(__prefix_line)swarning: +\: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: *={0,2})?\s*$
ignoreregex =

1
2
3
4
5
6
7

# Fail2Ban filter for postfix authentication failures

INCLUDES

before=common.conf

Definition

_daemon=postfixsmtpd

failregex=^%(__prefix_line)swarning-._\w+\<HOST>\SASL(?LOGIN|PLAIN|(?CRAM|DIGEST)-MD5)authentication failed(A-Za-z0-9+*={,2})?\s*$

ignoreregex=

проверка срабатывания правил

# fail2ban-regex /var/log/maillog /etc/fail2ban/filter.d/postfix-sasl.conf

1 # fail2ban-regex /var/log/maillog /etc/fail2ban/filter.d/postfix-sasl.conf

И

# nano /etc/fail2ban/filter.d/postfix.conf

1 # nano /etc/fail2ban/filter.d/postfix.conf

# Fail2Ban configuration file

failregex = reject: RCPT from (.*)\: 550
reject: RCPT from (.*)\: 450
reject: RCPT from (.*)\: 554
ignoreregex =

1
2
3
4
5
6

# Fail2Ban configuration file

Definition

failregex=rejectRCPT from(.*)\<HOST>\550

rejectRCPT from(.*)\<HOST>\450

rejectRCPT from(.*)\<HOST>\554

ignoreregex=

проверка срабатывания правил

# fail2ban-regex /var/log/maillog /etc/fail2ban/filter.d/postfix.conf

1 # fail2ban-regex /var/log/maillog /etc/fail2ban/filter.d/postfix.conf

Опубликовано в рубрике Centos, Mail Метки: fail2ban, postfix

Команды

Проверка синтаксиса postfix -c ПУТЬ_К_ФАЙЛУ_НАСТРОЕК_main.cf check
Состояние очереди postqueue -c ПУТЬ_К_ФАЙЛУ_НАСТРОЕК_main.cf -p
Обработка очереди немедленно postqueue -c ПУТЬ_К_ФАЙЛУ_НАСТРОЕК_main.cf -f
Очистка очереди postsuper -c ПУТЬ_К_ФАЙЛУ_НАСТРОЕК_main.cf -d ALL
Тест адресации postmap -q [email protected] ldap:/etc/postfix/ldap-users.cf

Работа с несколькими экземплярами

При решении некоторых задач можно воспользоваться возможностью работы с несколькими экземплярами (instance) сервера.

Для работы нужно добавить такие строки:/etc/postfix/main.cf

multi_instance_enable = yes
multi_instance_wrapper = ${command_directory}/postmulti -p -g ИМЯ_ГРУППЫ reload
multi_instance_directories = /etc/postfix-mx /etc/postfix-1 /etc/postfix-n

1
2
3

multi_instance_enable=yes

multi_instance_wrapper=${command_directory}postmulti-p-gИМЯ_ГРУППЫreload

multi_instance_directories=etcpostfix-mxetcpostfix-1etcpostfix-n

в переменной 
multi_instance_directories указывается экземпляры программы, в примере использованы следующие:

  • etcpostfix-mx
  • etcpostfix-1
  • etcpostfix-n

Для того, чтобы при запуске/останове и перезапуске Postfix и по команде

service postfix …

1 service postfix…

нужно параметре 
multi_instance_wrapper нужно указать имя группы (
ИМЯ_ГРУППЫ) в куда входя нужные экземпляров программы.

Также для того, чтобы разрешить работу с несколькими экземплярами можно использовать команду

postmulti -e init

1 postmulti-einit

Для управления служит программа 
postmulti.

Примеры:

Создание postmulti -I ИМЯ_ЭКЗЕМПЛЯРА -G ИМЯ_ГРУППЫ -e create
Активация postmulti -i ИМЯ_ЭКЗЕМПЛЯРА -e enable
Управление экземпляром postmulti -i ИМЯ_ЭКЗЕМПЛЯРА -p КОМАНДА

Безопасность

mynetworks список подсетей с которых разрешена отправка через этот сервер
disable_vrfy_command=yes Клиент, подключившийся к серверу, может командой 
vrfy [email protected] определить, существует ли заданный адрес в системе
show_user_unknown_table_name=no При попытке клиента отправить письмо несуществующему пользователю по умолчанию сервер выдаст 
550(reject) с сообщением 
user unknown inlocal recipient table (или другой таблице). Отключаем, пусть сервер сообщает 
user unknown
smtpd_helo_required=yes Требуем от клиента приветствия (HELO/EHLO). Все, кто подключается, должны представляться
smtpd_helo_restrictions= permit_mynetworks, permit_sasl_authenticated, reject_invalid_hostname, reject_non_fqdn_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname Ограничения для этапа 
HELOEHLO. Применяются к имени хоста, его IP-адресу и приветствию 
HELOEHLO:Разрешаем доверенные сетиРазрешаем тем, кто прошёл аутентификациюОтбрасываем неправильное (несуществующее) имя хостаОтбрасываем не полностью определённое доменное имя хостаОтбрасываем, если хост по HELO/EHLO не имеет А или МХ записи
smtpd_sender_restrictions= reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unlisted_sender, permit_mynetworks, permit_sasl_authenticated Ограничения для этапа MAIL FROM. Применяется ко всему предыдущему + имя отправителя:Отбрасываем не полностью определённое имя отправителяОтбрасываем отправителя с несуществующего доменаОтбрасываем несуществующих отправителейПроверяем отправителя. Если с нашего домена, то проверим, находится ли он в доверенной сети или прошёл аутентификациюРазрешаем отправлять с доверенных сетейРазрешаем отправлять прошедшим аутентификацию
smtpd_recipient_restrictions= reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unlisted_recipient, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination reject_invalid_hostname Ограничения для этапа RCPT TO. Применяется к предыдущему + имя получателя:reject, если получатель отсутствует в списке нашего домена или списке пересылки. Чтобы сервер не стал открытым 
relay
smtpd_data_restrictions= reject_unauth_pipelining, reject_multi_recipient_bounce Ограничения для этапа DATA:Отвергаем запрос, когда клиент посылает команды SMTP раньше времениreject клиента с пустым именем отправителя, который отправляет сразу нескольким получателям
smtpd_etrn_restrictions= permit_mynetworks, permit_sasl_authenticated, reject Ограничиваем клиентов, которые могут запрашивать очистку очереди сообщений

Включение Plaintext аутентификации в Dovecot

По причинам безопасности, сервер Dovecot IMAP/POP, по умолчанию, не позволяет аутентификацию простым текстом — plaintext (например, использовать незашифрованные пароли). И это правильно и очень хорошо! Но по некоторым причинам, иногда необходимо задействовать аутентификацию plaintext в Dovecot, для этого используется следующая настройка.

# vim /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
# service dovecot restart

Это только некоторые вещи, которые делают администраторы почтовых серверов. Возможно ещё более глубокая настройка Postfix и Dovecot чтобы соответствовать нуждам всех заинтересованных сторон.

Установка самых нужных программ

Здесь указаны команды для установки через терминал (консоль). Но если вы установите Synaptic, тогда остальные программы можно установить через эту программу.

Установщики программ с графическим интерфейсом, вместо консольных apt и dpkg:

sudo apt-get install synaptic

sudo apt-get install gdebi

С помощью Gdebi удобно устанавливать отдельные deb пакеты. Например скачанные браузеры Opera, Chrome или программу Skype. Нажимаете правую кнопку мыши на файле, выбираете «Установить с помощью другой программы» и затем указываете Gdebi. В терминале такой пакет можно установить при помощи программы dpkg передавая ей, в качестве параметра, имя файла и путь к нему. Установка Skpe через программу Gdebi

Synaptic это сильная программа для управления программами — установка, удаление. Устанавливает программы из подключенных репозитариев. Можно использовать вместо консольной программы apt.

Архиваторы, для распаковки rar архивов:

sudo apt-get install p7zip-full

sudo apt-get install unrar

Апплет доступа к дополнительным настройкам GNOME:

sudo apt-get install gnome-tweak-tool

Видеоплеер:

4: Настройка Dovecot

Чтобы подготовить к работе Dovecot, нужно отредактировать семь файлов. Сначала скопируйте эти файлы:

Теперь откройте конфигурационный файл Dovecot:

Раскомментируйте строку:

Под строкой:

нужно включить протоколы (при желании добавьте в список pop3):

Отредактируйте конфигурационный файл mail:

Найдите и раскомментируйте строку mail_privileged_group и установите её значение:

Настройка привилегий

Введите:

Установите следующие привилегии:

Создайте папку для каждого домена, указанного в таблице MySQL:

Создайте пользователя и группу vmail с id 5000:

Передайте права на /var/mail пользователю vmail:

Затем отредактируйте /etc/dovecot/conf.d/10-auth.conf:

Раскомментируйте настройки аутентификации и добавьте следующую строку:

Отредактируйте параметр auth_mechanisms:

Закомментируйте эту строку:

Включите аутентификацию MySQL, раскомментировав эту строку:

Теперь нужно создать файл /etc/dovecot/dovecot-sql.conf.ext и поместить в нём данные об аутентификации:

Добавьте в файл такой код:

В файл /etc/dovecot/dovecot-sql.conf.ext нужно внести пользовательские данные MySQL. Откройте его:

Раскомментируйте параметр driver и установите такое значение:

Раскомментируйте строку connect и укажите в ней данные MySQL:

Раскомментируйте строку default_pass_scheme и установите значение SHA-512.

Раскомментируйте строку password_query и добавьте в неё такие данные:

Передайте права на каталог dovecot пользователю vmail:

Откройте файл /etc/dovecot/conf.d/10-master.conf:

Измените значение параметра unix_listener на service_auth:

Отредактируйте service auth-worker:

Теперь нужно отредактировать SSL-настройки Dovecot.

Примечание: Если вы хотите использовать настройки по умолчанию, просто пропустите этот шаг.

Установите параметр ssl:

Измените пути ssl_cert и ssl_key:

Перезапустите Dovecot:

Проверьте, открыт ли порт 993 и (если вы включили pop3, проверьте и 995):

Готово! Почтовый сервер настроен. Теперь нужно протестировать сервер с помощью почтового клиента:

Примечание: Используйте порт 993 для безопасного IMAP и 587 или 25 для SMTP.

Подготовка окружения

  • Настройка DNS для правильной работы почтового сервера. Должны быть настроены записи: A, PTR, МХ, SPF.
    • DNS: запись PTR PTR обратный просмотр DNS

    • DNS: запись SPF

    • Настройка Dnsmasq Ubuntu — простой в настройке кеширующий DNS транслятор и DHCP сервер.
  • Настройки времени systemd-timesyncd и запуск сервера NTP настройка системного времени.
  • + PHP + + Как включить mod_rewrite?(чтобы все Методы и структура протокола HTTP перенаправлялись на 443 порт)
  • phpMyAdmin установка Ubuntu Debian

  • PostfixAdmin админка для Postfix — Веб-интерфейс для администрирования доменов, ящиков, алиасов и т.д.

Шаг 4. Защита SSH

Файл конфигурации fail2ban имеет по умолчанию подготовленные секции для различных сервисов, поэтому защита какого-либо из них требует минимальных усилий и знаний. Итак, откроем снова файл конфигурации /etc/fail2ban/jail.local и найдём в нём секцию (в вашей системе это может быть или , если это так, то используйте ту секцию, которая у вас есть). Пробежимся по параметрам (в большинстве своём они не являются обязательными, и если не будут указаны, то применяются настройки по умолчанию):

  • enabled — состояние (true/false) фильтра, показывающее, включен он или выключен.
  • filter — какой фильтр применяется (со списком фильтров можно ознакомиться в /etc/fail2ban/filter.d/).
  • action — действия, выполняемые при бане IP-адреса.
  • logfile — файл с логами, которые будет отслеживать fail2ban.

Исходя из этого, конфиг, банящий IP на 12 часов, если с него в течение 10 минут было произведено 3 неудачных попытки авторизоваться, выглядит так:

enabled  = truefilter   = sshdaction   = iptableslogpath  = /var/log/auth.logfindtime    = 600maxretry    = 3bantime     = 43200

Сохраните изменения (в nano это Ctrl+O) и перезапустите fail2ban для применения настроек:

sudo service fail2ban restart

Фильтрация писем на основе темы письма

Рассмотрим более сложный вариант предыдущего скрипта. Там мы фильтровали письма на основе содержимого служебных заголовков. Но если мы захотим отфильтровать почту по теме письма, то сходу у нас ничего не получится. С темой письма возникают сложности из-за того, что она закодирована в base64, если в ней используются русский язык. Вот простой пример. У нас есть письмо с темой «Как дела?». Используем base64 декодер и смотрим, как будет выглядеть тема сообщения в исходнике письма.

Как дела? - 0JrQsNC6INC00LXQu9CwPw==

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

Subject: =?UTF-8?B?0JrQsNC6INC00LXQu9CwPw==?=

Вам нужно будет отбросить сначала кодировку =?UTF-8?, потом не знаю, что означающие символы B?, затем в конце еще вот это ?=. Так вы получаете искомую фразу. Теперь представьте, что кто-то ответит на это письмо. Тема сообщения станет Re: Как дела?. В base64 эта фраза будет выглядеть совершенно по-иному:

Re: Как дела? UmU6INCa0LDQuiDQtNC10LvQsD8=

И вот как в реальном заголовке:

Subject: =?UTF-8?B?UmU6INCa0LDQuiDQtNC10LvQsD8=?=

Сложность добавляет еще то, что разные почтовые клиенты используют разную кодировку в теме письма. Мне встречались как UTF-8, так и WIN-1251. То есть для того, чтобы нормально раскодировать и читать тему сообщения, вам нужно сделать обработку на декодирование, на отбрасывание служебных символов. Еще в процессе тестирования я заметил, что если вы используете не весь текст темы, а только ее часть, то закодированная строка поиска может немного не совпадать с той, что будет в теме письма. Изменения могут возникнуть из-за заглавных/строчных букв, пробелов, запятых и т.д. В общем, я не осилил эту тему, так как надо очень плотно погрузиться в предмет и написать много различных проверок и условий. У меня просто не хватило терпения все сделать красиво, чтобы скрипт работал надежно.

Поступил я в итоге по-другому, более просто и топорно, зато надежно. Допустим, вам нужно, чтобы какая-то переписка не хранилась на сервере дольше определенного времени. Это может быть конфиденциальная информация. Например, вы сканируете документы с отправкой на почту и вам нужно, чтобы сканы там не хранились бесконечно долго. Настраиваете на МФУ шаблон темы сообщения, добавляя в начало такую строку — !del. Затем переводите его в base64, добавляя еще фразы с Re: и Fwd: на случай, если эти письма могут куда-то пересылаться или писаться ответы. Конечно, сканеру вряд ли кто-то будет отвечать, но, возможно, для вашей темы сообщения это будет актуально.

!del IWRlbA==
Re: !del UmU6ICFkZWw=
Fwd: !del RndkOiAhZGVs

Дальше берете скрипт из предыдущего примера и меняете там строку поиска на новую:

grep -E -R -l -I "Subject:.*IWRlb.*|Subject:.*RndkOiAhZGVs.*|Subject:.*UmU6ICFkZWw.*" "$a" >> $copydir/$box/copy-$data_full.txt

Эта строка найдет во всех письмах, сформированных в список предыдущей командой, темы сообщения !del, Re: !del, Fwd: !del и скопирует пути и имена файлов в список. Потом вы можете на свое усмотрение работать с этим списком.

Защита postfix с помощью fail2ban

Изначально fail2ban идет с комплектом готовых настроек и фильтров для защиты большинства популярных сервисов. К ним относится и postfix. Но когда я посмотрел в готовый набор с regexp для postfix, я слегка растерялся :) Он просто огромен. И самое главное, что в таком виде он не заработал на моем лог файле.

Мне стало лень ковыряться в этих правилах. Для защиты postfix от перебора паролей почтовых ящиков, достаточно банить ip адреса из следующих строк лога.

Jun 17 03:14:07 mail postfix/smtpd: warning: unknown: SASL LOGIN authentication failed: UGFzc3dvcmQ6

Для этого достаточно относительно простого regexp.

^%(__prefix_line)swarning: +\: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: *={0,2})?\s*$

Его придумал не я. Честно подсмотрел на просторах интернета. Примеров масса и у нас, и в англоязычном гугле. Далее создаем конфигурационный файл с фильтром из этого regexp — /etc/fail2ban/filter.d/postfix-sasl.conf.

before = common.conf

_daemon = postfix/smtpd
failregex = ^%(__prefix_line)swarning: +\: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: *={0,2})?\s*$
ignoreregex =

Можно сразу же проверить работу этого фильтра с помощью fail2ban-regex. Эта утилита никого не банит, а просто выводит информацию о работе фильтра.

# fail2ban-regex /var/log/maillog /etc/fail2ban/filter.d/postfix-sasl.conf

Команда успешно отработала и вывела результат.

24327 раз данный фильтр распознал строки, попадающие под работу фильтра. Изначально я напрягся, когда прикинул, что именно такое количество ip адресов поедет в бан с помощью iptables. Это еще не критично большое количество, но все равно достаточно много. По одному добавлять такое количество адресов не стоит. Нужно использовать списки, например, .

На деле зря испугался. Никаких проблем не будет и дальше я покажу почему. Правило обработки лога мы проверили и убедились, что оно работает. Дальше добавляем в jail.conf новую секцию.

enabled	= true
filter	= postfix-sasl
port	= smtp,465,submission,imap,imaps,pop3,pop3s
action	= iptables
logpath	= /var/log/maillog
bantime	= 60m
maxretry = 3
findtime = 60m

Пояснять тут особо нечего и так все понятно. Настройка блокировки будет проверять лог файл и записи в нем за последние 60 минут. Если будут 3 совпадения с regexp из фильтра postfix-sasl, ip адрес будет забанен на 60 минут. Таким образом, список забаненных ip адресов будет не очень большой, так как большая часть адресов будет повторяться.

Запускаем fail2ban и добавляем в автозагрузку.

# systemctl enable --now fail2ban

Проверяем лог файл /var/log/fail2ban.

Смотрим правила iptables.

# iptables -L -v -n

У вас должна появиться отдельная цепочка правил f2b-Postfix-sals с заблокированными ip адресами, которые добавил fail2ban. С защитой postfix с помощью fail2ban все. Переходим к Dovecot.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: