30 ноября 2012 г.

Postfix antispam

Методы борьбы со спамом:

1. RBL (DNSBL)

Многие сталкивались со спам-базами типа sorbs, spamhaus и пр. В них содержатся IP-адреса спамеров, открытых релеев, динамических адресов. К сожалению ни одна из них существенно не уменьшит спам, а вот разбираться с жалобами на недошедшие письма будете часто. Кто хочет проверить, добавьте несколько команд reject_rbl_client с популярными базами (можно найти здесь http://dnsbl.info ). Можно использовать блок-листы в каком-либо контент-фильтре который, обращаясь к нескольким базам, будет учитывать наличие отправителей в списках.

2. проверки на основе DNS

Хороший результат даёт проверка  существования и соответствия IP-адреса, имени хоста, PTR-записи.
Так как RFC 1912 требует однозначного соответсветсвия А и PTR записей, то рекомендую использовать команду reject_unknown_client_hostname. Она делает проверку АДРЕС -> ИМЯ ->АДРЕС. На практике, администраторов почтовых серверов не способных рабораться с настройкой DNS, встречается мало. Если в вашем случае это не так, то используйте менее строгую проверку reject_unknown_reverse_client_hostname, которая проверит лишь наличие PTR-записи.


3. грейлистинг

На многих почтовых серверах используется этот метод ограничения спама. Временная задержка письма, от неизвестного отправителя, позволяет снизить объём входящего спама до приемлемого минимума. К сожалению данный способ подходит не всем. Если список, пишуших вам адресатов постоянно меняется, то постоянные задержки будут сильно раздражать. Если вы решили использовать грейлистинг, необходимо помнить о возможной ситуации, когда встречный сервер перед тем, как принять письмо от вас, захочет проверить существование вашего электроящика. Для этого он установит обратное соединение и в ходе SMTP-диалога получит ответ о существовании вашего ящика, дефолтный адрес Postfix для этого double-bounce@server_hostname. Чтобы решить проблему, необходимо использовать белые списки или не отдавать код 4ХХ до команды DATA.

4. запрет приема с динамических адресов

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

(ppp|(a|v|s|h|r|sh)dsl|dial[(in|up|er)]|wimax|gprs|cdma|wifi|broadband|cable|dhcp|dslam|dynamic|pool-|vpn|[ck]lient).*..*


5. контентные фильтры

Все знают о фильтрах на основе теоремы Байеса. С Postfix работают все открытые и коммерческие реализации данного алгоритма. Разница между ними только в том, что коммерческий фильтр обучать не надо. Для нагруженных серверов рекомендую использовать альтернативные реализации SpamAssassin типа DSPAM, RSPAMD переписанные на С.

 
6. запрет приема "чужих" отчетов о недоставке

Полученный NDR (Non-Delivery Report) от сервера письмо которому вы не посылали можно смело отправлять в /dev/null. Но как?  По RFC мы обязаны принимать такие отчеты, чтобы сообщить пользователю о неудачной доставке его письма. Автор Postfix предлагает бороться с этим регулярными выражениями: http://www.postfix.org/BACKSCATTER_README.html

Но perl это зло для нагруженных серверов, как и в случае со SpamAssassin нагрузка может оказаться слишком большой. Из стороннего софта позволяющего отсечь такой спам это milter-null http://www.snertsoft.com/sendmail/milter-null/   


7. ограничение потока писем от одного источника

Тут все очень просто, исходя из статистики вашего сервера ставим разумные ограничения. Это не даст какому-нибудь червяку завалить сервер и попасть во все блок листы. Команды Postfix регулирующие скорость: 

anvil_rate_time_unit = 30m

anvil_status_update_time=60s
smtpd_client_connection_count_limit = 15
smtpd_client_connection_rate_limit = 50
smtpd_client_message_rate_limit = 50
in_flow_delay = 1s

Цифры в данном примере будут индивидуальны для каждого сервера. 


8. замедление "плохих" клиентов

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

smtpd_error_sleep_time = 5ssmtpd_soft_error_limit = 1smtpd_hard_error_limit = 5

9. проверка существования доменов и почтовых адресов

Для проверки существования доменов отправителей и получателей добавляем команды reject_unknown_sender_domainreject_unknown_recipient_domain. По моей статистике проверки не очень эффективные, наверно можно их и не использовать. Проверка адресов отсеивает гораздо больше спама, но проверять все адреса не стоит. Обязательно столкнетесь со случаем, когда не дойдёт важное информационное письмо от робота которому отвечать не надо. Почему то некоторые администраторы думают, что подставлять несуществующий адрес отправителя для сгенерированных автоматически писем это нормально. Чтобы этого избежать, делаем выборочную проверку ящиков почтовых служб типа aol, yahoo, yandex, gmail ... 

check_sender_access hash:$config_directory/sender_access.hash
check_recipient_access hash:$config_directory/recipient_access.hash

Файлы sender_access.hash и recipient_access.hash содержат список проверяемых доменов.


10. отклонение писем не соответствующих RFC

То что может  Postfix:
strict_rfc821_envelopes = yes

Сторонний софт типа milter-limit проверяет побольше:


# Strict RFC 2821 domain name length limit.
-rfc2821-domain-length

# Treat plus-sign as itself; not a sendmail plussed address.
-rfc2821-literal-plus

# Strict RFC 2821 local-part length limit.
-rfc2821-local-length

# Strict RFC 2821 grammar for mail addresses.
-rfc2821-syntax

# Reject RFC 2606 reserved domains.
-reject-rfc2606


11 ноября 2012 г.

проверка аутентификации почтового сервера

http://www.postfix.org/SASL_README.html

Testing SASL authentication in the Postfix SMTP Server

To test the server side, connect (for example, with telnet) to the Postfix SMTP server port and you should be able to have a conversation as shown below. Information sent by the client (that is, you) is shown in bold font.

% telnet server.example.com 25
...
220 server.example.com ESMTP Postfix
EHLO client.example.com
250-server.example.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH DIGEST-MD5 PLAIN CRAM-MD5
250 8BITMIME
AUTH PLAIN AHRlc3QAdGVzdHBhc3M=
235 Authentication successful
To test this over a connection that is encrypted with TLS, use openssl s_client instead of telnet:

% openssl s_client -connect server.example.com:25 -starttls smtp
...
220 server.example.com ESMTP Postfix
EHLO client.example.com
...see above example for more...
Instead of AHRlc3QAdGVzdHBhc3M=, specify the base64-encoded form of \0username\0password (the \0 is a null byte). The example above is for a user named `test' with password `testpass'.

Caution
When posting logs of the SASL negotiations to public lists, please keep in mind that username/password information is trivial to recover from the base64-encoded form.

You can use one of the following commands to generate base64 encoded authentication information:

Using a recent version of the bash shell:

% echo -ne '\000username\000password' | openssl base64
Some other shells support similar syntax.

Using the printf command:

% printf '\0%s\0%s' 'username' 'password' | openssl base64
% printf '\0%s\0%s' 'username' 'password' | mmencode
The mmencode command is part of the metamail software.

Using Perl MIME::Base64:

% perl -MMIME::Base64 -e \
    'print encode_base64("\0username\0password");'
MIME::Base64 is available from http://www.cpan.org/.

7 ноября 2012 г.

milter-limit, Postfix, FreeBSD

Postfix vs SPAM

Ограничить количество пересылаемых писем позволяет плагин milter-limit разработанный Snersoft http://www.snertsoft.com
Возможно задать ограничения по IP-адресам, доменам, именам почтовых ящиков отправителей и получателей. С полным списком возможностей можно ознакомиться здесь http://www.milter.info/sendmail/milter-limit/#
На сайте есть еще ряд интересных милтеров работающих как с Sendmail так и с Postfix.

На момент установки использовались  FreeBSD 9.0, Postfix 2.9, db41, milter-limit 0.15, libsnert-1.71.6.

Для начала отсюда http://www.snertsoft.com/clients/downloads.php надо стянуть исходники милтера и библиотеки.

Затем кладём это добро в /etc/mail и распаковывая получаем каталог COM.

tar -zxf milter-limit-0.15.tar.gz
tar -zxf libsnert-1.71.6.tar.gz
cd /etc/mail/com/snert/src/lib
./configure
make
make install

cd /etc/mail/com/snert/src/milter-limit/
./configure --enable-run-user=postfix --enable-run-group=mail
make build
make install

cp /etc/mail/com/snert/src/milter-limit/milter-limit.cf /etc/mail

echo "smtpd_milters = unix:/var/run/milter/milter-limit.socket" >> /usr/local/etc/postfix/main.cf

/usr/local/etc/rc.d/milter-limit.sh start

Делаем нужные ограничения и создаем хэш 
makemap -C /etc/mail/sendmail.cf hash /etc/mail/access < /etc/mail/access


2 ноября 2012 г.

Обновление FreeBSD

tar -czf /root/ETC.tar.gz /etc /usr/local/etc
pkg_info -qoa | sort > /root/pkg_list.NEW
diff /root/pkg_list.* | egrep „^(<|>)”

freebsd-update upgrade -r 8.1-RELEASE
freebsd-update install
shutdown -r now
freebsd-update install

pkg_info -qoa | sort > /root/pkg_list.OLD
pkg_delete -a -f
rm -r -f /boot/modules /usr/local /var/db/pkg
while read PKG; do pkg_add -r $( basename ${PKG} ); done < /root/pkg_list.OLD

rm -r -f /root/pkg_list.*
rm -r -f /root/ETC.tar.gz

1 ноября 2012 г.

virtual serial console HP, iLO, FreeBSD, Linux

При вызове консоли видна загрузка сервера только до старта ОС или выдается сообщение

</>hpiLO-> Virtual Serial Port active: IO=0x02F8 INT=3.


Для использования VSP или Textcons через SSH на серверах HP с установленной FreeBSD необходимо произвести следующие настройки:



1.  добавить строки /boot/loader.conf



console="comconsole, vidconsole"

boot_multicons="YES"

hint.uart.0.disabled="1"
hint.uart.1.flags="0x10"

2. отредактировать в /etc/ttys

ttyu1 "/usr/libexec/getty std.115200" xterm on secure (FreeBSD9)
ttyd1 "/usr/libexec/getty std.115200" vt100 on secure (FreeBSD7)

3. перезагрузить сервер

reboot 




RedHat 6.5


1. BIOS

Выбрать порт COM1  и скорость 115200.

2. /etc/grub.conf

Добавить в начало 
serial -unit=0 -speed=115200
terminal -timeout=10 serial console

Закоментировать строку splashimage=(hd0,0)/grub/splash.xpm.gz

3. /etc/init/ttyS0.conf

Создать файл и добавить строки

start on stopped rc RUNLEVEL=[2345]
stop on runlevel [!2345]

respawn
exec /sbin/agetty -L 115200 ttyS0 vt 102

4. Чтобы заходить по рутом добавить ttyS0 в /etc/securetty


Integrated Lights-Out 3 Virtual Serial Port configuration and operation

http://h20000.www2.hp.com/bc/docs/support/SupportManual/c00263709/c00263709.pdf

RedHat 7.0

1. /etc/default/grub

Добавить в конец строки GRUB_CMDLINE_LINUX="... console=ttyS0"

2. grub2-mkconfig -o /boot/grub2/grub.cfg

3. systemctl start serial-getty@ttyS0