Пример настройки сервера (антиспам, полиси, антивирус). Ожид

Общие вопросы по установке и настройке сервера Postfix.
Писать в этот форум могут только зарегистрированные пользователи.

Модераторы: prefer, alexandrnew, ALex_hha, Roman, Axel

Ответить
sirmax
Новичок
Новичок
Сообщения: 10
Зарегистрирован: 15 ноя 2007, 13:06
Откуда: Kharkov, Ukraine

Пример настройки сервера (антиспам, полиси, антивирус). Ожид

Сообщение sirmax » 26 сен 2008, 15:18

Тут я приведу пример настройки своего почтового сервера, очень хотелось бы услышать критику Гуру.

Заранее спасибо.
После критики возможно информация будет кому-то полезна...


В качестве OC для сервера использую gentoo linux, потому все написанное будет относиться именно к этому дистрибутиву.
Часть патчей уже интегрирована (в виде USE-flags) потому при установке на других системах могу быть тонкости.

Предпологается, что у нас УЖЕ есть рабочяя система, с IP (в моем случае - это 193.xx.xx.xx) и открытым в мир 25-м портом.

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

Код: Выделить всё

#На этапе отладки - что бы не терять почту 
soft_bounce = yes

myhostname = mail.domain.com.ua
mydomain = mail.domain.com.ua

# на каких интерфейсах "слушать"
# в моем случае файрволлом будут закрыты все кроме одного IP  потому особого значения что
# постификс висит как на локальном так и на внешнем ip  значения не имеет
inet_interfaces = all

# список "доверенных" сетей. Хотя  спаммеры (вирусы) могут быть везде, потому я для них делаю проверки, но - отличные от проверок "снаружи"

mynetworks = 192.168.0.0/16,127.0.0.0/8,172.16.0.0/12,193.xx.xx.xx/yy 

# Локальные алиасы. Мне они нужны были для организации почтовых рассылок.
alias_maps = hash:/etc/aliases

# сюда у меня монтируется отдельный софтверный рейд (md) (зеркало) что теоретически должно обеспечить достаточную надежность. 
mail_spool_directory = /var/spool/mail

# header_checks 
# Думаю, здесь можно попробовать вырезать "несекюрые" заголовки, 
# например заменить IP  отправителя на 127.0.0.1  если он из моей сети.
# Как это сделать и нужно ли - 
# размышляю.

#  преходим к наиболее интересной части
#  передавать почту на фильтр scan
content_filter = scan:127.0.0.1:10026

strict_rfc821_envelopes = yes
disable_vrfy_command = yes

smtpd_helo_required = yes
smtpd_reject_unlisted_sender = yes
smtpd_reject_unlisted_recipient = yes


# создаем 2 класса, один "от постмастера" (для того что бы те сервера которые пробуют делать верефикацию адреса отправителя не натыкались на грейлистер), второй - "все остальные"
# Вероятно, демон полисинга _может_ иметь собственные механизмы вайтлистинга, однако мне кажется что это решение более универсально и 
# будет работать с любым полисером

smtpd_restriction_classes = from_postmaster,other

smtpd_recipient_restrictions =  check_sender_access regexp:/etc/postfix/address_verify_access.txt,reject_non_fqdn_recipient,reject_unauth_destination

from_postmaster = reject_non_fqdn_recipient, reject_unauth_destination

#
other = check_policy_service inet:127.0.0.1:10032,
		permit_mynetworks,
		check_policy_service inet:127.0.0.1:10031,
		reject_non_fqdn_recipient,
		check_client_access hash:/etc/postfix/pop-before-smtp,
		reject_unauth_destination

# Немного подробнее остановлюсь на проверке "other".
# Возможно, я недочитал документацию по policyd (поправьте), но я не увидел способа отключить ТОЛЬКО   greylisting  для $mynetworks
# потому я запускаю 2 экземпляра полисера, один - на 10032 который делает все проверки кроме грейлистинга, второй на порту 10031 который делает только грейлистинг
# буду благодарен за возможные подсказки.



# отбивать часть спама на этапе HELO/EHLO
# насколько я знаю, так делать НЕ рекомендуют (нарушение RFC)  потому использовать или нет этот прием - на
# совести каждого админа
# В моем домене за 3дня было отбито примерно 10 000 писем, и жалоб на то что какаие-то письма не пришли не было

smtpd_helo_restrictions =
					permit_mynetworks, # не проверять для своих сетей
					check_client_access hash:/etc/postfix/pop-before-smtp, # не проверять для тех кто уже авторизован по POP3
					check_sender_access btree:/etc/postfix/map_sender_access, # комментарий ниже
					check_helo_access btree:/etc/postfix/map_helo_access, # комментарий ниже
					check_helo_access regexp:/etc/postfix/map_dsl_stoplist.txt, # комментарий ниже
					reject_invalid_helo_hostname, # Reject the request when the HELO or EHLO hostname syntax is invalid. 
					reject_non_fqdn_helo_hostname, # Reject the request when the HELO or EHLO hostname is not in fully-qualified domain form, as required by the RFC. 
					reject_unknown_helo_hostname #Reject the request when the HELO or EHLO hostname has no DNS A or MX record. 
# по последним 3 параметрам думаю, все понятно и не требует комментариев
# по check_sender_access,check_helo_access, check_helo_access -  прокомментирую
# 
# check_sender_access btree:/etc/postfix/map_sender_access
#
# Здесь домены для которых не нужно делать проверки helo   (или отбивать почту с некоторых доменов сразу)
#map_sender_access:
# domainl.com:		PERMIT
# domain.ro:	PERMIT
# domain.ua:	   PERMIT
# domain.net:   PERMIT


# check_helo_access btree:/etc/postfix/map_helo_access
# Логика такая - сходу отбивать те домены которые представляются "мной" 
# одним из моих доменов. Такого в нормальной ситуации быть не должно
# Кстати, возможно ли сюда прикрутить transport_maps?
# map_helo_access:
# 193.xx.xx.xx:					 REJECT
# domain.com.ua:				  REJECT
# mail.domain.com.ua:				  REJECT

# 
# check_helo_access regexp:/etc/postfix/map_dsl_stoplist.txt
#
# /([0-9]{1,3}(\.|-)){3}[0-9]{1,3}/i REJECT 553 AUTO_IP1 Possible spam. Please call  +380 67 xxx xx xx
# /([0-9]*-){3}[0-9]*(\..*){2,}/i REJECT 553 AUTO_IP2 Possible spam. Please call  +380 67 xxx xx xx 
# /([0-9]*\.){4}(.*\.){3,}.*/i REJECT 553 AUTO_IP3 Possible spam. Please call  +380 67 xxx xx xx 
# /dsl/ 553 AUTO_DSL Possible spam. Please call +380 67 xxx xx xx
# /client/ 553 AUTO_CLIENT Possible spam. Please call  +380 xxx xx xx
# /cable/ 553 AUTO_CABLE Possible spam. Please call  +380 67 xxx xx xx
# /pool/ 553 AUTO_POOL Possible spam. Please call +380 67 xxx xx xx
# /dial/ 553 AUTO_DIAL Possible spam. Please call  +380 67  xxx xx xx
# /ppp/ 553 AUTO_PPP Possible spam. Please call  +380 67 xxx xx xx
# /dhcp/ 553 AUTO_DHCP Possible spam. Please call +380 67 xxx xx xx
# /dynamic/ 553 AUTO_DYNAMIC Possible spam. Please call +380 67 xxx xx xx
# Отмечу, что регулярные выражения писал не я по большей части, взято с  postfix.ru
#
#
#
#
#  транспорты для доменов
transport_maps=mysql:/etc/postfix/sql/transport_maps.cfg
# Останавливаться на mysql: ...   смысла особого вероятно нет, в интернете куча мануалов. Коротко - в  файле xxx_maps.cfg содержиться запрос как получить из mysql  данные о параметрах

# Почтовые ящики
virtual_mailbox_maps=mysql:/etc/postfix/sql/virtual_mailbox_maps.cfg
virtual_mailbox_domains=mysql:/etc/postfix/sql/virtual_mailbox_domains.cfg

# алиасы (как на локальные так и на удаленные адреса)
virtual_alias_maps=mysql:/etc/postfix/sql/virtual_alias_maps.cfg
virtual_uid_maps=mysql:/etc/postfix/sql/virtual_uid_maps.cfg
virtual_gid_maps=static:12
virtual_mailbox_base = /

# postfix VDA patch (quotas) (описание на сайте vdа - http://vda.sourceforge.net/ )
#
virtual_mailbox_limit = 100000000
virtual_mailbox_limit_maps = mysql:/etc/postfix/sql/virtual_mailbox_limit_maps.cfg
virtual_mailbox_limit_override = yes
virtual_maildir_extended = yes
virtual_create_maildirsize = yes
virtual_overquota_bounce = yes
virtual_maildir_limit_message="Sorry, the user's maildir has overdrawn his diskspace quota, please try again later"


Переходим к файлу main.cf

Код: Выделить всё

# For injecting mail back into postfix from the filter (and filter by spamassasin)
127.0.0.1:10027 inet  n -	   n	   -	   16	  smtpd
	-o content_filter=spam:dummy
	-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
	-o smtpd_helo_restrictions=
	-o smtpd_client_restrictions=
	-o smtpd_sender_restrictions=
	-o smtpd_recipient_restrictions=permit_mynetworks,reject
	-o mynetworks_style=host
	-o smtpd_authorized_xforward_hosts=127.0.0.0/8





#submission inet n	   -	   n	   -	   -	   smtpd
#  -o smtpd_enforce_tls=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#smtps	 inet  n	   -	   n	   -	   -	   smtpd
#  -o smtpd_tls_wrappermode=yes
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#628	  inet  n	   -	   n	   -	   -	   qmqpd
pickup	fifo  n	   -	   n	   60	  1	   pickup
	-o content_filter=
	-o receive_override_options=
cleanup   unix  n	   -	   n	   -	   0	   cleanup
qmgr	  fifo  n	   -	   n	   300	 1	   qmgr
#qmgr	 fifo  n	   -	   n	   300	 1	   oqmgr
tlsmgr	unix  -	   -	   n	   1000?   1	   tlsmgr
rewrite   unix  -	   -	   n	   -	   -	   trivial-rewrite
bounce	unix  -	   -	   n	   -	   0	   bounce
defer	 unix  -	   -	   n	   -	   0	   bounce
trace	 unix  -	   -	   n	   -	   0	   bounce
verify	unix  -	   -	   n	   -	   1	   verify
flush	 unix  n	   -	   n	   1000?   0	   flush
proxymap  unix  -	   -	   n	   -	   -	   proxymap
smtp	  unix  -	   -	   n	   -	   -	   smtp
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
relay	 unix  -	   -	   n	   -	   -	   smtp
		-o fallback_relay=
#	   -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq	 unix  n	   -	   n	   -	   -	   showq
error	 unix  -	   -	   n	   -	   -	   error
retry	 unix  -	   -	   n	   -	   -	   error
discard   unix  -	   -	   n	   -	   -	   discard
local	 unix  -	   n	   n	   -	   -	   local
virtual   unix  -	   n	   n	   -	   -	   virtual
lmtp	  unix  -	   -	   n	   -	   -	   lmtp
anvil	 unix  -	   -	   n	   -	   1	   anvil
scache	unix  -	   -	   n	   -	   1	   scache

# ClamAV
scan	  unix  -	   -	   n	   -	   16	  smtp
		-o smtp_send_xforward_command=yes


# SpamAssassin Filter
spam	unix  -	   n	  n	  -	   -	   pipe
	flags=R user=mail argv=/usr/bin/spamc -u ${recipient} -e /usr/sbin/sendmail -f  ${sender} -- ${recipient}
Логика работы такая:
(подробности тут http://www.postfix.org/FILTER_README.html)"

Почта попадает в постфикс или через smtpd или через pickup , помещаеется в очередь, потом в подвергается фильтрации описаной в content_filter и снова возвращается (или не возвращается, если фильтр ее не возвращает) в очередь.

В моем случае почта ПОСЛЕ провеки предварительных условий и полисинга, будет передаваться на

Код: Выделить всё

content_filter = scan:127.0.0.1:10026
где у меня запущен clamsmtpd

Код: Выделить всё

# netstat  -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address		   Foreign Address		 State	   PID/Program name
...
tcp		0	  0 127.0.0.1:10026		 0.0.0.0:*			   LISTEN	  22775/clamsmtpd
...
... который после проверки вернет почту на

Код: Выделить всё

OutAddress: 127.0.0.1:10027
Где запущен еще один экземпляр постфикса

Код: Выделить всё

# netstat  -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address		   Foreign Address		 State	   PID/Program name
...
tcp		0	  0 127.0.0.1:10027		 0.0.0.0:*			   LISTEN	  22648/master
...
c особысм параметрами (из master.cf)

Код: Выделить всё

# For injecting mail back into postfix from the filter 
127.0.0.1:10027 inet  n -	   n	   -	   16	  smtpd
	-o content_filter=spam:dummy
	-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
	-o smtpd_helo_restrictions=
	-o smtpd_client_restrictions=
	-o smtpd_sender_restrictions=
	-o smtpd_recipient_restrictions=permit_mynetworks,reject
	-o mynetworks_style=host
	-o smtpd_authorized_xforward_hosts=127.0.0.0/8

... который приймет письмо и передаст его для настройки контент-фильтру spam (уже - через | ) (кто может уточнить этот момент? Как можно подолбнее...)
фильтр с именем spam описан в том же master.cf

Код: Выделить всё

spam	unix  -	   n	  n	  -	   -	   pipe
	flags=R user=mail argv=/usr/bin/spamc -u ${recipient} -e /usr/sbin/sendmail -f  ${sender} -- ${recipient}
... который после проверки вернет фильтр в очередь (минуя smptd) используя /usr/sbin/sendmail

...

На этом месте насколько я могу судить, мы получаем рабочий почтовый сервер который будет доставлять почту в mailbox или Maildir в зависимости от того что указано в соответсвующем поле таблицы.

Возникает вопрос - почему не использовать spampd - ответ - потому что в этом случае не работают фильтры отдельные для каждого пользователя (с настройкой из squirrel )




Очень хотелось бы услышать от уважаемых ГУРУ критику.
Заранее спасибо.


PS
Назначение сервера - почтовый сервер небольшого ISP

Mihasya
Член клуба
Член клуба
Сообщения: 182
Зарегистрирован: 23 окт 2008, 03:58

Re: Пример настройки сервера (антиспам, полиси, антивирус).

Сообщение Mihasya » 09 ноя 2008, 17:28

Я не гуру, просто заинересовало вот это:

other = check_policy_service inet:127.0.0.1:10032,
permit_mynetworks,
check_policy_service inet:127.0.0.1:10031,
reject_non_fqdn_recipient,
check_client_access hash:/etc/postfix/pop-before-smtp,
reject_unauth_destination

В чем фишка?

ЗАЧЕМ ЦИТИРОВАТЬ ВЕСЬ ТЕКСТ?!!!

sirmax
Новичок
Новичок
Сообщения: 10
Зарегистрирован: 15 ноя 2007, 13:06
Откуда: Kharkov, Ukraine

Сообщение sirmax » 10 ноя 2008, 13:44

не гуру, просто заинересовало вот это:

other = check_policy_service inet:127.0.0.1:10032,
permit_mynetworks,
check_policy_service inet:127.0.0.1:10031,
reject_non_fqdn_recipient,
check_client_access hash:/etc/postfix/pop-before-smtp,
reject_unauth_destination
Разные настройки полисера на разных портах, грейлистинг только дня НЕ permit_mynetworks,
Если пушки в цене - значит дело к войне.
Кто не хочет платить, тот заплатит вдвойне!

Mihasya
Член клуба
Член клуба
Сообщения: 182
Зарегистрирован: 23 окт 2008, 03:58

Сообщение Mihasya » 10 ноя 2008, 14:36

sirmax писал(а):
не гуру, просто заинересовало вот это:

other = check_policy_service inet:127.0.0.1:10032,
permit_mynetworks,
check_policy_service inet:127.0.0.1:10031,
reject_non_fqdn_recipient,
check_client_access hash:/etc/postfix/pop-before-smtp,
reject_unauth_destination
Разные настройки полисера на разных портах, грейлистинг только дня НЕ permit_mynetworks,
А кто эти порты "слушает"?

ALex_hha
Moderator
Moderator
Сообщения: 2347
Зарегистрирован: 09 ноя 2006, 13:08
Откуда: Украина. Харьков.

Сообщение ALex_hha » 10 ноя 2008, 17:33

грейлистинг только дня НЕ permit_mynetworks,
глупо, грейлистить надо избирательно, например при Softfail SPF или отсутствии ptr записи.
(уже - через | ) (кто может уточнить этот момент? Как можно подолбнее...)
это называется pipe
mynetworks = 192.168.0.0/16,127.0.0.0/8,172.16.0.0/12,193.xx.xx.xx/yy
лучше так не делать, оставь только 127.0.0.0/8, для остальных обязательная аутентификация
myhostname = mail.domain.com.ua
mydomain = mail.domain.com.ua
надо быть осторожнее с mydestination
transport_maps=mysql:/etc/postfix/sql/transport_maps.cfg
Я бы посоветовал использовать сервис proxymap во избежании блокировок

Не понял смысл класса from_postmaster. Он нигде не используется.
для того что бы те сервера которые пробуют делать верефикацию адреса отправителя не натыкались на грейлистер)
а как ты отличишь попытку проверки адреса, от обычного письма?

Ответить