Автор: Кузнецов Константин
[size=7]Почтовый сервер (postfix, dovecot, squirrelmail)[/size]
План:
1. Введение
2. Чего хотим добиться
3. Что нам понадобится
4. Составляем план действий
5. Настройка согласно плану
6. Популярные ошибки и ЧАВО
7. Приложение. Порядок отправки/приёма писем.
8. Используемая и рекомендуемая литература
------------------------------------------------------------
[size=6]1. Введение[/size]
Мало кто будет спорить, что широкому развитию глобальной сети Интернет поспособствовала возможность мгновенного обмена электронной почтой.
Материал из Википедии — свободной энциклопедии
Электронная почта (англ. email, e-mail, от англ. electronic mail) — технология и предоставляемые ею услуги по пересылке и получению электронных сообщений (называемых «письма» или «электронные письма») по распределённой (в том числе глобальной) компьютерной сети. Основным отличием от прочих систем передачи сообщений (например, служб мгновенных сообщений) является возможность отложенной доставки и развитая (и запутанная из-за длительного времени развития) система взаимодействия между независимыми почтовыми серверами.
Трудно себе представить уважающую себя коммерческую организацию, не имеющую собственный почтовый сервер, обрабатывающего почтовые ящики своего домена. Почтовый сервер, работающий под операционной системой GNU/Linux - признак хорошего тона со стороны системного администратора такой компании. О настройке такой системы мы и поговорим в этой статье.
------------------------------------------------------------
[size=6]2. Чего хотим добиться[/size]
Казалось бы, ответ очевиден:
Хотим настроить почтовую систему, да так, чтобы пользователи могли присылать письма нам, мы их могли получать и отвечать на них.
Но такой ответ не подойдет. Есть множество нюансов, в зависимости от которых процесс настройки пойдет в ту или иную сторону. Еще раз, что мы хотим?
Хотим настроить (научиться настраивать) почтовую систему таким образом:
Пункт 1. Чтобы она могла принимать и хранить письма для пользователей нескольких доменов (user1@domain1.ru, user2@domain2.com и т.д.) с поддержкой переадрессации писем на другие адреса (алиас)
По-умолчанию, почтовая система postfix, которую мы используем, принимает письма только для домена, соответствующего названию компьютера (server или computername). Изменить это можно с помощью добавления опции "virtual_mailbox_domains = " (виртуальные почтовые домены).
Пункт 2. Чтобы список этих доменов и их пользователей с алиасами находился в базе данных.
По-умолчанию, используются системные пользователи (которых добавляют с помощью useradd). Так как мы будем настраивать систему, обслуживающую несколько доменов, то такой подход уже подразумевает разбиение всех пользователей на системных и виртуальных, потому что в разных доменах могут быть разные пользователи с одинаковыми именами (user1@domain1.ru, user1@domain2.ru). Причем удобнее всех пользователей делать виртуальными, отказавшись от системных. Там ими и управлять проще, и запутаться будет труднее при настройке, и вообще не удобно в системе держать несколько десятков или сотен пользователей. Виртуальных пользователей можно хранить в текстовом формате в файле (т.е. "добавить пользователя" - будет означать "просто добавить в файл строчку об этом пользователе"), а можно (так будет удобнее) в базе данных mysql (просто добавляем запись в таблицу и пользователь готов).
Пункт 3. Чтобы пользователь мог получать письма по протоколам pop3 и imap4, находясь в любом месте земного шара, зная пароль (который тоже будет храниться в базе mysql).
По-умолчанию, полученные письма складываются в директорию /var/mail/ и представляют собой текстовый файл, имя которого соответствует имени пользователя, например /var/mail/user. Письма эти соответственно могут читать только системные пользователи, например, с помощью команды mail (необходимо установить дополнительный пакет mailutils). Таким образом, для получения письма системному пользователю, находясь удаленно, необходимо залогиниться в системе, например, через ssh, и получить почту командой mail. Но мы хотим пользоваться удобными средствами для приема почты, такими как thunderbird. А для этого одного postfix будет мало - он лишь smtp-сервер. Для наших целей существует pop3-сервер или imap-сервер (более новый протокол доступа к почтовому ящику). Мы будем использовать dovecot.
Пункт 4. Чтобы пользователь мог отсылать письма находясь в любом месте земного шара, зная этот же самый пароль.
По-умолчанию postfix отправляет письма только если в качестве клиента выступает он же (127.0.0.1). Отправлять письма, полученные для отправки от других компьютеров он не может в связи с политикой безопасности - иначе он будет считаться сервером "open relay", через который можно слать спам и прочий хлам без каких-либо препятствий. По-этому необходимо настраивать разрешения на отправку писем через наш сервер. Сначала мы разрешим отправлять письма только с компьютеров, находящихся в одной локальной сети с нашим сервером (permit_mynetworks), а потом только нашим пользователям и только по паролю. За это отвечает опция smtpd_sasl_auth_enable = yes в конфигурационном файле postfix. А механизм аутентификации мы заимствуем у dovecot, чтобы не плодить сущностей.
Пункт 5. Чтобы письма проверялись на спам.
Письма, которые будут проходить через наш сервер, могут быть разными. Причем 90% из них будут скорее всего содержать ненужную надоедливую рекламу - СПАМ. От них можно отбиваться с помощью программы spamassassin.
Пункт 6. Чтобы письма проверялись на вирусы.
Иногда бывает так, что нам пришло письмо содержащее вирус. Такие письма мы тоже будем блокировать - пакеты clamav и clamsmtpd.
Пункт 7. Чтобы присутствовал web-интерфейс для управления письмами.
Ну тут все понятно. Не у всех под рукой бывает почтовый клиент с необходимыми настройками. Squirrelmail - примитивная пародия на интерфейс почтового сервера, например такого крупного, как mail.ru. Нам его хватит за глаза.
------------------------------------------------------------
[size=6]3. Что нам понадобится[/size]
Пункт 1. Нам нужен компьютер с установленной операционной системой GNU|Linux Ubuntu 8.04 LTS желательно со всеми обновлениями и права администратора на нём.
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 8.04.3 LTS
Release: 8.04
Codename: hardy
root@computername:~# whoami
root
root@computername:~# id
uid=0(root) gid=0(root) groups=0(root)
PING ya.ru (77.88.21.8) 56(84) bytes of data.
64 bytes from ya.ru (77.88.21.8): icmp_seq=1 ttl=60 time=3.89 ms
--- ya.ru ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.899/3.899/3.899/0.000 ms
Chain INPUT (policy DROP 436K packets, 58M bytes)
pkts bytes target prot opt in out source destination
167K 52M ACCEPT all -- lo * 127.0.0.0/8 127.0.0.1
69M 78G ACCEPT all -- * * 192.168.0.0/24 192.168.0.1
2 168 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 0
421 26628 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmp type 8
465 24396 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
5 236 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:25
5 236 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:110
5 236 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:143
10M 9900M ACCEPT all -- eth1 * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
Starting Nmap 4.62 ( http://nmap.org ) at 2010-01-16 23:02 MSK
Interesting ports on 62.5.246.190:
Not shown: 1713 filtered ports
PORT STATE SERVICE
25/tcp open smtp
80/tcp open http
Пункт №5. FQDN. Доменное имя, привязанное к нашему внешнему ip-адресу, или mx-запись в dns-зоне на dns-сервере вида
domain.ru mail is handled by 10 62.5.246.190
Non-authoritative answer:
Name: domain.ru
Address: 62.5.246.190
------------------------------------------------------------
[size=6]4. Составляем план действий[/size]
Пункт №1. Настраиваем самый простой вариант почтовой системы - обслуживание одного домена, системные пользователи, отправка и получение писем только локально (с помощью команды mail) без поддержки pop3 или imap.
Пункт №2. Устанавливаем и подключаем pop3 и imap серверы (dovecot) для получения писем удаленно.
Пункт №3. Настраиваем SMTP-сервер (postfix) на возможность отправлять письма из локальной сети без проверки подлинности (для общего развития, на деле же считаю это бессмысленным).
Пункт №4. Добавляем в SMTP-сервер возможность проверять пользователя через встроенный в dovecot механизм аутентификации (чтобы письма можно было отправлять не только непосредственно с сервера командой mail или из локальной сети, но и удаленно)
Пункт №5. Добавляем поддержку виртуальных пользователей, хранящихся в текстовом формате.
Пункт №6. Отказываемся от использования системных пользователей. Переносим их в виртуальные.
Пункт №7. Переносим всю информацию о доменах и пользователях из текстовых файлов в базу данных (mysql).
Пункт №8. Установка и настройка http-сервера (apache) и подключение к нему почтового web-интерфейса (squirrelmail).
Пункт №9. Установка и подключение Антиспам-фильтра SPAMASSASIN. Пользователю будет приходить уведомление о том, что ему пытались отправить спам. Исходное помеченное как спам сообщение будет вложено в это письмо.
Пункт №10. Устанавливаем и подключаем антивирусную проверку писем. Пользователю, которому пытались прислать письмо с вирусом, будет приходит вместо этого письма уведомление об этом факте и инструкция, как получить зараженное письмо вопреки всему.
P.S. После выполнения каждого пункта настоятельно рекомендую перезагружать все сервисы, относящиеся к электронной почте.
------------------------------------------------------------
[size=6]5. Настройка согласно плану[/size]
[size=5]Пункт №1. Настраиваем самый простой вариант почтовой системы - обслуживание одного домена, системные пользователи, отправка и получение писем только локально (с помощью команды mail) без поддержки pop3 или imap.[/size]
Устанавливаем пакет postfix, на все вопросы отвечаем так, как предлагают. Не поверите, но после этого можно уже проверить свою службу доставки писем
telnet localhost 25
helo localhost
mail from:<>
rcpt to:<user@computername>
data
тут пишем текст, например hello
. (просто точка)
quit
Получаем в ответ
Jan 16 22:55:15 computername postfix/cleanup[19371]: 2AB015121B3: message-id=<20100116195506.2AB015121B3@computername>
Jan 16 22:55:15 computername postfix/qmgr[16712]: 2AB015121B3: from=<>, size=338, nrcpt=1 (queue active)
Jan 16 22:55:15 computername postfix/local[19372]: 2AB015121B3: to=<user@computername>, relay=local, delay=24, delays=24/0.01/0/0.04, dsn=2.0.0, status=sent (delivered to mailbox)
Jan 16 22:55:15 computername postfix/qmgr[16712]: 2AB015121B3: removed
From MAILER-DAEMON Sat Jan 16 17:02:34 2010
Return-Path: <>
X-Original-To: user@computername
Delivered-To: user@computername
Received: from localhost (localhost [127.0.0.1])
by computername (Postfix) with SMTP id 4C174512135
for <user@computername>; Sat, 16 Jan 2010 17:02:12 +0300 (MSK)
Message-Id: <20100116140225.4C174512135@computername>
Date: Sat, 16 Jan 2010 17:02:12 +0300 (MSK)
From: MAILER-DAEMON
To: undisclosed-recipients:;hello
Далее, устанавливаем пакет mailutils и получаем этим пользователем почту.
user@computername:~/# mail
"/var/mail/user": 1 сообщение 1 новое
>N 1 MAILER-DAEMON Сбт Янв 16 12/416 MAILER-DAEMON
&
Date: Sat, 16 Jan 2010 17:02:12 +0300 (MSK)
From: MAILER-DAEMON
To: undisclosed-recipients:;
hello
&
1 сообщение удержано в /var/mail/user
Отлично, письмо получено. Попробуем отправить письмо:
Забэкапим оригинал конфига
Идем в main.cf. После установки его содержимое было таким:
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
myhostname = computername
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = computername, localhost.localdomain, , localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
Вносим первые изменения, добавив наш домен для обслуживания почтовой системой
myorigin = domain.ru
myhostname = $myorigin
mydestination = computername, localhost.localdomain, , localhost, $myorigin
Перезагружаем postfix, теперь можем проверить отправку почты внешним адресатам:
helo localhost
mail from:<user@domain.ru>
rcpt to:<admin@mail.ru>
data
Subject: helloworld
Good mornong
.
На мэйле проверяем письмо через секунд 5-10. Если ничего нет, то выполняем
Jan 16 17:30:56 computername postfix/cleanup[16765]: 97B365121B0: message-id=<20100116143043.97B365121B0@domain.ru>
Jan 16 17:30:56 computername postfix/qmgr[16712]: 97B365121B0: from=<user@domain.ru>, size=370, nrcpt=1 (queue active)
Jan 16 17:31:01 computername postfix/smtp[16766]: 97B365121B0: to=<admin@mail.ru>, relay=mx.mail.ru[62.32.54.188]:25, delay=26, delays=20/0.01/5.2/0.12, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as B8580C7C9F)
Jan 16 17:31:01 computername postfix/qmgr[16712]: 97B365121B0: removed
Теперь обратим внимание на две строки в файле main.cf:
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
внимательно посмотрим на содержимое этих файлов
root: user
Таким образом мы указали, что письма для пользователя root будут пересылаться пользователю user. Таким образом, user является алиасом для root. Проверим это: отправим письмо для root, а получим его user-ом. В логах это видно так:
Если нам понадобится добавить еще один алиас, например
user2: root
postmaster: user2
то после сохранения файла /etc/aliases необходимо выполнить
Пока что все отлично. Письма уходят и приходят. Что еще для счастья нужно?
[size=5]Пункт №2. Устанавливаем и подключаем pop3 и imap серверы (dovecot) для получения писем удаленно.[/size]
Устанавливаем dovecot-pop3d и dovecot-imapd. Конфигурационный файл /etc/dovecot/dovecot.conf по-умолчанию такой:
protocols = imap imaps pop3 pop3s
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_privileged_group = mail
protocol imap {
}
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
auth default {
mechanisms = plain
passdb pam {
}
userdb passwd {
}
user = root
}
dict {
}
plugin {
}
Бэкапим и редактируем, добавив 1 опцию и отредактировав 1 опцию
# imaps и pop3s нам не нужны
protocols = imap pop3
# разрешаем принимать пароли открытым текстом
disable_plaintext_auth = no
После этого перезапускаем dovecot и проверяем почтовым клиентом pop3 и imap.
[size=5]Пункт №3. Настраиваем SMTP-сервер (postfix) на возможность отправлять письма из локальной сети без проверки подлинности.[/size]
Для общего развития нам необходимо добавить возможность отправлять письма через наш почтовый сервер без авторизации всем, чьи компьютеры расположены в локальной сети сервера. Для этого необходимо в main.cf добавить 1 строку и изменить 1 строку:
mynetworks = 127.0.0.0/8 192.168.0.0/24
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
Очевидно, что если мы туда же запишем наш домашний ip-адрес, то и из дома мы сможем отправлять письма через сервер без пароля. Во второй строке разрешается отправлять письма не только тем, кто находится в "моих сетях", но и прошедшим аутентификацию. Прикрутим её сюда.
[size=5]Пункт №4. Добавляем в SMTP-сервер возможность проверять пользователя через встроенный в dovecot механизм аутентификации.[/size]
/etc/postfix/main.cf:
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
/etc/dovecot/dovecot.conf:
auth default {
mechanisms = plain loginsocket listen {
client {
path = /var/spool/postfix/private/auth
user = postfix
}
}
перезапускаем postfix и dovecot.
[size=5]Пункт №5. Добавляем поддержку виртуальных пользователей, хранящихся в текстовом формате.[/size]
Добавляем в /etc/postfix/main.cf:
# прописываем домены, для чьих пользователей будет принимать письма наш сервер
virtual_mailbox_domains = domain1.ru, domain2.net, domain3.org, domain4.com
# Путь к директории, где будут лежать письма пользователей этих доменов
virtual_mailbox_base = /var/mail/virtual/
# Путь к файлу, где указаны пути к почтовым ящикам относительно переменной $virtual_mailbox_base
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps
# Указываем user id (владельца), под чьим именем будут храниться файлы почты
virtual_uid_maps = static:1001
# Указываем group id (группы), под чьим именем будут храниться файлы почты
virtual_gid_maps = static:1001
Добавляем пользователя в систему, под чьим именем будет храниться вся почта
useradd -u 1001 -g 1001 vmail
chown 1001:1001 /var/mail/virtual
# Тут будет лежать почта виртуальных пользователей
mail_location = maildir:/var/mail/virtual/%d/%n
# Так как у нас могут быть в разных доменах разные пользователи
# с одинаковыми ящиками, то мы меняем аутентификацию на учет
# доменного имени, как части логина (в почтовом клиенте так же
# меняем login:user на login:user@domain
auth_username_format = %Ln@%Ld
# Аутентификация будет происходить на основании паролей, хранящихся в файле
passdb passwd-file {
args = /etc/dovecot/passwd
}
# Пользователи со своими UID и GID будут лежать в другом файле
userdb passwd-file {
args = /etc/dovecot/users
}
Добавляем пользователя в /etc/dovecot/users:
user@domain111.ru::1001:1001
Генерируем пароль для пользователя
user@domain111.ru:{DIGEST-MD5}583d7d41e60ae44911cdb4b3d800aafc
Проверяем - должно все работать.
После этого мои системные пользователи локального домена (domain.ru) работать перестали (не получают и не отправляют почту). Копал-копал и решил, что dovecot-у для проверки пользователя необходимо указать "логин@домен", а системные пользователи у нас работали только через "логин". Я ломать голову не стал и, учитывая что все пользователи все равно у меня будут виртуальными, начал переносить исходный домен с пользователями.
[size=5]Пункт №6. Отказываемся от использования системных пользователей. Переносим их в виртуальные.[/size]
Подправим конфиг постфикса /etc/postfix/main.cf:
# возвращаем обратно
myorigin = computername
# перечисляем домены, для которых будем принимать почту,
# иначе будет ошибка "relay access denied"
virtual_mailbox_domains = domain.ru, domain111.ru, domain222.ru
# Поменяем это значение для общего развития, хотя можно оставить прежним
virtual_uid_maps = hash:/etc/postfix/virtual_uid_maps
# Поменяем это значение для общего развития, хотя можно оставить прежним
virtual_gid_maps = hash:/etc/postfix/virtual_gid_maps
# а если у нас всегда uid=gid, то можно только один файл
# из них сделать и тут указать его в обоих случаях,
# либо virtual_gid_maps = $virtual_uid_maps
Подправим ряды виртуальных пользователей /etc/postfix/virtual_mailbox_maps:
user@domain111.ru domain111.ru/user/
user@domain.ru domain.ru/user/
user@domain111.ru 1001
user@domain.ru 1001
postmap /etc/postfix/virtual_gid_maps
user@domain111.ru::1001:1001
user@domain.ru::1001:1001
Зашифруем пароль пользователя
user@domain111.ru:{DIGEST-MD5}582d7341460se47911cdb4b3d800aafc
user@domain.ru:{DIGEST-MD5}4fe5g32cb1at8a13b64cfj4d894e7ae2
Перезапускаем dovecot и postfix, проверяем отправку и получение писем перенесенным пользователем. Теперь его почтовый ящик находится по адресу /var/mail/virtual/domain.ru/user/
[size=5]Пункт №7. Переносим всю информацию о доменах и пользователях из текстовых файлов в базу данных (mysql).[/size]
Устанавливаем mysql-сервер (mysql-server-5.0) и связующее звено между ним и postfix-ом (postfix-mysql).
Переходим в mysql
`id` int(10) NOT NULL auto_increment,
`user` varchar(128) collate cp1251_general_cs NOT NULL,
`domain` varchar(255) collate cp1251_general_cs NOT NULL default 'squid.cetcoltd.ru',
`password` varchar(64) collate cp1251_general_cs NOT NULL,
`active` tinyint(1) NOT NULL default '1',
`alias` varchar(255) collate cp1251_general_cs NOT NULL default 'info@squid.cetcoltd.ru',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=39 DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_cs COMMENT='postfix_dovecot';
Назначаем пользователя, которому можно только делать выборку из баз (только чтение), от имени которого будут получать информацию из базы наши postfix и dovecot.
#virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox_maps
virtual_mailbox_maps = mysql:/etc/postfix/virtual_mailbox_maps.cf
Создаем файл /etc/postfix/virtual_mailbox_maps.cf , в котором будет храниться информация о том, как из базы mysql получить необходимую информацию:
user = mailuser
password = password
dbname = mail
hosts = 127.0.0.1:3306
query = SELECT CONCAT(domain,'/',user,'/') as home FROM mail_users WHERE user = '%u' AND domain = '%d' AND active = '1'
Строку с запросом так же можно записать другим способом:
query = SELECT '%d/%u/' as home FROM mail_users WHERE user = '%u' AND domain = '%d' AND active = '1'
Тут должно быть понятно. Выбираем объединение домена, /, пользователя, / из таблицы, где пользователь = полученный user, domain = домен. Таким образом запрос должен возвращать ответ вида:
domain.ru/user/
Это значение прибавляется к virtual_mailbox_base и получается полный путь к почтовому ящику
/var/mail/virtual/domain.ru/user/
Тоже самое делаем и с alias. Правим /etc/postfix/main.cf:
virtual_alias_maps = mysql:/etc/postfix/virtual_alias_maps.cf
Файл /etc/postfix/virtual_alias_maps.cf такой же, как и /etc/postfix/virtual_mailbox_maps.cf, за исключением строки запроса:
query = SELECT alias FROM mail_users WHERE user = '%u' AND domain = '%d' AND active = '1'
Так же можно поступить с uid и gid, но для этого нужно было в нашу таблицу добавить соответствующие поля. Я предпочетаю вариант uid и gid = static:1001.
Проверяем, работает ли эта связка. Отправляем себе письмо с другого ящика и смотрим логи. Еще можно проверять размер ящика:
С SMTP закончили, теперь нам нужно изменить dovecot (pop3, imap) на использование данных из mysql. Вносим изменения в файл /etc/dovecot/dovecot.conf:
passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
userdb sql {
args = /etc/dovecot/dovecot-sql.conf
}
Теперь редактируем файл /etc/dovecot/dovecot-sql.conf:
# Драйвер - к какой базе данных подключаемся.
driver = mysql
# Перечисляем базу, имя пользователя и его пароль
connect = host=localhost dbname=mail user=mailuser password=password
# Указываем, в каком виде лежит в базе зашифрованный пароль
default_pass_scheme = PLAIN-MD5
# SQL-Запрос на получение пароля из базы.
password_query = SELECT password FROM mail_users WHERE user = '%n' AND domain = '%d'
# SQL-Запрос на получение пути к почтовому ящику. UID и GID у нас в базе не лежат, по-этому подставляем значение прямо в запрос.
user_query = SELECT '1001' as uid, '1001' as gid FROM mail_users WHERE user = '%n' AND domain = '%d'
%u - это полностью имя пользователя, как его передали, а %n - только его первая часть, в случае если был использован вид user@domain.
Проверяем почту по обоим протоколам pop3 и imap - есть письмо.
Для того, чтобы не было недопонимания, убираем предыдущую поддержку пользователей через passwd-файлы. Для этого нужно закомментировать в файле /etc/dovecot/dovecot.conf строки:
#passdb passwd-file {
# Path for passwd-file
#args = /etc/dovecot/passwd
#}
#userdb passwd-file {
# Path for passwd-file
#args = /etc/dovecot/users
#}
Готово.
[size=5]Пункт №8. Установка и настройка http-сервера (apache) и подключение к нему почтового web-интерфейса (squirrelmail).[/size]
Устанавливаем пакеты squirrelmail и squirrelmail-locales. Идем в /etc/squirrelmail/apache2.conf, копируем оттуда верхушку
Alias /squirrelmail /usr/share/squirrelmail
<Directory /usr/share/squirrelmail>
Options Indexes FollowSymLinks
<IfModule mod_php4.c>
php_flag register_globals off
</IfModule>
<IfModule mod_php5.c>
php_flag register_globals off
</IfModule>
<IfModule mod_dir.c>
DirectoryIndex index.php
</IfModule># access to configtest is limited by default to prevent information leak
<Files configtest.php>
order deny,allow
deny from all
allow from 127.0.0.1
</Files>
</Directory>
и вставляем в /etc/apache2/apache2.conf или в /etc/apache2/sites-available/default. Куда хотите. Web-интерфейс станет доступен по адресу http://domain.ru/squirrelmail. Можно изменить на http://domain.ru/mail, для этого необходимо в той части, которую копировали изменить первую строку
Alias /mail /usr/share/squirrelmail
Перезагружаем apache, заходим браузером на наш domain.ru/squirrelmail, если работает почтовый клиент по imap протоколу, то и squirrelmail заработает без проблем. Вводим логин, пароль и пользуемся. Для изменения языка интерфейса используем утилиту squirrelmail-configure. Выбираем 10. Languages, приводим значения к виду
1. Default Language : ru_RU
2. Default Charset : cp1251
[size=5]Пункт №9. Установка и подключение Антиспам-фильтра SPAMASSASIN. Пользователю будет приходить уведомление о том, что ему пытались отправить спам. Исходное помеченное как спам сообщение будет вложено в это письмо.[/size]
Устанавливаем spamassassin и spamc. Конфигурационный файл - /etc/spamassassin/local.cf:
rewrite_header Subject *****SPAM*****
Остальное можно оставить по-умолчанию. Если попытаемся запустить службу
SpamAssassin Mail Filter Daemon: disabled, see /etc/default/spamassassin
Идем в файл /etc/default/spamassassin и исправляем:
ENABLED=1
Далее идем в /etc/postfix/master.cf и прикручиваем туда антиспам проверку.
Вместо строки
smtp inet n - - - - smtpd
вставляем
smtp inet n - n - - smtpd
-o content_filter=spam:dummyspam unix - n n - - pipe
flags=R user=vmail argv=/usr/bin/spamc -u vmail -e /usr/sbin/sendmail -f $sender $recipient
Каждая вторая строчка из приведенных должны начинаться в этом файле с двух пробелов. Только в этом случае она будет считаться продолжением предыдущей. virtual - пользователь, которого мы создали. Перезапускаем postfix, spamassassin и пытаемся сами себе отправить письмо с содержанием сигнатуры спама:
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
Через несколько секунд нам придет письмо с темой *****SPAM*****, в котором будет рассказано (к сожалению на английском), что нам пытались отправить спам-письмо, которое будет прикреплено вложением и мы его сможем прочитать. Можно настроить, чтобы уведомление приходило на русском языке. Для этого берем шаблон, переводим на русский, переводим в другую кодировку (из utf8 в koi8-r, чтобы русский был, а не крокозябры) и добавляем к конфигу /etc/spamassassin/local.cf
report_charset ru_RU.KOI8-R
clear_report_template
report Система СПАМ-обороны на сервере "_HOSTNAME_"
report пометила данное сообщение как возможную рекламу. Исходное сообщение
report было присоеденино к данному, так что вы можете его просмотреть
report либо добавить фильтр на его основании. Если у вас есть какие-либо
report вопросы, обратитесь к разделу _CONTACTADDRESS_ для получения
report дополнительной информации
report Предпросмотр исходного сообщения: _PREVIEW_
report
report Content analysis details: (_SCORE_ points, _REQD_ required)
report
report " pts rule name description"
report ---- ---------------------- --------------------------------------------------
report _SUMMARY_clear_unsafe_report_template
unsafe_report Исходное сообщение не является простым текстом, и открывать его
unsafe_report может быть небезопасно. Оно может содержать подтверждение о том,
unsafe_report что ваш почтовый ящик благополучно получаем спам-сообщения.
unsafe_report Если вы все равно хотите его просмотреть, будет безопасно сделать
unsafe_report это с помощью любого текстового редактора, например "блокнот".
root@computername:~# cat /tmp/text2 >> /etc/spamassassin/local.cf
[size=5]Пункт №10. Устанавливаем и подключаем антивирусную проверку писем. Пользователю, которому пытались прислать письмо с вирусом, будет приходит вместо этого письма уведомление об этом факте и инструкция, как получить зараженное письмо вопреки всему.[/size]
Устанавливаем пакеты clamav и clamsmtp. После установки пакетов следует сразу же обновить антивирусные базы командой freshclam. Добавляем в файл /etc/postfix/main.cf строку:
content_filter = scan:[127.0.0.1]:10026
Которая указывает smtp-серверу, чтобы он проверял содержимое письма с помощью фильтра scan, работающего на локальном порту 10026.
В файл /etc/postfix/master.cf первыми строками (перед спам-проверкой):
scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes
-o smtp_tls_security_level=none127.0.0.1:10025 inet n - n - 16 smtpd
-o content_filter=
-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
Напоминаю, что необходимо ставить два пробела впереди строки, чтобы она считалась продолжением предыдущей.
Конфигурационный файл антивирусного фильтра /etc/clamsmtpd.conf оставляем без изменений:
OutAddress: 10025
Listen: 127.0.0.1:10026
ClamAddress: /var/run/clamav/clamd.ctl
TempDirectory: /var/spool/clamsmtp
PidFile: /var/run/clamsmtp/clamsmtpd.pid
User: clamsmtp
Остальное я оставил так как есть.
По-умолчанию, антивирусный фильтр будет просто молча отбрасывать все письма, содержащие по его мнению вирусы. Согласитесь, было бы неплохо уметь настраивать его так, чтобы нам приходило уведомление об этом с возможностью таки получить это письмо.
Пишем простенький скриптик /tmp/text3:
#!/bin/sh
ADMIN="admin@mail.ru"
MAILTO="$RECIPIENTS,$ADMIN"
SUBJECT=$(cat $EMAIL|grep Subject|awk -F: '{print $2}')
TEXT="ВНИМАНИЕ!!!\n\nНа почтовый адрес $RECIPIENTS пришло сообщение, содержащее ВИРУС!\n"
TEXT=$TEXT"\nНе волнуйтесь, вирус обезврежен антивирусным программным обеспечением, установленным на почтовом сервере."
TEXT=$TEXT"\nВашим данным ничто не угражает."
if [ "x$EMAIL" != "x" ] && [ -f $EMAIL ]
then
TEXT=$TEXT"\nПисьмо добавлено в карантин: $EMAIL \n"
fi
TEXT=$TEXT"\nОтправитель: $SENDER"
TEXT=$TEXT"\nТема сообщения: $SUBJECT"
TEXT=$TEXT"\nИдентификатор Вируса: $VIRUS"
#TEXT=$TEXT"\nПочтовый клиент: $CLIENT"
#TEXT=$TEXT"\nПочтовый сервер: $SERVER"
TEXT=$TEXT"\n\nЕсли вы уверены, что письмо не содержит вредоносного содержимого, либо, не смотря ни на что, вы все равно хотите прочитать данное сообщение и готовы взять всю ответственность за возможные компьютерные неисправности и сбои на себя, перешлите это сообщение администратору сервера по адресу $ADMIN"
TEXT=$TEXT"\nОбратите внимание, что в карантине зараженные письма находятся 7 дней, после чего удаляются без возможности восстановления!"
TEXT=$TEXT"\n\nС наилучшими пожеланиями,\nВаш администратор."
echo "$TEXT" | mail -s "[ВИРУС] $SUBJECT" $MAILTO
Который так же как и в случае со спамом перекодируем
VirusAction: /etc/virusaction.sh
перезапускаем postfix и clamsmtpd, отправляем себе письмо, содержащее в теле сообщения
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
Получаем уведомление на русском. Если ваши пользователи могут захотеть получать свои зараженные письма, вам следует в файле /etc/clamsmtpd.conf добавить опцию
Quarantine: on
После чего им в уведомлении будет указан файл-карантин, в котором хранится зараженное письмо.
Письмо добавлено в карантин: /var/spool/clamsmtp/virus.MQYlXX
Вы просто копируете файл-карантин в его папку
------------------------------------------------------------
[size=6]6. Популярные ошибки и ЧАВО[/size]
Во-первых, Не удалось подружить squirrelmail и отчет о спам- и вирус- блокировках. Видно все крокозябрами, хотя почтовые клиенты отображают все отлично, и squirrelmail видит другие письма на русском нормально.
Во-вторых, я сначала в файле /etc/dovecot/dovecot-sql.conf запрос пароля указал так:
password_query = SELECT user, password FROM mail_users WHERE user = '%n' AND domain = '%d'
После чего испытал такие глюки, каких не ожидал: либо во втором запросе в базу не передавалось значение домена, либо вместо второго запроса подставлялся совершенно другой. Очень удивился, когда все заработало нормально после удаления слова user, из password_query-запроса.
В-третьих, все работало хорошо до некоторых пор. Письма перестали уходить, postqueue -p выдавал большую очередь, у всех зависших писем одна и та же проблема:
(host 127.0.0.1[127.0.0.1] said: 451 Local Error (in reply to end of DATA command))
Начал рыть. Временное решение проблемы - отключить в postfix проверку на вирусы. Для этого необходимо закомментировать в файле /etc/postfix/main.cf строчку content_filter. Письма стали уходить, но без проверки на вирусы. Разбираемся дальше.
tail /var/log/mail.logвыдал
clamsmtpd: 100011: CLAMAV: couldn't connect to: /var/run/clamav/clamd.ctl: No such file or directory
Идем дальше.
/etc/init.d/clamav-daemon status* clamd is not running.
/etc/init.d/clamav-daemon startВидим много слов, среди которых
...
This ClamAV version has reached End of Life! Please upgrade to version 0.95 or later.
...
Обновляемся
apt-get update
apt-get install clamav clamav-baseЗапускаем
/etc/init.d/clamav-daemon restart
/etc/init.d/clamsmtp restartИзменяем postfix на использование антивирусной проверки (надо раскомментировать content_filter) и перезапускаемся
/etc/init.d/postfix restartПроверяем - все работает.
P.S. Данный раздел будет пополняться
------------------------------------------------------------
[size=6]7. Приложение. Порядок отправки/приёма писем.[/size]
Порядок отправки писем
В этой цепочке участвуют только клиентская программа (thunderbird, outlook), наш сервер smtp (postfix), другой сервер smtp (postfix, exim, qmail, exchange...)
Наш сервер postfix принимает соединение на 25 порту. Ему все равно, подключился к нему его клиент через почтовую программу, который хочет отправить это письмо кому-то дальше, или удаленный сервер, который хочет передать нашему серверу письмо для его клиента;
Проверяет, для кого предназначено письмо. Если для домена, который он обслуживает - то принимает письмо, ищет у себя в базе пользователей этого домена путь к ящику вида "/var/mail/virtual/domain.ru/user". Если такой пользователь (ящик) есть - перекладывает файл-письмо туда. Если такого пользователя нет, отправителю исходного письма отправляется соответственное уведомление (письмом).
Если письмо предназначено для пользователя из другого домена - запрашивает логин/пароль (иначе наш сервер считался бы OPEN RELAY и мог слать через себя СПАМ);
Полученные данные отправляет механизму аутентификации, заимствованному у dovecot, через файл /var/spool/postfix/private/auth. Далее рассматриваем только тот случай, если аутентификацию прошли успешно;
Письмо помещается в очередь сообщений.
В это время наш сервер, используя DNS-сервер, прописанный в /etc/resolv.conf, узнает MX-запись (ip-адрес), соответствующую почтовому серверу, обслуживающему домен получателя. При отсутствии MX -записи делается попытка отправить на A запись;
Связывается с полученным ip-адресом на порт 25 (как если бы это был обычный почтовый клиент);
Если этот сервер действительно обслуживает этот домен, то он принимает письмо, проверяет наличие пользователя и помещает его в свою очередь, после чего письмо скорее всего переместится в каталог этого пользователя.
Если же этот сервер ошибочно указан в зоне DNS, как обслуживающий этот домен, то он не станет принимать это сообщение;
Порядок приема писем
В этой цепочке участвуют только сервер pop3/imap (dovecot) и клиентская программа (thunderbird, outlook).
Клиентская программа подключается к серверу на порт 110 (pop3) или imap (143);
Сервер выдает приглашение к аутентификации, получает данные, сверяет с базой. Далее рассматриваем только тот случай, если аутентификацию прошли успешно;
Исходя из принятого логина сервер получает полный путь к каталогу, в котором лежит его почта;
Исходя из содержимого этого каталога сервер предоставляет список всех писем клиенту;
Клиентская программа исходя из полученного списка выдает пользователю на экран перечень писем, хранящихся на сервере;
------------------------------------------------------------
[size=6]8. Используемая и рекомендуемая литература[/size]
http://ru.wikipedia.org/wiki/Электронная_почта
http://www.postfix.org/documentation.html
http://wiki.dovecot.org/
http://dedicatesupport.com/archives/20
http://dedicatesupport.com/archives/21
http://www.sys-adm.org.ua/mail/postfix- … -sa.php#c2

))))))