Защита от спама

   Ну вот, почтовик мы установили и он работает, если кому интересно то статьи по запуску почтовика здесь и здесь. Прошло время и в почтовые ящики пользователей начал сыпаться спам. Ни один почтовый ящик не обойдет этой проблемы. Сразу защиту от спама я не ставил потому что решаю задачи по мере поступления и возникновения проблем. Но теперь пришло время и мы займемся установкой защиты от спама. И первым что я сделаю это прикручу к exim`у greylist. Я считаю, что на сегодня нет лучше защиты от спама чем greylisting. Он не защищает от спама почтовый ящик пользователя на 100%. Но при правильной настройке 80-95% спама он отсечет точно.

Немного о технологии GREYLIST. Она проста до безобразия: при первой попытке отправить нам письмо, передающей стороне передается код "451. Temporary reject". Эта запись говорит передающему серверу, что мой сервер занят и просит повторить попытку отправки через некоторое время. Нормальный сервер, т.е. не спамщик так и сделает: перепошлет данное сообщение и наш сервер его примет. Спамщики же никогда переповтором отправки не занимаются - это им не выгодно - это резко уменьшит скорость рассылки.

Реализация: полный конфиг exim`а с подключенной технологией greylist лежит здесь. Конфиг с полностью работающего сервера (не говорите потом что что то не работает).

Что добавленно:

1. Вот это вставляем в самое начало перед ACL

GREYLIST_TEST=SELECT concat("id=",id," ts=",(unix_timestamp()-block_expires)) \
        from Greylist \
        where relay_ip='${quote_mysql:$sender_host_address}' and \
        sender='${quote_mysql:$sender_address}' and \
        recipient='${quote_mysql:$local_part}@${quote_mysql:$domain}' limit 1
GREYLIST_ADD=INSERT into Greylist (relay_ip,sender,recipient,\
        block_expires,record_expires,create_time,block_count,ehlo) \
        values \
        ('${quote_mysql:$sender_host_address}',\
        '${quote_mysql:$sender_address}',\
        '${quote_mysql:$local_part}@${quote_mysql:$domain}',\
        unix_timestamp()+60*6,unix_timestamp()+60*60*24,unix_timestamp(),1,\
        '${quote_mysql:$sender_helo_name}')
GREYLIST_UPD1=UPDATE Greylist set pass_count=pass_count+1,\
        record_expires=unix_timestamp()+60*60*24 where id=$acl_m2
GREYLIST_UPD2=UPDATE Greylist set block_count=block_count+1 where id=$acl_m2

2. А это в блоке ACL в нужном месте ))

# set variables
warn set acl_m1 = ${lookup mysql{GREYLIST_TEST}{$value}{id=-1 ts=0}}
set acl_m2 = ${extract{id}{$acl_m1}{$value}{unknown}}
set acl_m3 = ${extract{ts}{$acl_m1}{$value}{unknown}}

# defer if first attempt
defer hosts = ! +relay_hosts
condition = ${if < {$acl_m2}{0}{yes}{no}}
set acl_m4 = ${lookup mysql{GREYLIST_ADD}{$value}{0}}

# defer if time < block_time
defer hosts = ! +relay_hosts
condition = ${if > {$acl_m2}{0}{yes}{no}}
condition = ${if < {$acl_m3}{0}{yes}{no}}
set acl_m4 = ${lookup mysql{GREYLIST_UPD2}{$value}{0}}

# pass defers if time > block_time and update count
warn hosts = ! +relay_hosts
set acl_m4 = ${lookup mysql{GREYLIST_UPD1}{$value}{0}}

Т.к. это все работает с базой mysql, то нужно добавить в нашу базу в данном случае eximbase табличку:

CREATE TABLE IF NOT EXISTS`Greylist` (
`id` bigint(20) NOT NULL auto_increment,
`relay_ip` char(15) default NULL,
`sender` char(64) default NULL,
`recipient` char(64) default NULL,
`block_expires` int(11) NOT NULL default '0',
`record_expires` int(11) NOT NULL default '0',
`create_time` int(10) unsigned NOT NULL default '0',
`pass_count` int(10) unsigned NOT NULL default '0',
`block_count` int(10) unsigned NOT NULL default '0',
`ehlo` char(64) default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `relay_ip` (`relay_ip`,`sender`,`recipient`)
) ENGINE=MyISAM ;

Это можно сделать через phpmyadmin, который мы устанавливали вот здесь. Или сохраняем это в файл ( в моем случае это grey.sql) и с помощью вот такой команды через консоль вводим в базу:

mysql -u root -p eximbase < /usr/local/etc/exim/grey.sql

Для того чтобы удалять устаревшие записи в базе, в cron обязательно прописать:

mysql eximbase -e 'delete from Greylist where unix_timestamp()>record_expires;'

Как это все работает:

а) при первой попытке отправить нам почту (когда sender_address, recipient_address отсутствуют в таблице), письмо отвергается; факт попытки заносится в табличку greylist базы eximbase
б) при попытке спустя время, меньшее 60*6 секунд, письмо отвергается; наращивается счетчик попыток
в) при попытке спустя время большее 60*6 секунд - письмо принимается; обновляется время устаревания записи и счетчик попыток

   Хочу заметить, что технология не моя, я ее просто адаптировал к своему серверу. Будьте внимательны при добавлении кода в конфиг exim`a. Если у вас реализованы всякие дополнительные защиты, то нужно правильно расположить код, иначе технология будет работать неправильно. И еще одно замечание: если вы обратили внимание в базе данных в таблице greylist имеется поле "relay_ip". Я его не использую, хотя можно еще дополнительно включить такую защиту. Спамщики зная, что некоторые сервера используют защиты могут перенаправить почту с другого сервера, т.е. ip хоста сменится. Для этого и вводится данное поле. Соответственно в коде есть строчки которые нужно разкоментировать. Почему я не использую эту защиту, потому что в последнее время я обратил внимание, что некоторые почтовики при повторе отправки письма могут отправлять его совсем с другого сервера. Так поступают например сервера google.com. И если оставить эту защиту, то наш сервер думая, что это спамщик начнет отвергать письма.

 

Категории:

Рейтинг: 
Средняя: 4 (2 оценок)

Добавить комментарий

Filtered HTML

Plain text