Бортовой журнал Ктулху

Почтовый сервер от .. и до .. своими руками- cyrus, postfix, fetchmail

 

 

Оригинал статьи

Наружные работы

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

apt-get install ssh

После этого подключаемся любым ssh-клиентом на 22 порт нашего серера, вводим имя и пароль администратора. Также рекомендуем установить Midnight Commander для упрощения работы с файлами и редактирования конфигурационных файлов.

apt-get install mc

Добавим остальные установочные диски в список доступных источников пакетов командой.

apt-cdrom

Выполняем эту команду для каждого диска. При желании можно воспользоваться сетевыми источниками пакетов и security updates с сайта Debian.

Для этого снова открываем и добавляем в него следующие строки

mcedit /etc/apt/sources.list:

deb http://security.debian.org/ etch/updates main contrib

deb-src http://security.debian.org/ etch/updates main contrib

Далее обновим список пакетов и саму систему.

apt-get update

apt-get upgrade

На этом все подготовительные мероприятия считаем законченными.

Postfix

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

apt-get install postfix libsasl2 libsasl2-modules sasl2-bin cyrus-imapd-2.2 cyrus-pop3d-2.2 cyrus-admin-2.2

Во время первоначальной настройки postfix укажите конфигурацию для Интернет-сайта (Internet Site). На вопрос об имени почтового сервера-оставьте вариант по-умолчанию или укажите свой. В нашем случае это было mailserver.test.ru

Настроим сервер авторизации saslauthd на использование базы данных паролей sasldb2. Для этого отредактируем файл /etc/default/saslauthd:

mcedit /etc/default/saslauthd:

START=yes
MECHANISMS="sasldb"

Запустим сервис командой:

/etc/init.d/saslauthd start

Сейчас проверим правильно ли он работает, но для начала необходимо добавить хотя бы одного пользователя.

mailserver:~# saslpasswd2 test

Password:

Again (for verification):

mailserver:~# sasldblistusers2

test@mailserver: userPassword

mailserver:~# testsaslauthd -u test -p test

Если в результате этих манипуляций вы получили сообщение

 

"0: OK "Success.", значит все в порядке и можно продолжать. Если же авторизация не прошла - смотрите файл /var/log/auth.log и повторяйте, повторяйте и ещё раз повторяйте все шаги, пока не получится нужный результат.

У почтового сервера postfix есть одна особенность - после запуска он работает в chroot окружении, которое находится в папке /var/spool/postfix/.

mailserver:~# ls -al /var/spool/postfix/

total 76

drwxr-xr-x 19 root    root     4096 Feb 12 16:27 .

drwxr-xr-x  8 root    root     4096 Feb 12 16:26 ..

drwx------  2 postfix root     4096 Feb 12 16:27 active

drwx------  2 postfix root     4096 Feb 12 16:27 bounce

drwx------  2 postfix root s    4096 Feb 12 16:27 corrupt

drwx------  2 postfix root     4096 Feb 12 16:27 defer

drwx------  2 postfix root     4096 Feb 12 16:27 deferred

drwxr-xr-x  2 root    root     4096 Feb 12 16:27 etc

drwx------  2 postfix root     4096 Feb 12 16:27 flush

drwx------  2 postfix root     4096 Feb 12 16:27 hold

drwx------  2 postfix root     4096 Feb 12 16:27 incoming

drwxr-xr-x  2 root    root     4096 Feb 12 16:27 lib

drwx-wx--T  2 postfix postdrop 4096 Feb 12 16:27 maildrop

drwxr-xr-x  2 postfix root     4096 Feb 12 16:27 pid

drwx------  2 postfix root     4096 Feb 12 16:27 private

drwx--s---  2 postfix postdrop 4096 Feb 12 16:27 public

drwx------  2 postfix root     4096 Feb 12 16:27 saved

drwx------  2 postfix root     4096 Feb 12 16:27 trace

drwxr-xr-x  3 root    root     4096 Feb 12 16:25 usr

Это сделано из соображений безопасности, однако несколько усложняет сам процесс настройки. Так как postfix общается с остальными приложениями в большинстве случаев посредством socket'ов, и выше своего chroot окружения выбраться не может, то эти сокеты приходится переносить в доступную postfix-папку.

Учитывая то, что для авторизации пользователей postfix будет использоваться демон saslauthd, нам нужно перенести его socket в рабочую директорию нашего сервера /var/spool/postfix/. Самый простой способ сделать это заключается в монтировании в нужную папку директории с уже созданным сокетом демона saslauthd.

Делается это редактированием файла /etc/fstab.

mcedit /etc/fstab:

/var/run/saslauthd    /var/spool/postfix/var/run/saslauthd    none      rw,bind    0 0

Не забудьте поставить [Enter] после последней строки. Также нужно не забыть создать папку, куда мы смонтируем сокет демона авторизации.

mkdir -p /var/spool/postfix/var/run/saslauthd

mount /var/run/saslauthd



Возникла проблема с монтированием в системе Ubuntu 10.04.

mount: can't find /var/run/saslauthd in /etc/fstab or /etc/mtab

В чем дело, точно не известно, проблема не решена. 


Сейчас сконфигурируем postfix для использования sasl авторизации.

mcedit /etc/postfix/main.cf:

smtpd_sasl_local_domain =

smtpd_sasl_auth_enable = yes

smtpd_sasl_security_options = noanonymous

broken_sasl_auth_clients = yes

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_relay_domains

smtpd_sasl_authenticated_header = yes

smtpd_sasl_application_name = smtpd

*В одном конфиге есть, в другом нет. Так что опционально, проверить, будет работать или нет.


Существует и упрощенный вариант редактирования этого файла командой postconf –e "smtpd_sasl_auth_enable = yes" и т.д.Сейчас мы запретим отсылать почту через наш SMTP шлюз без авторизации. Для этого создадим файл /etc/postfix/sasl/smtpd.conf со следующим содержимым.

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

Перезапустим наш postfix сервер и внимательно просмотрим следующие файлы на предмет ошибок:

  • /var/log/mail.err

  • /var/log/mail.info

  • /var/log/mail.warn

  • /var/log/mail.log.

/etc/init.d/postfix restart

tail /var/log/mail.err

tail /var/log/mail.info

tail /var/log/mail.warn

tail /var/log/mail.log

Если все чисто, сухо и гладко - обратимся к утитиле telnet, для того, чтобы подключиться к нашему серверу.

mailserver:~# telnet localhost 25

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

220 mailserver.test.ru ESMTP Postfix (Debian/GNU)

EHLO http://www.x-drivers.ru/

250-mailserver.test.ru

250-PIPELINING

250-SIZE 10240000

250-VRFY250-ETRN

250-STARTTLS

250-AUTH LOGIN PLAIN

250-AUTH=LOGIN PLAIN

250-ENHANCEDSTATUSCODES

250-8BITMIME250 DSNQUIT

Connection closed by foreign host.

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

Для того, чтобы "подружить" saslauthd и postfix необходимо выполнить следующее:

adduser postfix sasl

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

Cyrus-imapd

Cyrus - это мощный набор POP3/NNTP/IMAP и некоторых других демонов для создания полноценных сервисов работы с электронной почтой. Официальный сайт проекта находится здесь: http://cyrusimap.web.cmu.edu/. В нашем случае cyrus будет заниматься получением почты от postfix, раскладыванием ее по папкам и предоставлению к ней доступа пользователям. Отредактируем файл /etc/imapd.conf.

mcedit /etc/imapd.conf :

admins: cyrus

allowplaintext: yes

sasl_mech_list: PLAIN

sasl_pwcheck_method: saslauthd auxprop

sasl_auxprop_plugin: sasldb

Обратите внимание, что cyrus так же, как и saslauthd, придется взаимодействовать с postfix, поэтому их нужно сделать доступными друг другу. Воспользуемся уже известным механизмом:

mcedit /etc/fstab :

/var/run/cyrus  /var/spool/postfix/var/run/cyrus        none    rw,bind 0 0

Не забываем создать папки для cyrus.

mkdir -p /var/spool/postfix/var/run/saslauthd
mkdir -p /var/spool/postfix/var/run/cyrus
mount /var/spool/postfix/var/run/saslauthd
mount /var/spool/postfix/var/run/cyrus

И выполнить команду:

mount /var/run/cyrus

Сейчас предоставим возможность cyrus забирать почту у postfix. Отредактируем файл /etc/postfix/main.cf:

mailbox_transport = lmtp:unix:/var/run/cyrus/socket/lmtp

Добавим почтовый сервер в группу lmtp:

addgroup lmtp

adduser postfix lmtp

И выполним следующее:

dpkg-statoverride --remove /var/run/cyrus/socket

dpkg-statoverride --force --update --add cyrus lmtp 750 /var/run/cyrus/socket

Добавим еще одну опцию: ()

local_recipient_maps =

В случае с pam-авторизацией по логинам и паролям системных пользователей все бы работало без проблем. Но когда имена и пароли хранятся в формате, отличном от системного, необходимо указать данную опцию. Она означает "принимать письма для любого адресата". Это, конечно, не лучший выход, однако лучшего пока найти не удалось.Добавим пользователя cyrus в нашу базу учетных записей:

saslpasswd2 -c cyrus

Введите пароль, когда вас об этом попросят, и перезапустим наши демоны:

/etc/init.d/postfix start

/etc/init.d/cyrus2.2 restart

/etc/init.d/saslauthd restart

Если вы без ошибок сделаете все, что было описано выше, то теоретически к этому моменту уже можете принимать и отправлять письма, создавать и удалять папки на IMAP-сервере, устанавливать квоты и права доступа на папки средствами утилиты cyradm.К примеру, можно создать скрипт, который будет создавать пользователю папки Sent, Trash, Drafts, Spam средствами утилиты cyradm.Так как все дальнейшие действия по настройке в целях тестирования потребуют отсылать и принимать почту, приведем краткую инструкцию по созданию почтовых аккаунтов:

saslpasswd2 –c <имя пользователя>

cyradm –user cyrus localhost

localhost>cm user.<имя пользователя>

localhost>cm user.<имя пользователя>.INBOX

localhost>cm user.<имя пользователя>.Sent

localhost>cm user.<имя пользователя>.Draft

localhost>cm user.<имя пользователя>.Trash 

При желании, можно задать квоты на количество места в папках и другие параметры, с которыми можно познакомиться набрав "?" или "help" в утилите cyradm.

От себя рекомендую установить утилиту gyrus – графическая утилита администрирования cyrus, очень сильно облегчает процесс создания и настройки ящиков в отличие от текстовой консоли, в которой можно запутаться.



Использование доменного почтового ящика.

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

 Как забрать почту.

 Для скачивания почты используем программу fetchmail, также советую поставить fetchmailconf, графический конфигуратор фечмейла, там все достаточно просто и понятно, поэтому нет смысла описывать, методом научного тыканья за день можно настроить.

 Можно считать что фечмейл умеет забирать почту, теперь надо его заставить это делать автоматически.

 Далее.

 Я решал следующим способом:

в файле /etc/crontab прописывается приблизительно следующее:

 */1 * * * * user fetchmail -N -d0 -f /home/user/.fetchmailrc

Также можно сделать следующее:

/etc/default/fetchmail

 

START_DAEMON=yes

  

В дополнениях см. статью по настройкам crontab и fetchmail

 Отправка почты.

 

mcedit /etc/postfix/mail.cf

 указываем сервер пересылки

 

relayhost = mail.dp.ukrtel.net

Вроде и все.

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

 Авторизация на релее.

Указать в main.cf сервер в качестве релея:

relay = smtp.apex.dp.ua

 Создать файл /etc/postfix/sasl_password с правами 600 и содержимым:

smtp.trifle.net login:password

не забыть сделать # postmap /etc/postfix/sasl_password

Дописать в main.cf строки:

# говорим smtp-client-у постфикса использовать smtp-аутентификацию

smtp_sasl_auth_enable = yes

# база с логинами/паролями

smtp_sasl_password_maps = cdb:/etc/postfix/sasl_password

# отключаем использование методов, допускающих анонимную sasl-аутентификацию, одновременно разрешая использование

# plaintext-методов (т.к. дефолтное значение noplaintext, noanonymous)

smtp_sasl_security_options = noanonymous

 # указываем использовать исключительно plain-метод (особенно важно если на стороне сервиса поддерживаются только PLAIN-пароли.)

smtp_sasl_mechanism_filter = PLAIN

Мой конфиг, вернее его часть, которая отвечает за авторизацию.

 

smtpd_sasl_local_domain =

smtp_sasl_auth_enable = yes

smtp_sasl_security_options = noanonymous

broken_sasl_auth_clients = yes

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_relay_domains

smtpd_sasl_authenticated_header = yes

smtpd_sasl_application_name = smtpd

smtp_sasl_password_maps = hash:/etc/postfix/sasl_password

smtp_sasl_mechanism_filter = PLAIN

 

Обращаю внимание:

smtp_sasl_auth_enable = yes

smtp_sasl_security_options = noanonymous

и

smtp_sasl_password_maps = hash:/etc/postfix/sasl_password

smtp_sasl_mechanism_filter = PLAIN

 Изначально там стояло smtpd, из-за чего на релее не проходила авторизация.

 

Копирование всей входящей и исходящей почты на отдельный ящик.

 Для организации важно сохранение входящей и исходящей переписки, например для резервного копирования.

Postfix позволяет это реализовать различными методами.

 http://www.mdex.nnov.ru/page/kontrol-perepiski-postfix.html#cut

Контроль переписки в Postfix («большой брат» следит за тобой)

Задача - требуется контролировать переписку определенных сотрудников (официальная версия - создать backup почтовой переписки с возможностью последующего просмотра). Другими словами необходимо, чтобы при отправке письма пользователем (например, Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. ), доставлял его почту как обычно адресату, а также дублировал это письмо в определенный ящик (например, Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. ).

На первый взгляд задача довольно не простая, но как оказалось - всё довольно легко реализуется. Имеем - операционная система FreeBSD и почтовый сервер на базе Postfix. Вот какие возможности для решения этой задачи предоставляет нам Postfix:

  • always_bcc = address

    Доставляет копии ВСЕХ сообщений (входящих и исходящих) на указанный адрес (поддерживается с Postfix v.2.1). Например, указав в /usr/local/etc/postfix/mail.cf строкуalways_bcc = Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.  можно сделать полный бэкап всей почты на адрес Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. , вот только не повезет тому, кто это всё разгребать будет.

  • sender_bcc_maps = type:table и recipient_bcc_maps = type:table

    Таблицы соответствия отправителя/получателя с адресами доставки копий сообщений (функция доступна в Postfix 2.1 и выше.) То что нам и нужно.

Рассмотрим 2 варианта реализации - на основе файлов (индексированных карт hash) и базы данных MySQL.

 Способ с использованием индексированных hash карт

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

Для примера рассмотрим вариант копирования исходящих сообщений:

1. Создаем файл в каталоге /usr/local/etc/postfix/, содержащий записи о том с какого почтового адреса копировать почту и на какой отправлять копии - назовем его sender_bcc. Добавляем в него строчку в формате:


 Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  
 Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
 

 Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  
 Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
 

2. Добавляем в main.cf строчку

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc

3. Обязательно создаем индексированный файл:

postmap /usr/local/etc/postfix/sender_bcc

4. Перезагружаем постфикс и любуемся копированием исходящей почты.

Аналогичные шаги нужно проделать для получения возможности копирования входящей почты. Вместо sender_bcc_maps следует использовать recipient_bcc_maps.

recipient_bcc_maps = hash:/etc/postfix/recipient_bcc

Внимание! После внесения изменений не забываем перестроить хэш:

postmap /usr/local/etc/postfix/recipient_bcc
postmap /usr/local/etc/postfix/sender_bcc

Способ с использованием MySQL

Подразумевается, что вы уже используете MySQL совместно с Postfix для хранения учетных записей, транспорта и т.д.

1. Создаем табличку bcc в вашей базе данных

CREATE TABLE bcc (
id int(10) unsigned NOT NULL auto_increment,
sender varchar(128) NOT NULL default '',
recipient varchar(128) NOT NULL default '',
copy varchar(128) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;

2. в /usr/local/etc/postfix/ создаем файлы sender_bcc.cf и recipient_bcc.cf:

sender_bcc.cf

user = postfix_user
password = postfix_password
dbname = mail_database
query = SELECT copy FROM bcc WHERE sender = '%s'
hosts = 127.0.0.1

recipient_bcc.cf

user = postfix_user
password = postfix_password
dbname = mail_database
query = SELECT copy FROM bcc WHERE recipient = '%s'
hosts = 127.0.0.1

3. В main.cf добавляем строчки

sender_bcc_maps = mysql:/usr/local/etc/postfix/sender_bcc.cf
recipient_bcc_maps = mysql:/usr/local/etc/postfix/recipient_bcc.cf

4. Перезапускам Postfix для применения изменений. Изменения данных в таблице MySQL bcc применяются без перезапуска Postfix.

Избавляемся от дублирования сообщений bcc_maps

Чтобы не происходило дублирования почты при использовании bcc_maps в master.cf следует добавить строчку:

-o receive_override_options=no_address_mappings

В моём случае это выглядит так:

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc
0

Напоследок - неплохая статья по настройке Postfix , хотя сам несколько иначе строил, но руки пока не доходят написать свою статью полностью. Хотя есть некоторые наработки, описания которых не встречал в сети.

  

У себя я реализовал так.

Для копирования входящей почты использовал вышеуказанный метод с виртуальными ящиками.

В файле /etc/postfix/virtual сделал следующее

Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. , Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. , Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.

  Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. — виртуальная запись (первая в строке), вторая в строке — этот же ящик, уже реальный, на который пересылается почта, пришедшая на первый, виртуальный, через запятую перечисляются все остальные получатели: Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. , Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. .

По этому принципу все входящие письма пересылаются на backup — ящик.

Для копирования исходящей почты использовал метод из статьи «большой брат» следит за тобой.

В файле /etc/postfix/main.cf добавил строчку

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc
1

Дополнения.

 

>Настройка crontab

файл /etc/crontab - файл настроек пользователя root

Чтобы проверить подключен ли он набираем crontab -l

Чтобы подключить новый файл настроек набираем crontab filename

Пример:

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc
2

Чтобы заставить выполняться задачу в 15 часов 30 минут под пользователем root заводим в /etc/crontab

Пример:

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc
3

Чтобы заставить выполняться задачу раз в 6 часов под пользователем php заводим в /etc/crontab

Пример:

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc
4

Чтобы заставить выполняться задачу раз в 30 минут под пользователем php заводим в /etc/crontab

Пример:

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc
5

Для посылки логов ошибок на email пишем в /etc/crontab следующее

Пример:

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc
6

 

Опции fetchmail

 

  • >> fetchmail (1) ( Русские man: Команды и прикладные программы пользовательского уровня )

  • Ключ fetchmail обнаружен в базе ключевых слов.

СИНТАКСИС

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc
7

ОПИСАНИЕ

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc
8

ОСНОВНЫЕ ОПЕРАЦИИ

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc
9

АУТЕНТИФИКАЦИЯ ПОЛЬЗОВАТЕЛЕЙ И ШИФРОВАНИЕ

postmap /usr/local/etc/postfix/sender_bcc
0

АДМИНИСТРАТИВНЫЕ ОПЦИИ

postmap /usr/local/etc/postfix/sender_bcc
1

СБОИ ПРИ ПРИЕМЕ ПОЧТЫ

postmap /usr/local/etc/postfix/sender_bcc
2

ФИЛЬТРАЦИЯ СПАМА

postmap /usr/local/etc/postfix/sender_bcc
3

КОНФИГУРАЦИОННЫЙ ФАЙЛ

postmap /usr/local/etc/postfix/sender_bcc
4

ВЗАИМОДЕЙСТВИЕ С RFC 822

postmap /usr/local/etc/postfix/sender_bcc
5

ИСПОЛЬЗОВАНИЕ ДОМЕННЫХ ПОЧТОВЫХ ЯЩИКОВ

postmap /usr/local/etc/postfix/sender_bcc
6

ФАЙЛЫ

postmap /usr/local/etc/postfix/sender_bcc
7

ОКРУЖЕНИЕ

postmap /usr/local/etc/postfix/sender_bcc
8

ОШИБКИ И ИЗВЕСТНЫЕ ПРОБЛЕМЫ

postmap /usr/local/etc/postfix/sender_bcc
9

АВТОРЫ

recipient_bcc_maps = hash:/etc/postfix/recipient_bcc
0




Статистика

isoqlog


просто ввести в консоли. Автоматически генерит сатистику по логам

И как обычно:

- задаем мне вопросы;

- смотрим стоимость моих услуг;

- записываем мои контакты.