Шахтинская Linux User Group. Поддержка пользователей Linux и Unix. Обмен дистрибутивами.

Модераторы: ShurShun, Vitas

Ответить
Аватара пользователя
TOSHIK
Не в сети
Администратор
Администратор
Сообщения: 6596
Зарегистрирован: Пт авг 08, 2003 13:49
Откуда: Ростов-на-Дону
Контактная информация:

Документация :: Безопасная почтовая система на базе Postfix

Сообщение TOSHIK »

Безопасная почтовая система на базе Postfix, PostgreSQL, с фильтрацией вирусов и спама на FreeBSD 5.3


Введение.

На данный момент в сети и бумажных изданиях все больше и больше появляется информации о установке почтовых систем на основе postfix.
Вариантов достаточно много, начиная от обычной установки и заканчивая информацией о сборке системы достаточной для крупных почтовых шлюзов. Есть варианты позволяющие хранить всю информацию о пользователях в БД: MySQL или PostgreSQL, варианты с SMTP авторизацией пользователя, варианты использования для защиты соединения TLS, и прочее. Если поискать, в сети можно найти подобное how-to на основе MySQL, но нигде пока не удалось найти информацию по установке подобной связки на базе PgSQL. С целью восполнить данный пробел и была написана эта статья.
Необходимые пакеты

* PostgreSQL
* Postfix
* Cyrus-SASL2
* sudo
* ClamAV
* ClamSMTP
* SpamAssassin
* courier-imap
* squirrelmail

Приступаем к установке
PostgreSQL


(http://www.postgresql.org/)
Общая информация

PostgreSQL – объектно-реляционная СУБД базирующаяся на POSTGRES, разработанная в департаменте Беркли, Калифорнийского Университета. В POSTGRES они первыми внедрили много концепций, которые стали доступными в некоторых коммерческих базах данный намного позже.

PostgreSQL – открытый потомок оригинального кода Беркли. Поддерживает стандарты SQL92, SQL99 и предлагает несколько новых возможностей: комплексные запросы, внешние ключи, триггеры, представления, транзакции и прочее.

Для более подробной информации, рекомендую посетить официальный сайт.
Установка и конфигурирование

Собираем PgSQL из портов

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

# cd /usr/ports/databases/postgresql80-server/

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

# make install clean
После благополучной установки инициализируем служебную директорию PgSQL

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

# /usr/local/etc/rc.d/010.pgsql.sh initdb
Запускаем PgSQL

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

# /usr/local/etc/rc.d/010.pgsql.sh start
И проверяем что PgSQL работает нормально, выполнив простой SQL запрос:

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

# sudo -u pgsql psql template1
Welcome	to psql 8.0.1, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
      \h for help with SQL commands
      \? for help with psql commands
      \g or terminate with semicolon to execute query
      \q to quit

template1=# select * from pg_language;

lanname   | lanispl | lanpltrusted | lanplcallfoid | lanvalidator |   lanacl
----------+---------+--------------+---------------+--------------+------------
internal  | f       | f            |             0 |         2246 | 
c         | f       | f            |             0 |         2247 | 
sql       | f       | t            |             0 |         2248 | {=U/pgsql}

(3 rows)


template1=#\q
Создаем пользователя базы данных postfix и задаем пароль для доступа к базе

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

# sudo -u pgsql createuser --no-adduser --no-createdb postfix

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

# echo "alter user postfix with password 'password';" | sudo -u pgsql psql template1
Создаем саму почтовую базу данных

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

sudo -u pgsql createdb mail
Создаем таблицы для почты и даем пользователю postfix права на выборку данных из базы

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

# sudo -u pgsql psql mail

 CREATE TABLE users (
        login    text not null primary key,
        password text not null,
        maildir  text not null,
        expired  int not null default '0',
        comment  text
 );

 CREATE TABLE aliases (
	alias text not null primary key,
	rcpt text not null,
	comment text
 );

 CREATE TABLE transport (
	domain text not	null primary key,
	transport text not null,
	comment text
 );

 grant select on users to postfix;
 grant select on aliases to postfix;
 grant select on transport to postfix;

Сделаем несколько записей

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

INSERT INTO transport VALUES ('domain.ru', 'virtual:', 'VIRTUAL TRANSPORT');

INSERT INTO 
 users 
VALUES 
 ('[email protected]', 'Pasw0Rd', 'domain.ru/you/', '0', 'General mail');

INSERT INTO aliases VALUES('[email protected]', '[email protected]');
INSERT INTO aliases VALUES('[email protected]', '[email protected]');
INSERT INTO aliases VALUES('[email protected]', '[email protected]');
INSERT INTO aliases VALUES('[email protected]', '[email protected]');
INSERT INTO aliases VALUES('[email protected]', '[email protected]');
INSERT INTO aliases VALUES('[email protected]', '[email protected]');
INSERT INTO aliases VALUES('[email protected]', '[email protected]');
INSERT INTO aliases VALUES('[email protected]', '[email protected]');
INSERT INTO aliases VALUES('[email protected]', '[email protected]');
INSERT INTO aliases VALUES('[email protected]', '[email protected]');
Этим мы объявляем domain.ru виртуальным, создаем пользователя [email protected] и описываем служебные алиасы (см /etc/mail/aliases) с перенаправлением всей почты на [email protected]. Важно не забывать финальный слеш при вставке значения в поле maildir таблицы users, в противном случае postfix будет производить доставку почты не в maildir, а mailbox.

Если есть желание усилить безопасность, то правим файл /usr/local/pgsql/data/pg_hba.conf и меняем значения trust на md5

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

local	all	all			md5
host	all	all	127.0.0.1/32	md5
Этим мы меняем тип авторизации с доверенной (вход без пароля) на md5 (вход с паролем используя md5 шифрование).

Перезапускаем postfix и проверяем

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

# sudo -u postfix psql mail
Password:
Welcome	to psql 8.0.1, the PostgreSQL interactive terminal.

Type:	\copyright for distribution terms
	\h for help with SQL commands
	\? for help with psql commands      
	\g or terminate	with semicolon to execute query
	\q to quit

mail=> \d

List of relations
Schema	|   Name    | Type  | Owner 
--------+-----------+-------+-------
public	| aliases   | table | pgsql
public	| transport | table | pgsql
public	| users     | table | pgsql

(3 rows)

mail=> SELECT * FROM aliases;
...

mail=> SELECT * FROM transport;
...

mail=> SELECT * FROM users;
...

mail=> \q
На этом с минимально необходимой настройкой PgSQL мы закончили.

Cyrus-SASL2

(http://asg.web.cmu.edu/sasl/)
Общая информация

SASL (Simple Authentication and Security Layer) определяет общий метод добавления поддержки аутентификации к протоколам, ориентированным на соединение (POP3, IMAP4, SMTP, FTP, telnet, ACAP, LDAPv3). Для этого протокол включает в себя команды для идентификации и подтверждения подлинности пользователя и для опционального договора выбора метода защиты последующих взаимодействий.

Установка и конфигурирование

Собираем SASL2 из портов

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

# cd /usr/ports/security/cyrus-sasl2

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

# vi Makefile
Находим строку

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

CONFIGURE_ARGS+=--with-pgsql=${LOCALBASE}
И меняем ее на

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

CONFIGURE_ARGS+=--with-pgsql=/usr/local/lib/postgresql
Если не планируем использовать saslauthd, то можно закомментировать строку

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

--with-saslauthd=${SASLAUTHD_RUNPATH}
Собираем и устанавливаем

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

# make WITH_PGSQL=yes install clean
Создаем файл /usr/local/lib/sasl2/smtpd.conf следующего содержания:

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

	pwcheck_method: auxprop
	auxprop_plugin: sql
	sql_engine: pgsql
	sql_user: postfix
	sql_passwd: password
	sql_hostnames: 127.0.0.1
	sql_database: mail
	sql_select: select password from users where login='%u@%r'
	sql_verbose: yes
После окончания тестирования рекомендую изменить sql_verbose: yes на sql_verbose: no

На этом с Cyrus-SASL2 мы закончили.

Postfix

http://www.postfix.org/)
Общая информация

Что такое postfix? Postfix – это полноценная почтовая система, предназначенная для замены sendmail-а. В отличии от него, представляющего из себя единую программу, postfix является набором нескольких небольших программ, каждая из которых выполняет только свою задачу. В этом postfix ближе к QMail, но в отличие от последнего, postfix не занимается постоянным порождением/убиванием процессов, а держит в памяти несколько основных резидентов, что позволяет экономить ресурсы системы, расходуемые на порождение процессов. Для более детального знакомства со структурой и принципами работы postfix, рекомендую посетить официальный сайт разработчиков программы.
Установка и конфигурирование

Итак, приступаем к сборке самого виновника торжества.

Скачиваем дистрибутив Postfix (на данный момент это postfix-2.2.1)

Распаковываем его

Создаем пользователя в системе postfix группу postdrop

Правим /etc/rc.conf для отключения автоматического старта sendmail (sendmail_enable=”NO”)

Переходим в директорию с распакованным postfix-ом и собираем его с поддержкой TLS, SASL и PgSQL

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

	# gmake tidy 
	# gmake makefiles CCARGS="-DUSE_TLS -I/usr/local/include \
		-DUSE_SASL_AUTH -I/usr/local/include/sasl \
		-DHAS_PGSQL -I/usr/local/include" \
		AUXLIBS="-L/usr/local/lib \
		-lssl -lcrypto -L/usr/local/lib	\
		-lsasl2	-L/usr/local/lib/postgresql -lpq"
	# gmake
	# gmake install

В процессе установки можно принимать значения по умолчанию, в этом случае конфигурационные файлы будут установлены в директорию /etc/postfix. Если Вы впервые устанавливаете postfix, то возможно следует указать куда ставить файлы readme и html – по умолчанию они не устанавливаются.

Для автоматического старта postfix-a при старте системы создадим скрипт /usr/local/etc/rc.d/postfix.sh следующего содержания:

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

	#!/bin/sh

	case "$1" in
		start) 	
			echo "Starting POSTFIX..."
	 		/usr/sbin/postfix start
	 		;;
		stop)
			echo "Stopping POSTFIX..."
			/usr/sbin/postfix stop
			;;
		restart)
			echo "Restarting POSTFIX..."
			/usr/sbin/postfix stop
			sleep 1;
			/usr/sbin/postfix start
			;;
		reload)
			echo "Restarting POSTFIX..."
			/usr/sbin/postfix reload
			;;
		*)
			echo "usage [start] [stop] [restart] [reload]"
			;;
		esac
	exit 0

Следующим шагом требуется объяснить postfix каким образом он будет общаться с БД.

Создаем папку /etc/postfix/sql В ней создаем файлы следующего содержания:

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

==> aliases.pgsql <==
user = postfix
password = password
dbname = mail
table = aliases
select_field = rcpt
where_field = alias
hosts = localhost

==> gids.pgsql <==
user	= postfix
password = password
dbname = mail
table = users
select_field = 6
where_field = login
additional_conditions = and expired = '0'
hosts = localhost

==> transport.pgsql <==
user = postfix
password = password
dbname = mail
table = transport
select_field = transport
where_field = domain
hosts = localhost

==> uids.pgsql <==
user = postfix
password = password
dbname = mail
table = users
select_field = <postfix UID>
where_field = login
additional_conditions = and expired = '0'
hosts = localhost

==> users.pgsql <==
user	= postfix
password = password
dbname = mail
table = users
select_field = maildir
where_field = login
additional_conditions = and expired = '0'
hosts = localhost

Создаем директорию где postfix будет хранить maildir-ы виртуальных пользователей:

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

	# mkdir /var/mail/virtual
	# chown	postfix:mail /var/mail/virtual
	# chmod	775 /var/mail/virtual
Произведем минимальную настройку postfix в файле /etc/postfix/main.cf, а именно как минимум установим значения следующих переменных

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

	mail_owner = postfix
	default_privs = nobody
	myhostname = domain.ru
	mydomain = domain.ru
	myorigin = $mydomain
	mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
	mynetworks_style = host
	mynetworks = 127.0.0.0/8
	relay_domains = $mydestination
Добавим следующие строки в конец файла

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

	smtpd_recipient_restrictions =
		permit_sasl_authenticated,
		permit_mynetworks,
		reject_unauth_destination,
		reject_non_fqdn_recipient,
		reject_rbl_client list.dsbl.org,
		reject_rbl_client relays.ordb.org,
		reject_rbl_client dynablock.wirehub.net,
		reject_rbl_client blackholes.wirehub.net,   
		reject_rbl_client dnsbl.njabl.org,
		reject_rbl_client dialups.mail-abuse.org,
		reject_rbl_client dul.ru

	transport_maps = pgsql:/etc/postfix/sql/transport.pgsql
	virtual_mailbox_base = /var/mail/virtual
	virtual_mailbox_maps = pgsql:/etc/postfix/sql/users.pgsql
	virtual_alias_maps = pgsql:/etc/postfix/sql/aliases.pgsql
	virtual_uid_maps = pgsql:/etc/postfix/sql/uids.pgsql
	virtual_gid_maps = pgsql:/etc/postfix/sql/gids.pgsql
	relay_domains = $transport_maps
	local_recipient_maps = $virtual_mailbox_maps $virtual_maps $transport_maps

	smtpd_sasl_auth_enable = yes
	smtp_sasl_security_options = noanonymous
	broken_sasl_auth_clients = yes      
	smtpd_sasl_local_domain	= 
За объяснением значений используемых здесь параметров рекомендую посмотреть документацию на официальном сайте.

Тестирование

Теперь попробуем с этим всем взлететь.

# postfix check
Если команда выполнилась без каких либо сообщений – значит все нормально и можно делать
# postfix start

Смотрим /var/log/maillog на предмет каких либо ошибок. Если все прошло нормально, пробуем отправить себе почту, telnet или mail – кому как удобней. После отправки снова смотрим в логи, должна быть примерно такая запись

postfix/virtual[65791]: 33AD467846: to=<[email protected]>, orig_to=<[email protected]>, relay=virtual, delay=0, status=sent (delivered to maildir)

Ключевыми словами здесь являются «status=sent (delivered to maildir)», что обозначает успешную доставку почты postfix-ом отправленного письма в maildir пользователя.

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

postfix/smtpd[14512]: NOQUEUE: reject: RCPT from new.domain.ru[x.x.x.x]: 554 <[email protected]>: Relay access denied; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<user.new.domain.ru>

Если появилась запись подобно приведенной выше – значит все нормально, наш postfix не собирается выступать в роли open relay и позволять пересылать через себя почту для других доменов.

Осталось проверить что SASL авторизация у нас работает нормально, и авторизованному пользователю позволено писать куда угодно. Для этого включаем в настройках почтовой программы SMTP авторизацию и пробуем отправить это же письмо еще раз.

postfix/smtpd[69747]: 7F83667845: client=user.new.domain.ru[x.x.x.x], sasl_method=CRAM-MD5, sasl_username=[email protected]

...

postfix/smtp[69758]: 7F83667845: to=<[email protected]>, relay=otherrelay[x.x.x.x], delay=2, status=sent (250 Ok: queued as 25657164825)

Если присутствуют строки типа «sasl_method=<метод>, sasl_username=[email protected]», значит все нормально и postfix+sasl функционируют нормально.

Шифруем дальше

На этом можно было бы и остановиться, если бы не одно «но»: при стандартной SMTP авторизации, пароль пользователя передается в открытом виде или в слабо защищенном, и при наличии злоумышленника в одном с вами сегменте сети (да и не только), может быть перехвачен и расшифрован. И хотя этот пароль не имеет никакого отношения к паролю пользователя в системе (если таковой там присутствует), кому понравится, что кто-то имеет возможность читать его почту? Что бы избежать этого неприятного факта, воспользуемся дополнительными средствами, которые может предоставить нам postfix, а именно – TLS (Transport Layer Security protocol)

TLS

Общая информация

Данный вопрос достаточно подробно раскрыт в статье Семёнова Ю.А. (ГНЦ ИТЭФ), http://citforum.ru/nets/semenov/6/tls.shtml

Настройка

Для начала нам необходимо создать свой собственный сертификат сервера. Для этого воспользуемся несколько модифицированным скриптом из поставки Cyrus-IMAP

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

# vi /etc/ssl/mkcert.sh

#!/bin/sh

test -x /usr/bin/openssl || exit 0
prefix="/"

if test -f /etc/ssl/server.pem then
 echo "/etc/ssl/server.pem already exists."
 exit 1
fi

cp /dev/null /etc/ssl/server.pem
chmod 600 /etc/ssl/server.pem
chown root /etc/ssl/server.pem

cleanup() {
 rm -f /etc/ssl/server.pem
 rm -f /etc/ssl/server.rand
 exit 1
}

dd if=/dev/urandom of=/etc/ssl/server.rand count=1 2>/dev/null
/usr/bin/openssl req -new -x509 -days 3650 -nodes -config /etc/ssl/openssl.cnf \
 -out /etc/ssl/server.pem -keyout /etc/ssl/server.pem
/usr/bin/openssl gendh -rand /etc/ssl/server.rand 512 \
 >>/etc/ssl/server.pem || cleanup
/usr/bin/openssl x509 -subject -dates -fingerprint \
 -noout -in /etc/ssl/server.pem || cleanup
rm -f /etc/ssl/server.rand
При помощи этого скрипта, мы создаем в директории /etc/ssl самоподписанный сертификат нашего сервера – server.pem. В процессе создания будет необходимо указать некоторые значения, названия достаточно понятные и я думаю проблем не должно возникнуть. Главное в поле
Common Name (eg, YOUR name) [mail.domain.ru]:
указать FQDN вашего почтового сервера, в данном примере: mail.domain.ru. Если имя сервера для отправки/приема почты в настройках почтовой программы не совпадает с указанным в сертификате – почтовая программа будет «ругаться».

Теперь редактируем файл /etc/postfix/main.cf, а именно – добавляем следующие строки:

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

	smtp_use_tls = yes
	smtp_tls_key_file = /etc/ssl/server.pem
	smtp_tls_cert_file = $smtp_tls_key_file
	smtp_tls_CAfile = $smtp_tls_key_file
	smtp_tls_note_starttls_offer = yes
	smtp_tls_loglevel = 0
	smtpd_tls_auth_only = yes
	smtpd_use_tls = yes
	smtpd_tls_loglevel = 0
	smtpd_tls_received_header = yes
	smtpd_tls_session_cache_timeout = 3600s
	tls_random_source = dev:/dev/urandom
	smtpd_tls_key_file = /etc/ssl/server.pem
	smtpd_tls_cert_file = $smtpd_tls_key_file
	smtpd_tls_CAfile = $smtpd_tls_key_file
Опция smtpd_tls_auth_only = yes позволяет производить SMTP авторизацию только в режиме TLS.

Тестирование

Для тестирования воспользуемся telnet-ом на 25 порт локальной машины. Жирным шрифтом выделен ввод с клавиатуры.

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

	# telnet localhost 25
	Trying ::1...
	Trying 127.0.0.1...
	Connected to localhost.domain.ru.
	Escape character is '^]'.
	220 new.domain.ru Mail Server
	ehlo domain.ru
	250-onix.domain.ru
	250-PIPELINING
	250-SIZE 10240000
	250-ETRN
	250-STARTTLS
	250 8BITMIME
	starttls
	220 Ready to start TLS
	quit
	quit
	Connection closed by foreign host.
Обращаем внимание на появившуюся строку 250-STARTTLS, это обозначает, что сервер готов работать с использованием протокола TLS. Это так называемое «безопасное соединение на стандартном порту». Если вы хотите использовать безопасное соединение на специальном порту, раскомментируйте строку

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

smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
в файле /etc/postfix/master.cf и перезапустите postfix.

Фильтрация входящей/исходящей почты

На этом с первичной настройкой postfix-а мы закончили. Но хотелось бы ведь еще что бы почта проверялась на вирусы и спам. Для этого нам потребуется установить и настроить дополнительные пакеты, а именно clamav (бесплатный антивирус с возможностью обновления баз через Интернет), clamsmtp (SMTP фильтр для проверки на вирусы при помощи clamav) и SpamAssassin (программа предназначенная для проверки почтовых сообщений на спам).

Начнем по порядку

ClamAV

(http://www.clamav.net/)

Общая информация

ClamAV – бесплатный антивирусный продукт, распространяемый под лицензией GPL. Его основное применение, по словам разработчиков – интеграция с почтовой системой (сканирование вложений). Однако его можно использовать и как обычный антивирусный сканер – в комплекте идет сканер файловой системы. Однако антивирус без своевременного обновления вирусных баз мало чем способен помочь. Невзирая на бесплатный статус, ClamAV имеет собственное средство обновления вирусных баз через Интернет. Из личного опыта работы с данный антивирусом, могу сказать что обновления выпускаются достаточно быстро, по скорости реакции во время появления нового вируса его превосходит разве что антивирус Касперского, но и то не намного. Этот небольшой минус на мой взгляд вполне компенсируется бесплатностью продукта и по этой причине на своих серверах и домашней машине я использую именно его. Еще один минус: он не умеет проверять архивированные вложения формата RAR v3. Это связано с расхождениями в политике лицензирования программных продуктов. На данный момент, насколько мне известно, ведутся переговоры для устранения этого разногласия.

Установка и конфигурирование

Установка вполне стандартная и не имеет никаких подводных камней.

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

	# cd /usr/ports/security/clamav
	# make install clean
На вопрос нужен ли нам milter можно отвечать «нет», поскольку для интеграции его с postfix-ом мы будем использовать другой механизм. CURL – по желанию, например я его не использую.

После установки редактируем конфигурационные файлы

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

/usr/local/etc/clamd.conf

	LogFile /var/log/clamav/clamd.log
	LogFileMaxSize 2M
	LogTime
	PidFile /var/run/clamav/clamd.pid
	TemporaryDirectory /tmp
	DatabaseDirectory /var/db/clamav
	LocalSocket /var/run/clamav/clamd
	FixStaleSocket
	MaxThreads 10
	ReadTimeout 120
	IdleTimeout 30
	MaxDirectoryRecursion 15
	FollowDirectorySymlinks
	SelfCheck 1800
	User clamav
	AllowSupplementaryGroups
	ScanPE
	ScanOLE2
	ScanMail
	ScanHTML
	ScanArchive
	ArchiveMaxFileSize 15M
	ArchiveMaxRecursion 10
	ArchiveMaxFiles	1500
	ArchiveMaxCompressionRatio 300

/usr/local/etc/freshclam.conf

	DatabaseDirectory /var/db/clamav
	UpdateLogFile /var/log/clamav/freshclam.log
	PidFile /var/run/clamav/freshclam.pid
	DatabaseOwner clamav
	AllowSupplementaryGroups
	DatabaseMirror database.clamav.net
	Checks 48
	NotifyClamd

Добавляем в /etc/rc.conf строки:

clamav_clamd_enable=”YES”
clamav_freshclam_enable=”YES”

И запускаем:

/usr/local/etc/rc.d/clamav-clamd.sh start

/usr/local/etc/rc.d/clamav-freshclam.sh start

Тестирование

Для проверки работоспособности будем использовать EICAR строку. Создаем файл virus.com со следующим содержанием:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Сохраняем его и выполняем

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

# clamscan  virus.com
virus.com: Eicar-Test-Signature FOUND

----------- SCAN SUMMARY -----------
Known viruses: 30736
Scanned	directories: 0
Scanned	files: 1
Infected files: 1
Data scanned: 0.00 MB
I/O buffer size: 131072 bytes
Time: 1.356 sec (0 m 1 s)
Если вы видите что то подобное, значит все прошло успешно и ClamAV благополучно установлен на вашем компьютере.

ClamSMTP

(http://memberwebs.com/nielsen/software/clamsmtp/)

Общая информация

ClamSMTP - фильтр SMTP, который позволяет Вам проверять почтовые сообщения используя антивирус ClamAV. По словам разработчиков, «ClamSMTP стремится быть небольшим, надежным и простым». В связи с этим он написан на С и имеет минимум конфигурационных опций. Так же по словам разработчиков, «Если Вы нуждайтесь в большем количестве вариантов тогда, Вы можете использовать что-нибудь большое, как AMaViS, который написанный на PERL и может сделать почти все.» Однако при построении системы, я отказался от использования AMaViS, поскольку для программы-посредника, на мой взгляд, он занимает слишком много памяти.
Установка и конфигурирование

Установка тоже стандартная и не вызывает каких либо вопросов.

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

# cd /usr/ports/security/clamsmtp/

# make install clean

# cp /usr/local/etc/clamsmtpd.conf-sample /usr/local/etc/clamsmtpd.conf

# vi /usr/local/etc/clamsmtpd.conf


	OutAddress: 10026
	XClient: off
	Listen: 127.0.0.1:10025
	ClamAddress: /var/run/clamav/clamd
	Header: X-Virus-Scanned: -=Onix=-
	TempDirectory: /tmp
	Bounce: off
	Quarantine: off
	TransparentProxy: off
	User: clamav
Добавляем в /etc/rc.conf строку

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

clamsmtpd_enable="YES"
И запускаем его

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

/usr/local/etc/rc.d/clamsmtpd.sh start
Для проверки можно сделать

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

# sockstat -4 | grep clamsmtpd
Должна присутствовать строка наподобие этой:

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

clamav clamsmtpd 39991 3 tcp4 127.0.0.1:10025 *:*
SpamAssassin

(http://spamassassin.apache.org/)

Общая информация

SpamAssassin – почтовый фильтр, который использует различные эвристические анализаторы заголовков почты и в основном тексте для идентификации спама. Написан на PERL (исключение составляет модуль spamd). Использует комплексный подход к проверке писем на спам, начиная от заголовков SMTP сессии (к сожалению на данный момент не умеет получать эту информацию из самой сессии, использует для этого заголовки письма) и заканчивая фильтрацией тела письма. Из плюсов: большое количество проверок увеличивает шанс отлова спама, возможность самообучения, возможность вручную переопределять веса правил, эвристический анализатор текста письма. Из минусов: из-за большого количества проверок возможны ложные срабатывание, эвристические методы в режиме самообучения могут ошибочно посчитать SPAM нормальным письмом, после чего количество правильно распознаваемого спама сильно упадет, достаточно сильно нагружает систему.

Установка и конфигурирование

Данная тема выходит за пределы обсуждения этой статьи, в связи с большим количеством документации как на официальном сайте программы, так и в русскоязычной части Интернета и бумажных изданиях.

Тестирование

Проверяем его работоспособность.

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

# echo "TEST" | spamc
	X-Spam-Checker-Version:	SpamAssassin 3.0.2 (2004-11-16) on localhost
	X-Spam-Level:
	X-Spam-Status: No, score=-1.2 required=7.5 tests=ALL_TRUSTED,MISSING_DATE,
		MISSING_SUBJECT	autolearn=failed version=3.0.2
Если вы ведете, что то подобное – значит SpamAssassin настроен нормально и вполне боеспособен.

Что бы узнать как он реагирует на спам – можете воспользоваться GTUBE тестом. Файл spam.eml можно взять здесь: http://www.deepnet.ru/files/mail/spam.eml

Дополнительная информация

Для дополнительной информации по SpamAssassin рекомендую:
Официальный сайт: http://spamassassin.apache.org/
Проект OpenNet: http://www.opennet.ru/
Поисковые системы.

Подключаем ClamSMTP к postfix

Добавляем в файл /etc/postfix/main.cf строки

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

content_filter = avscan:127.0.0.1:10025
receive_override_options = no_address_mappings
Добавляем в файл /etc/postfix/master.cf строки

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

avscan		unix	-       -       n       -       10      smtp    
  -o smtp_send_xforward_command=yes

127.0.0.1:10026	inet	n	-	n	-	10	smtpd 
  -o content_filter=spamfilter
  -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
Подключаем SpamAssassin к postfix

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

Создаем директорию /etc/postfix/scripts/

Создаем файл spam.pl

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

#!/usr/bin/perl	-w
use strict;
use Net::SMTP;
my $host = &sall_ch(shift(@ARGV), '"');
my $ehlo = &sall_ch(shift(@ARGV), '"');

my $mail_from   = &sall_ch(shift(@ARGV), '"');
my $rcpt_to     = &sall_ch(shift(@ARGV), '"');
my $spamc       = &sall_ch(shift(@ARGV), '"');

if (!defined($host)||!defined($ehlo)||!defined($mail_from)||!defined($rcpt_to)) {
  die("use $0 <host> <ehlo> <mail_from> <rcpt_to> [cmd]\n");
}

if (defined($spamc)) {
	open(CF, "$spamc |") or undef($spamc);
}

my $smtp = Net::SMTP->new($host);
$smtp->hello($ehlo);
$smtp->mail($mail_from);
$smtp->to($rcpt_to);

$smtp->data();
if (defined($spamc)) {
	while(<CF>) {
		next if (/^delivered\-to\:/i);
		$smtp->datasend($_);
	}
}
else {
	while(<>) {
		next if (/^delivered\-to\:/i);
		$smtp->datasend($_);
	}
}
$smtp->dataend();
close(CF) if defined($spamc);

$smtp->quit;
exit 0;

############################################################
sub sall_ch($$) {
	my($string, $chars) = (shift(), shift());
	return(undef) unless defined($string);
	$string =~ s/^[\Q$chars\E]+//;
	$string =~ s/[\Q$chars\E]+$//;
	return($string);
}
Добавляем в файл /etc/postfix/master.cf строки

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

spamfilter	unix	-	n	n	-	10	pipe
  flags=R
  user=filter argv=/etc/postfix/scripts/spam.pl "localhost:10027" "spamfilter" \
  "${sender}" "${recipient}" "/usr/local/bin/spamc"

localhost:10027	inet	n	-	n	-	10	smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_helo_restrictions=
  -o smtpd_client_restrictions=
  -o smtpd_sender_restrictions=
  -o mynetworks=127.0.0.0/8
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o myhostname=localhost

Установка pop3 и imap сервера

Однако одной отправкой писем достаточно сложно обойтись в электронной почте – почту еще бы хотелось и принимать. Для этого воспользуемся пакетом Courier-IMAP

Courier-IMAP

(http://www.courier-mta.org/imap/)

Общая информация

Courier-IMAP – сервер, предоставляющий IMAP доступ к почтовым ящикам формата Maildir. IMAP сервер не позволяет работать с традиционными почтовыми ящиками формата mailbox. Courier-IMAP включает в себя некоторые расширения к стандартному формату хранения Maildir почты, для поддержания дополнительных возможностей, таких как IMAP папки и «мягкие» квоты. Так же он способен работать со стандартными папками Maildir, правда в этом случае дополнительные возможности не доступны. И главное, он позволяет работать с виртуальными пользователями, что будет весьма полезно при построении нашей системы. Помимо IMAP сервера, он включает в себя POP3 сервер, с возможностью работы через SSL.

Установка и конфигурирование

Если у вас новые порты, то демон идентификации Courier-IMAP вынесен в отдельный порт - courier-authlib. Для начала поставим его.

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

# cd /usr/ports/mail/courier-authlib/

# make config
Выбираем опции POSTGRESQL и MERGECFGS, со всех остальных выделение снимаем.

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

# make install clean

# cd /usr/local/etc/authlib/

# vi authdaemonrc

authmodulelist="authpgsql"
authmodulelistorig="authpgsql"
daemons=5
authdaemonvar=/var/run/authdaemond
DEBUG_LOGIN=0
DEFAULTOPTIONS="wbnodsn=1"

# vi authpgsqlrc

PGSQL_HOST localhost
PGSQL_PORT 5432
PGSQL_USERNAME postfix
PGSQL_PASSWORD password
PGSQL_DATABASE mail
PGSQL_USER_TABLE users
PGSQL_CLEAR_PWFIELD password
PGSQL_UID_FIELD <POSTFIX UID>
PGSQL_GID_FIELD 6
PGSQL_LOGIN_FIELD login
PGSQL_HOME_FIELD '/var/mail/virtual'
PGSQL_MAILDIR_FIELD maildir
PGSQL_WHERE_CLAUSE expired = '0'
Добавляем строку courier_authdaemond_enable=”YES” в /etc/rc.conf и запускаем

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

/usr/local/etc/rc.d/courier-authdaemond.sh start
С демоном аутентификации закончили, устанавливаем сам Courier-IMAP.

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

# cd /usr/ports/mail/courier-imap/
# make config
Выбираем пункт OPENSSL, со всех остальных снимаем выделение.

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

# make install clean
# cd /usr/local/etc/courier-imap/
В зависимости о того, будем ли мы использовать POP3/IMAP и POP3/IMAP over SSL редактируем соответствующие файлы.

Для примера рассмотрим только настройку POP3 и POP3 over SSL серверов.

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

# cp pop3d.dist pop3d
# cp pop3d-ssl.dist pop3d-ssl

# vi pop3d
	PIDFILE=/var/run/pop3d.pid
	MAXDAEMONS=10
	MAXPERIP=2
	AUTHMODULES="authdaemon"
	POP3AUTH="LOGIN PLAIN"
	POP3AUTH_ORIG="LOGIN PLAIN"
	POP3AUTH_TLS="LOGIN PLAIN"
	POP3AUTH_TLS_ORIG="LOGIN PLAIN"
	POP3_PROXY=0
	PORT=110
	ADDRESS=0
	TCPDOPTS="-nodnslookup -noidentlookup"
	POP3DSTART=YES


# vi pop3d-ssl

	prefix=/usr/local
	exec_prefix=/usr/local
	SSLPORT=995
	SSLADDRESS=0
	SSLPIDFILE=/var/run/pop3d-ssl.pid
	POP3DSSLSTART=YES
	POP3_STARTTLS=YES
	POP3_TLS_REQUIRED=0
	COURIERTLS=/usr/local/bin/couriertls
	TLS_PROTOCOL=SSL3
	TLS_STARTTLS_PROTOCOL=TLS1
	TLS_CERTFILE=/etc/ssl/server.pem
	TLS_VERIFYPEER=NONE
	TLS_CACHEFILE=/usr/local/var/couriersslcache
	TLS_CACHESIZE=524288
	MAILDIRPATH=Maildir
IMAP настраивается по аналогии. Добавляем с /etc/rc.conf строки

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

courier_imap_pop3d_enable=”YES”
courier_imap_pop3d_ssl_enable=”YES”
И запустим сервера

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

# /usr/local/etc/rc.d/courier-imap-pop3d.sh start
# /usr/local/etc/rc.d/courier-imap-pop3d-ssl.sh start
Тестирование

Проверим, что POP3 демон и авторизация у нас работают нормально.

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

# telnet localhost 110
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.domain.ru.
Escape character is '^]'.
+OK Hello there.
user [email protected]
+OK Password required.
pass Pasw0Rd
+OK logged in.
list
+OK POP3 clients that break here, they violate STD53.
13258
.
quit
+OK Bye-bye.
Connection closed by foreign host.
Заключение

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

Владимир В. Агапов AKA -=Onix=-

[email protected]
Оригинал здесь: http://www.deepnet.ru/docs/source/postfix_pgsql.shtml
Последний раз редактировалось TOSHIK Пт авг 19, 2005 22:05, всего редактировалось 1 раз.
Активисты все еще ищутся здесь!

Аватара пользователя
TOSHIK
Не в сети
Администратор
Администратор
Сообщения: 6596
Зарегистрирован: Пт авг 08, 2003 13:49
Откуда: Ростов-на-Дону
Контактная информация:

Сообщение TOSHIK »

Надеюсь эта статья вам поможет.
Моя нынешняя схема построения почтового сервера очень похожа, но вместо PostgreSQL я использую MySQL и немного иначе фильтрую письма...
Активисты все еще ищутся здесь!

-=Onix=-
Не в сети
Случайно забежавший
Случайно забежавший
Сообщения: 1
Зарегистрирован: Вт авг 16, 2005 17:35

Re: Документация :: Безопасная почтовая система на базе Post

Сообщение -=Onix=- »

TOSHIK писал(а):Безопасная почтовая система на базе Postfix, PostgreSQL, с фильтрацией вирусов и спама на FreeBSD 5.3
Интересно, а не стоило ли хотя бы проинформировать автора статьи, прежде чем ее размещать? И было бы хорошо указать линк на оригинал статьи

Аватара пользователя
TOSHIK
Не в сети
Администратор
Администратор
Сообщения: 6596
Зарегистрирован: Пт авг 08, 2003 13:49
Откуда: Ростов-на-Дону
Контактная информация:

Сообщение TOSHIK »

-=Onix=-,
автор был указан. линк указать забыл, сорри. теперь добавил.
за статью спасибо.
Активисты все еще ищутся здесь!

Ответить