Введение
Данная статья будет актуальна для тех, кто сам выполнил установку и настройку 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 |
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 |
ignoreip=127.0.0.18 77.120.XXX.YYY32 bantime=3600 findtime=600 maxretry=5 backend=auto usedns=warn |
# Для блокировки подбора логина/пароля при использовании SASL-аутентификации
1 |
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 |
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 |
# 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 |
# 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 |
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.