Внедряем email-аутентификацию DKIM в Postfix за 5 минут

Работал у нас почтовый сервер для рассылки корреспонденции клиентам. И все бы ничего, но стал люд жаловаться, что не доходят письма или  в спам попадают. И хотя spf был настроен, все говорило о том, что пора нам к нашему Postfix прикрутить DKIM. Как гласит цитата откуда-то с хабра:

DKIM-подпись — это цифровая подпись, которая добавляется к заголовкам письма сервером отправителя, по которой сервер получателя может удостовериться, что отправитель письма соответствует полю From в заголовках письма. Если сервер получателя проверяет эту подпись, то по результатам проверки сервер может принять решение о том, как поступать с письмом: принять, отправлять в папку «Спам», отправить на дополнительную проверку или вовсе отказаться от приёма. Подписи DKIM проверяют и используют сами все ведущие почтовые службы, включая Яндекс и Mail.ru.

Для начала установим необходимый софт командой

aptitude install opendkim opendkim-tools

После установки необходимо отредактировать файл /etc/opendkim.conf, добавив в него строки

Canonicalization relaxed/relaxed
SyslogSuccess yes
KeyTable file:/etc/opendkim/keytable
SigningTable file:/etc/opendkim/signingtable
SoftwareHeader yes
LogWhy yes
ExternalIgnoreList file:/etc/opendkim/trusted
InternalHosts file:/etc/opendkim/trusted

Теперь создадим рабочий каталог,а в нем новый приватный и открытый ключ. Открытый ключ мы потом пропишем на нашем DNS-сервере.

mkdir /etc/opendkim/
opendkim-genkey -s mail -d example.com

В каталоге /etc/opendkim у вас должно появиться 2 новых файла. mail.private — это наш приватный ключ, которым мы будем подписывать письма. А mail.txt содержит публичный ключ. Список имеющихся ключей укажем в файле /etc/opendkim/keytable в формате «название домен:селектор:/путь/до/ключа». В нашем случае содержимое файла будет таким:

mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private

Теперь объясним OpenDKIM почту каких доменов какими ключами подписывать в файле /etc/opendkim/signingtable в формате «домен название-ключа».

example.com mail._domainkey.example.com

В файле /etc/opendkim/trusted необходимо прописать ваши доверенные узлы:

127.0.0.1
localhost
192.168.1.0/24

Зададим необходимые права, добавим пользователя postfix в группу opendkim. Это нужно чтобы postfix смог отправлять письма на подпись через сокет OpenDKIM. После чего перезапустим службу. Я рекомендую заглянуть в системный лог и убедиться, что нет ошибок при запуске службы.

chown opendkim /etc/opendkim -R
gpasswd -a postfix opendkim
service opendkim restart

Вторым этапом настроим postfix, чтобы он мог подписывать нашу почту. В main.cf необходимо добавить:

milter_default_action=accept
milter_protocol=2
smtpd_milters=unix:/var/run/opendkim/opendkim.sock
non_smtpd_milters=unix:/var/run/opendkim/opendkim.sock

Ну и опять рестарт/релоад

service postfix restart

Третьим и последним этапом мы настроим наш DNS сервер добавив в него TXT запись. Выведите содержимое файла mail.txt и используйте следующую пару ключ-значение для добавления новой записи в DNS.

Name: mail._domainkey.example.com.
Text: "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB"

Для применения изменений в DNS может пройти несколько часов. Проверить DKIM-подпись вы можете отправив пиьсмо через свой сервер на ящик [email protected] Ответное письмо вы получите в виде отчета. Например:

=========================================================
Summary of Results
==========================================================
SPF check: pass
DomainKeys check: neutral
DKIM check: pass
Sender-ID check: pass
SpamAssassin check: ham

Полезные ссылки:

Как обнаружить спам-бота в своей сети

Не будем говорить о том, что надо ограничивать права, блокировать трафик и применять прочие методы для того чтобы в вашей сети не заводились спам-боты. Так как все равно каждый день появляются уязвимости, а с ними и новые вирусы.

Но вначале я бы хотел обратить ваше внимание на такой замечательный ресурс как http://mxtoolbox.com/blacklists.aspx, который периодически будет производить проверку вашего IP на наличие в black list. И в случае, если ваш IP будет замечен,- пришлет «тревожное письмо».

После этого возникнет вопрос какая машина заражена. Определить это очень просто. Просто приведу пример работы утилиты, которая должна быть на вооружении у каждого уважающего себя админа, а именно tcpdump. Естественно запускать tpcdump нужно на вашем шлюзе под управлением Linux

tcpdump -ni eth1 'tcp[tcpflags] & tcp-syn != 0 and dst port 25'

В моем примере eth1 — это интерфейс, который смотрит в локальную сеть.

Для шлюзов на основе Windows есть отличная тулза  Wireshark

Как избавиться от спама в WordPress раз и навсегда

Сегодня днем, в очередной раз, очищая комментарии в админке WordPress, я решил что с меня хватит и спам я больше чистить не буду. Но не потому, что я заброшу свой блог, а потому что найду решение этой проблемы. Конечно же я до сегодняшнего дня перепробовал кучу плагинов, но ни один из них нормально не помог бороться со спамом.

Итак, первое что я сделал — это удалил все плагины с Capcha, блокированием по черным спискам и прочую неработающую фигню. Они нам больше никогда не понадобятся, а если и понадобятся — это только при регистрации.

В 99% случаев спамеры отправляют url своих ресурсов. От этого то и будем отталкиваться. В одной из предыдущих заметок я уже рассказывал, что убрал из формы отправки комментария параметр «Сайт». Так вот, спамеры все равно отправляют этот параметр заполненным в своем POST запросе. Этим то мы и воспользуемся. Если есть параметр ‘url’ — шлем спамера «подальше». Также я заметил, что спамеры в качестве текста комментария используют заголовок темы, потому если коммент будет совпадать с заголовком — шлем спамера «еще дальше».

И теперь самое главное — добавим в форму комментария свое поле, которое обязательно для заполнения. К примеру я использовал простое текстовое поле с просьбой ввести от пользователя url своего блога.

Открываем файл wp-includes/comment-template.php и ищем в нем функцию comment_form. В ней находим блок

 $fields =  array(
                'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
                            '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>',
                'email'  => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
                            '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>',

В этот массив добавляем наше поле АнтиСпам.  В конечном счете оно выглядит так:

       $fields =  array(
                'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
                            '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>',
                'email'  => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
                            '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>',
                'spam'  => '<p class="comment-form-spam"><label for="spam">' . __( 'Antispam: please enter voip-lab.ru' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
                            '<input id="spam" name="spam" type="text" value="' . esc_attr(  $commenter['comment_author_spam'] ) . '" size="30"' . $aria_req . ' /></p>');

Далее нам будет необходимо обработать новое поле spam. Для этого открываем файл wp-comments-post.php в корне движка WordPress и находим блок

} else {
        if ( get_option('comment_registration') || 'private' == $status )
                wp_die( __('Sorry, you must be logged in to post a comment.') );
}

И сразу после него добавляем наш код, котором, если пользователь не авторизован,  будет происходить проверка что он не спамер

if ( !is_user_logged_in() ) {
    if($comment_spam!='voip-lab.ru') wp_die( __('If you are not spamer go back and set text field Antispam to voip-lab.ru.') );
    if($comment_author_url!='') wp_die( __('You are fucking spamer.') );
    if($comment_content == get_the_title($post)) wp_die( __('You are fucking spamer.') );
}

Далее необходимо отключить trackback, т.к. очень много спама валится через него. Долго искать решение не пришлось. В корне сайта просто удаляем или переименовываем файл wp-trackback.php.

На этом настройка своей АнтиСпам системы закончена. Приведу немного статистики — когда я использовал капчи и другие плагины, я удалял порядка 300-400 спам сообщений в день. В моем решении мне не пришло ни одного сообщения от спамеров. Скажем им «гуд бай» =)