Postfix and greylisting

Spam became a noticeable threat for the mail servers many years ago. No servers today could be running without being hardened against the spam: according to some reports up to 75% of all the email traffic is spam. It’s noticeable from network capacity, hardware and electricity consumption even if you run a small company mail system. Even though the commercial content analyzing anti-spam solutions might be heavy and expensive and open source ones might be heavy and complicated, there are several techniques that would eliminate about 80% of spam traffic at about no cost from the resource perspective. Greylisting is one of these techniques.

The idea behind the greylisting solution is very simple yet elegant: the hosts that are sending the spam messages are not real mail servers and they’re not controlled by the real system administrator: they’re bots running on random hosts. Since their life is unpredictable even for the owner of the botnet, they don’t obey the rules that the normal mail server does. And if you try to ask such a host politely to postpone the message for 5 minutes it will either disappear forever or it will try once more immediately. That’s the whole idea of greylisting: ask to try once more in 3 or 5 minutes and analyze the behavior of the sender. If it obeys correctly then it is most likely a legitimate mail agent, if not – it’s definitely a spam bot. If we already have seen the sender sending this recipient message from the particular host (i.e. triplet) – then we should not bother them with any checks anymore and will not delay the message for them.

The most convenient way to implement this technique on the Centos with Postfix (see our previous article) is to use postgrey (https://postgrey.schweikert.ch/).

Since the postgrey is added to the main repository we can install it just running

    # yum install postgrey

Then run the daemon and enable it on boot:

    #systemctl start postgrey

    #systemctl enable postgrey

It uses standard smtpd_recipient_restriction mechanism to deal with the postgrey via UNIX socket. Just adding the socket path to the check_policy_service there:

   smtpd_recipient_restrictions =

       permit_mynetworks,

      <other checks>

       check_policy_service unix:postgrey/socket,

       Permit

This will tell the smtpd process to send messages to the postgrey’s socket after all other checks (we don’t want to check trivially out filtered email) and accept it only after the postgrey accepts it.

Postgrey itself does not have a real config file and the only option you really need is for how long you want the message to be delayed. So in the /etc/sysconfig/postgrey we can define the startup option for the daemon. By default, the delay is 300 sec but even 60 seconds might be enough for most bots.

    OPTIONS=”–unix=/var/spool/postfix/postgrey/socket –delay=60″

If you see “access denied” it’s SELinux issue that can be fixed with audit2allow that will tell the SELinux that it’s fine for the postgrey daemon to write to the UNIX socket:

    # grep smtpd_t /var/log/audit/audit.log | audit2allow -m postgreylocal > postgreylocal.te
    # cat postgreylocal.te
    module postgreylocal 1.0;
    require {
            type postfix_smtpd_t;
            type postfix_spool_t;
            type initrc_t;
            class sock_file write;
            class unix_stream_socket connectto;
    }
    #============= postfix_smtpd_t ==============
    allow postfix_smtpd_t initrc_t:unix_stream_socket connectto;
    allow postfix_smtpd_t postfix_spool_t:sock_file write; 

Here we can see example of the message where the sender, recipient and the sender’s host are already

Sep 21 14:38:04 andreybondarenko postgrey[518]: action=pass, reason=triplet found, client_name=mail2.static.mg.example.com, client_address=192.127.58.166, sender=bounce+d58b.00a37-me=andreybondarenko.com@mg.example.com, recipient=me@andreybondarenko.com

Here is an example of delayed message:

Sep 22 11:20:31 andreybondarenko postgrey[518]: action=greylist, reason=new, client_name=ppp91-122-100-196.pppoe.avonddsl.com, client_address=91.12.10.196, sender=ilepct@csu.edu, recipient=me@andreybondarenko.com

As we can see from the PTR, it’s a xDSL pool so it’s definitely a bot.

The drawback of the postgrey is that the first mail that is delivered from the new server would be delayed for several minutes. If you’re running several MX’ex then this problem might be worse since the sending mail server will go to the next MX and if the greylisting is enabled there then it would be delayed on this host too separately, so the delay would be increased.

In conclusion I want to say that the greylisting bounces most of the spam at no cost since the idea and the software behind it are free and it does not add false positives as Bayes filters do.

Postfix mail server with DKIM

Installation and configuration of the mail server (Mail Transfer Agent, MTA) is one of the typical tasks any system administrator faces. Here we will cover the task and by the end of the article will have CentOS 7 with Postfix mail server that listens to he 25 port (SMTP) and delivers messages for the selected domain to users’ mailboxes.

First, we need to have a domain’s DNS records properly configured. This is done in 2 places:

  • A, TXT and MX records are stored at your domain’s registrar, GoDaddy for example.

To check the record use the ‘dig’ command with the record name and domain name as the argument. In our example, my domain andreybondarenko.com is configured as follows:

 ┌[root@andreybondarenko]─[~]
└─10/09 08:37:08-# dig mx andreybondarenko.com
[...]
;; ANSWER SECTION:
andreybondarenko.com.   1800    IN      MX      1 andreybondarenko.com.
[...]

That indicates that the mail for the entire andreybondarenko.com domain is served by the host named ‘andreybondarenko.com’ because I have only one host. If we have more, we can create mx1.andreybondarenko.com and mx2.andreybondarenko.com and they would deliver mail randomly chosen by the client. This is useful for stability, redundancy and load balance.

  • PTR record is set at the hosting provider side. You can either find the record in the control panel or as a technical support service will do this for you.If the hosting provider will refuse to change it, your messages would be rejected by most large mail servers (including Google). This record is called ‘reverse’ and allows anyone to check that the IP address that is used to initiate connection has a valid domain name. It’s a fast and easy way to detect spam bot: it uses an IP address it does not control, so it cannot set the PTR record properly.

Second, the Postfix itself should be installed. I recommend using it as a mail server due to it’s highly flexible, secure, extensible and can provide you high performance on large installations. On the CentOS just run:

    yum install postfix

And the packet manager will install it with all dependencies needed. At the moment the version 2.10.1 is the latest available in the CentOS repository, so I will use it.

Postfix has 2 configuration files. /etc/postfix/master.cf controls process count, their behaviour, should they use a chrooted environment or not for and the defaults are OK for most cases. The /etc/postfix/main.cf controls everything else, we need to change following:

[..]
myhostname = andreybondrenko.com
mydomain = andreybondarenko.com
[..]

These two variables should be set to the valid host name of the host itself and to the domain he is servin mail for. In my case they are the same.

[..]
myorigin = $myhostname
[..]

The myorigin parameter specifies the domain that locally-posted mail appears to come from. The default is to append $myhostname, which is OK for small sites.  If you run a domain with multiple mail servers, you should change this to $mydomain and set up a domain-wide alias database that aliases each user user@users.host. To maintain consistency between sender and recipient addresses,  myorigin also specifies the default domain name that is appended to recipient addresses that have no @domain part. We will use the default setting.

[..]
inet_interfaces = all
inet_protocols = all
[..]

This two settings will tell the smtpd to listen to both IPv4 and IPv6 on all interfaces.

[..]
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, myotherdomainihave.com
[..]

This variable sets all domains we would accept mail to. In this case that’s andreybondarenko.com, myotherdomainihave.com and localhost.

[..]
relay_domains = $mydestination
[..]

This variable sets all domains for we would relay mail in case the recipient is not located on our host.

That is basically all the initial configuration we need: it tells the smtpd to listen to 25 port on all interfaces, accept mail to andreybondarenko.com, localhost and myotherdomainihave.com. By default, it would deliver mail to users mailboxes in the /var/mail, in future, we can set up dovecot to be  an IMAP server and provide the SASL authentication, then we can harden the Postfix against spam, setup greylisting and DKIM. Last thing we need to do is to tell Systemd to start Postfix on boot and to run it now:

systemctl enable postfix
systemctl start postfix

We can now see it’s running in process list:

┌[root@andreybondarenko]─[~]
└─10/09 09:16:44-# ps ax|grep postfix
1764 ? Ss 0:02 /usr/libexec/postfix/master -w

We can connect to the 25 port and send a message with the telnet:

┌[root@andreybondarenko]─[~]
└─10/09 09:19:13-# telnet localhost 25
Trying ::1…
Connected to localhost.
Escape character is '^]'.
220 andreybondrenko.com ESMTP Postfix
helo andreybondarenko.com
250 andreybondrenko.com
mail from:
250 2.1.0 Ok
rcpt to:
250 2.1.5 Ok
data
354 End data with .
test
.
250 2.0.0 Ok: queued as EBA0881589
quit
221 2.0.0 Bye
Connection closed by foreign host.

And see it in the /var/log/millog

Sep 10 09:19:18 andreybondarenko postfix/smtpd[10889]: connect from localhost[::1]
Sep 10 09:19:47 andreybondarenko postfix/smtpd[10889]: EBA0881589: client=localhost[::1]
Sep 10 09:19:54 andreybondarenko postfix/cleanup[10895]: EBA0881589: message-id=20170910091947.EBA0881589@andreybondrenko.com
Sep 10 09:19:54 andreybondarenko postfix/qmgr[1770]: EBA0881589: from=root@andreybondarenko.com, size=352, nrcpt=1

Now it’s time to set up DKIM (see https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail). In fact the only thing that Domain Key technology provides is the information that the person who controls the DNS also controls the mail server. This mean we should set up two places at the same time: the DNS TXT record and special damon on the server side.

First, install opendkim package:

    yum install opendkim

Second, run

┌[root@andreybondarenko]─[~]
└─10/09 18:46:11-# opendkim-default-keygen

Generating default DKIM keys:
Default DKIM keys for freshdaymall.com created in /etc/opendkim/keys.

In the /etc/opendkim/keys there would be 2 files containing public and private keys. Check that permissions are follows for the private key (only opendkim user can read):

┌[root@andreybondarenko]─[/etc/opendkim/keys]
└─10/09 18:50:52-# ll default.private
-r--------. 1 opendkim opendkim 887 Oct  2  2016 default.private

Now we need to correct settings. 

  • /etc/opendkim.conf – configuration file of opendkim
  • /etc/opendkim/keytable — defines the path of private key for the domain
  • /etc/opendkim/signingtable – tells OpenDKIM how to apply the keys.
  • /etc/opendkim/TrustedHosts – defines which hosts are allowed to use keys.

I have copied my public and private keys to the /etc/opendkim

┌[root@andreybondarenko]─[/etc/opendkim]
└─10/09 18:53:40-# ls -la
total 48K
drwxr-xr-x. 3 root opendkim 4.0K Jan 9 2017 .
drwxr-xr-x. 96 root root 12K Sep 8 07:28 ..
-r--------. 1 opendkim opendkim 887 Oct 2 2016 andreybondarenko.com.private
-rw-r-----. 1 root opendkim 333 Oct 2 2016 andreybondarenko.com.txt
drwxr-x---. 2 opendkim opendkim 4.0K Dec 21 2016 keys
-rw-r--r--. 1 root root 106 Oct 3 2016 keytable
-rw-r--r--. 1 root root 60 Oct 3 2016 signingtable
-rw-r-----. 1 opendkim opendkim 378 Dec 21 2016 TrustedHosts

In the /etc/opendkim.conf we need following parameters:

Mode    sv – sign and verify outgoing messages

Socket  inet:8891@localhost – use port 8891 at localhost for communication

ReportAddress  “andreybondarenko.com Postmaster” <me@andreybondarenko.com> – postmaster’s address.

Domain andreybondarenko.com – my domain

Selector        mail – the part to look at the TXT record for the key.

Other parameters could be lived by default.

Then setting /etc/opendkim/keytable as follows:

mail._domainkey.andreybondarenko.com andreybondarenko.com:mail:/etc/opendkim/andreybondarenko.com.private

And the  /etc/opendkim/signingtable

*@andreybondarenko.com mail._domainkey.andreybondarenko.com

First file defines where to look for the private key for the domain (remember that real life server can have many of them) and second defines that all mail should be signed with this key. TrustedHosts is trivial and default:

127.0.0.1
::1

Now we can run opendkim:

systemctl enable opendkim
systemctl start opendkim

Last part on the host is to tell the Postfix to forward all mail to the opendkim first by adding local milter :

smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:127.0.0.1:8891

That’s it! Restart the Postfix to get new config:

systemctl restart postfix

Now the last and very important part: we need to publicize the open part of the key to the world with the DNS TXT record. You need to create record as follows:

  • Name – mail._domainkey
  • Type: TXT
  • TTL: 1 hour
  • Value: v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvGRWfWPPZVIg0fy7Pr0+rsBsoL6Imt1GBE/QRd3X5Izv1iAJFUsOteaf9TI9EO/YFwoLLahzuoZM1aUU4ED3fHlItEnqXCKQhX8Zripi7cfIO+DRFEhGuQtG6OIuA6+c3ivao7DTPk/IFqY7MG5M3wMvAfV+eIBf1VjmajSwe3wIDAQAB

Last part, the ‘value’ is tricky and may lead to mistakes. You need to read the /etc/opendkim/your_domain.txt or /etc/opendkim/keys/default.txt and copy the value removing all quota symbols (i.e. all “).

OK Google Mail!

Starting around 11 April Gmail started to mess with the TLS. If in the “send as” settings you had anything in the MX hostname, that does not match what’s going on after your @ and your cert, your mail server got a reject, even if his origin matches the certificate. I had ‘mx.andreybondarenko.com’, had to change to ‘andreybondarenko.com’. I didn’t had touched this settings for ages. Discussion by the link below.

https://support.google.com/mail/thread/39390661?hl=en

Google group calendars in Evolution Mail

If your organization uses Google Apps as mail service but you are using Evolution, there is no evident way to view and edit shared group calendars until recent versions. To add group calendar you need:

  1. go to calendar settings on web
  2. Calendar Address: -> ID (somenting like example.com_1d32345331343234213832@resource.calendar.google.com)
  3. Evolution -> New Calendar -> Google
  4. User name -> this ID
  5. Auth with usual name-pass or other means you use (Kerberos, OTP) in the window appear.
  6. Allow Evolution to use the Google’s resources.

DKIM=temperror

Recently I have checked my messages headers of the mail that comes from the andreybondarenko.com MX and found that Google shows that my DKIM signature is invalid:

Authentication-Results: mx.google.com; dkim=temperror (no key for
 signature) header.i=@andreybondarenko.com;

In the spam score section:

DKIM_SIGNED,T_DKIM_INVALID

However the header itself is present:

DKIM-Filter: OpenDKIM Filter v2.10.3 andreybondrenko.com CE25780BAC
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=andreybondarenko.com; s=default; t=1483634085;
        bh=w00tuUhwty0/5n/YHiopiY3PpnqKT5BLK9l6TkDNUUk=;
        h=Subject:From:Reply-To:To:Date:From;
        b=J5qB5RF9lrOho1wBpLyLi5a6CwIHZK1sugCr2wpwnPKwEg76RFv2/y8xaiwquqftX
         VhTJH9NLJXcPdu8k8/zN/sc8P1RksNR9EvDw6k2YNEKoeMsKMGgyMC4kAAhcT31IgX
         eqnIqWxhVTVdjRqrqzNPn0wuBbGJgO2bwmFcVsy8=

I have found that it’s quite common configuration error of the OpenDKIM, the selector you choose to store key can be chosen randomly, but the TXT record should match /etc/opendkim.conf. In my case:

##  Defines the name of the selector to be used when signing messages.
Selector   default

But the DNS record:

[user@andreybondarenko ~]$ dig TXT mail._domainkey.andreybondarenko.com

;; ANSWER SECTION:
mail._domainkey.andreybondarenko.com. 1800 IN TXT "v=DKIM1\; k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdGRWtWPPZVIg0fy7Pr0+rsBsoL6Imt1GBE/QRd3X5Izv1iAJFUsOtea
f9TI9EO/YFwoLLahzuoZM1oUU4ED3fHlItEnqXCKQhX8Zripi7gfIO+DRFEhGuQtG6OIuA6+c3ivao7DTPk/IFqY7MG5M3wMvAfV+
eIBf1VjmajSwe3wIDAQAB"

Changing ‘Selector’ to ‘mail’ and restating opendkim (it’s faster then change DNS):

Authentication-Results: mx.google.com; dkim=pass
 header.i=@andreybondarenko.com;

In the spam score section:

DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU

Evolution mail signature workaround

Evolution mail application in the Fedora 25 has annoying bug: it freezes when trying to add/edit signature (although, you can delete old one). It’s a known bug fixed in upstream and you can actually edit signature files (it’s quite tricky), but you can add shell script that would generate signature for you.

UPD: need to use “cowsay `fortune`”

DNSBL checkers list

Since I am now running my own smtp-server, I have to deal with different black list servers myself and check my IP from time to time if it’s there or not.To cover pretty much everything valuable:

https://www.whatismyip.com/blacklist-check/http://whatismyipaddress.com/blacklist-checkhttp://mxtoolbox.com/SuperTool.aspx?action=blacklist%3a85.17.249.170&run=toolpage

My IP was in 2 lists, DAN ME, APEWS and Barracuda.

DAN ME is a list maintained by some loser, who lists there all TOR-related IP addresses he can find. Unfortunately he lists not only the exit-points, but relays as well. Fortunately, his list is automated, but I had to shut down the TOR node.

Barraccuda removes by request, however, sells “subscription” for $20, so you will not be in the list again. That’s low!

At the moment it’s in the APEWS for 3(!) years and the owner has a long faq where he is explaining why he would not remove you ever.

Thinking of extra VPS for the additional MX.

Sieve: фильтрация почты на стороне сервера

После того, как Google закрыл Reader, я утратил веру в большую компанию, которая делает для меня инструмент, решающий важные мне задачи. Я решился строить свой собственный Луна-парк с читалками, агрегаторами, болжеком и т.п. Почта на своем домене — первое, что приходит в голову. Не вопрос прописать MX запись, поставить Postfix на локальную доставку, установить IMAP-сервер Dovecot и почтовый веб-клиент Roundcube, вопрос повторить функциональность «большой» системы, в первую очередь, сортировку. Я не буду дублировать существующие инструкции, опишу только неочевидные моменты.

Continue reading “Sieve: фильтрация почты на стороне сервера”

Доклад по вопросам сравнения антиспамов и построения спам-фильтров

Ссылка на конференицию UNИX;

Презентации: ODPPDF;

Спам

Сколько вам приходит спама в день? Мне около 1000-1500 сообщений на abondarenko@gmail.comи корпоративный ящик. Это много, друзья, моя жена, спам-аналитик, не даст мне соврать, но эти адреса принадлежат живому человеку и им больше 5 лет.

Нормальные люди решают задачи минимизации потока мусора в свои ящики, а мне как-то довелось решать обратную задачу, мне нужно было сделать спам-ловушки, то есть адреса, на которые будет приходить 100% спам дабы можно было обучать фильтры и смотреть статистику их работы. Казалось бы, чего проще! Ну зарегистрируем мы немного ящиков на разных сервисах платных и не очень, заведем какой-нибудь неприметный домен с ничего не говорящим именем digitalhardcore.us, будем эти адреса оставлять в регистрационных карточках заказа рекламы Pfizer’a и еще какой-нибудь дряни (естественно, отписавшись сразу же от легитимной рекламы) и дело в шляпе. И так, что было сделано:

  • Несколько адресов на mail.com, yahoo.com и еще где-то с форвардом на приемник потока у нас.
  • digitalhardcore.us, вся почта с которого форвардится на тот же приемник.
  • Регистрируемся на множестве сайтов разной направленности от торрент-трекеров и обзоров железа до секс-шопов оставляя там эти адреса.
  • Постим на форумах разные нейтральные комментарии указывая в подписях адреса.

Результат выполнения пунктов 3 и 4 ночными дежурными за 1 год – около 100 писем в день на адрес (плюс-минус), хотя ожидался на порядок больше.

Второй интересный момент: на 1 адрес мы собирали “не спам”, то есть рекламу уважаемых контор вроде cocacola или hp чтобы тестировать себя на ложные срабатывания. Результат через год – 10-20 спамовых писем в день в потоке честной рекламы, хотя адрес живым людям кроме меня был не известен.

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

Отсюда лично я делаю выводы:

  • крупные неуважаемые места торгуют базами пользователей (удав, фишки).
  • крупные уважаемые места ими не торгуют (LOR, Lepra), но некоторые все-таки торгуют. основной метод сбора адресов для набития баз – это не прочесывание стайтов и перебор имен, а потрошение записных книжек почтовиков троянами.

По этому можете смело писать свои адреса без дурацких _at_ или _здесь_была_собака_, форумы – капля в море.

Антиспам – отстой

Антиспамами принято меряться, давать им разные крутые награды и хвалить на форумах. Я хочу рассказать о том, как ими меряться правильно и что следует из измерений.

Сначала надо определиться, что есть спам. Вопрос не так прост, как кажется. Вот так определяет спам Лаборатория Касперского: “Массовая не запрошенная анонимная рассылка”. Массовая – потому, что единичный blackmail не есть результат работы спамера, а есть просто частный конфликт двух-трех людей. Незапрошенная – потому, что запрошенная реклама – не спам, ведь пользователь сам хотел ее у себя видеть и спамфильтр ее резать не должен. Анонимная (технически), потому, что с непрошенными письмами людей, которые себя никак не скрывают вопрос решают административно. Яркий пример таких писем – разные повестки или оповещения. Важность этого определения в том, что например, Яндекс спам определяет иначе, у него это “вся нежелательная почта и все рассылки”. Можно дискутировать на тему правы они или нет, но это однозначно надо учитывать при сравнении результатов их работы. Вообще на сколько мне известно, на сегодняшний момент консорциум по борьбе со спамом определение термина так и не утвердил, но рабочий вариант максимально приближен к определению ЛК.

Второе – в каких условиях сравнивать? Сравнивать надо только на живом потоке почты, а не на старой коллекции спама, потому, что то, что попало в “коллекцию” уже никогда не встретится в реальной жизни и ее фильтрация нам ни о чем реальном не скажет. Все тестируемые антиспамы должны быть поставлены в равные условия, то есть не последовательно, а параллельно. И тестировать надо неделю или две на хорошем потоке, а не на десятке сообщений и не один день.

Третье – что сравнивать кроме скорости. Сравнивать надо 2 величины – уровень детектирования (Detection Rate) и уровень ложных срабатываний (False Positive Rate). Первое число – это число верно распознанных как спам писем поделенное на общее число спама. Это число НИКАК нельзя посчитать при помощи робота потому, что робот не видит собственных ошибок. Уровень ложных срабатываний – это число распознанных как спам нормальных писем поделенное на общее число нормальных писем. Если первый параметр указывают, то второй либо замалчивают либо пишут откровенные небылицы. Нужно помнить, что FPR резко растет с увеличением агрессивности фильтра и, например, при замене антиспама на тупой скрипт “помечать как спам вообще все” и DR и FPR будут равны 100%: 100% спама мы распознаем уверенно, но и все чистые письма тоже зарубим.. Пример реальных цифр – Spam SLA Message Labs гарантирует деньгами 95%DR, 0.0004%FPR.

А теперь, почему антиспам – отстой. Потому, что хороший антиспам при низком FPR (одно на 10000) имеет в реальности DR около 93-96%. То есть например я при хорошем эгрегоре и чистой карме получу 40-70 спамовых писем в день (что собственно и происходит). По опыту, спам начинает бесить пользователя где-то на 14-16 письмах в день, так что меня ярость должна разорвать на куски :-).

Персональный спам

Для того, чтобы понять как нам сделать жизнь удобнее, надо разобраться, как вообще работают антиспамы. Есть 3 больших класса методов борьбы со спамом (классификация моя, можете поправить):
Разграничение прав доступа. То есть блокировка письма по признаку отправителя, не важно как мы его ограничиваем: авторизацией или урезанием пулов IP по DNSBL, greylist’у или как-то еще.

Анализ контента. Когда какой-то нормализованый кусочек письма рассматривается как образец спама, характеристический термин, URI из блек-листа чего угодно (IP, телефоны, URL, whatever).
Статистика. Ведение персональной базы по отдельно взятому потоку спама-неспама любым удобным алгоритмом, например байесом.

Недостаток первого метода в том, что слишком грубая резка порождает ложные срабатывания и RBLы часто обслуживаются полностью невменяемыми людьми. Второго в том, что база сигнатур-признаков-терминов всегда в большей или меньшей степени не поспевает за спамерами и отражают некий усредненный поток, а рассылки нынче уникальные с очень коротким временем жизни. Третьего (кроме традиционной убогости реализации) в вечном мусоре в базе, опасностью перекормить спамом и необходимостью вести статистическую базу для каждого пользователя (если мы хотим хорошего результата), а по сему по моему глубокому убеждению подкрепленному опытом Байесу на серверах делать совершенно нечего. Первый метод используют все, второй – практически все коммерческие вендоры (Message Labs, Yandex, Kasperksy, Symantec), третий – spamassasin и производные, а так же все персональные.

Так как спамассасин все-таки ставят на сервера, а ведением персональных баз никто себя не утруждает, то можно смело заявлять, что ваш серверный антиспам использует анализ некоего усредненного потока, и то, что все-таки проходит к вам в ящик – это либо очень хороший спам, либо “выбросы” из этого среднего потока. Так как хороший спам – это наверняка инновации и его поимку через некоторое время лечит вендор серверного антиспама, то нам следует сосредоточится на “выбросах” – вот тут-то нам и поможет Байес. Он встроен во все персональные антиспамы в том или ином виде с разной степенью убогости (самая убогая реализация – у Microsoft при совершенном отсутствии причин делать плохо очевидные вещи по известным алгоритмам имея в общем полноценный почтовый клиент и не полхой сервер) и так как он наш, то настроить и обучить его мы вполне способны так, чтобы снизить вредное влияние его традиционно большого false positive rate. Мой рецепт счастья: скидывать спам, отфильтрованный им в отдельный ящичек не смешивая со спамом отфильтрованным сервером, чтобы просматривать его перед удалением. Первое время там окажется довольно много нужной почты и потребуется явные корректировки настройки, но месяца через 3 он перестанет фалсить.

Спам – Зло

Как правило, про сотрудников компаний-производителей говорят, что они склонны преувеличивать реальные опасности, с тем, что бы улучшить собственные продажи. Конечно, это бывает, хотя, в общем, среди профессионалов такое поведение считается, по меньшей мере, неэтичным. Скажем, в (ISC)² Code Of Ethics, которому обязательно должны следовать специалисты CISSP, сказано: “давайте разумные, обоснованные советы; не создавайте (у ваших собеседников — прим. переводчика) беспричинного беспокойства или необоснованной уверенности”. Как уже казано, специалисты по информационной безопасности иногда нарушают канон о беспричинном беспокойстве. Но и необоснованная уверенность является не меньшим злом. Continue reading “Спам – Зло”