Почтовый сервер со всем фаршем на 10.04 LTS Сравнение версий

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
wiki:почтовый_сервер_со_всем_фаршем_на_10.04_lts [2011/07/20 11:13]
[Дополнительные правила для защиты от спама]
wiki:почтовый_сервер_со_всем_фаршем_на_10.04_lts [2012/09/10 13:27] (текущий)
[Настройка Postfix]
Строка 1: Строка 1:
-===== О документе ===== +===== Почтовый сервер со всем фаршем на 10.04 LTS ===== 
-Этот документ описывает процедуру установки почтового сервера на базе Ubuntu 10.04 LTS. В документе использовано следующее форматирование:​+Этот документ описывает процедуру установки почтового сервера на базе ​//Ubuntu 10.04 LTS//. В документе использовано следующее форматирование:​
  
-''​строки с таким выделением''​+<code bash>строки с таким выделением</​code>​
  
 это команды,​ которые мы задаем в терминале. это команды,​ которые мы задаем в терминале.
  
-**строки с таким выделением**+<note tip>**строки с таким выделением**</​note>​
  
 это ответы,​ которые мы получаем на введенные нами команды это ответы,​ которые мы получаем на введенные нами команды
 +
 <​file>​строки с таким выделением</​file>​ <​file>​строки с таким выделением</​file>​
 +
 это содержимое различного рода конфигурационных файлов. это содержимое различного рода конфигурационных файлов.
  
Строка 22: Строка 24:
 В процессе создания документа использована куча различного рода информации,​ доступной в Интернет. К сожалению,​ не представляется возможным перечислить все источники информации,​ однако хочется выразить признательность всем авторам,​ чья работа так или иначе была использована при написании этого документа. В процессе создания документа использована куча различного рода информации,​ доступной в Интернет. К сожалению,​ не представляется возможным перечислить все источники информации,​ однако хочется выразить признательность всем авторам,​ чья работа так или иначе была использована при написании этого документа.
 ===== Постановка задачи ===== ===== Постановка задачи =====
-Мы установим на чистую машину на //Ubuntu 10.04 LTS server// почтовый сервер на базе //​postfix//​. Для "​забора"​ почты по протоколам //​pop3/​imap//​ будем использовать //dovecot// с поддержкой квот для почтовых ящиков пользователей. На нашем сервере будет располагаться почта для двух разных доменов - //aaa.ru// (наш "​основной"​ домен) и //bbb.ru//. Для настройки почты будем использовать //mysql//. Для аутентификации пользователей будем использовать два механизма - //mysql// для домена //bbb.ru// и //​openldap//​ для пользователей нашего основного домена //aaa.ru//. Кроме этого, почтовый сервер будет проверять входящую почту с помощью //amavis// на вирусы (//​clamav//​) и спам (//​spamassassin//​). Сделаем также лист рассылки (//​mailman//​) и автоответчик для пользователей. Установим систему для доступа к почте через web — //​horde/​imp//​. Мы будем использовать //​horde/​imp//,​ т.к. это самый продвинутый веб-клиент,​ позволяющий полностью использовать все современные возможности почты, включая подписывание почты по протоколам //S/MIME// и прочие. Кроме этого, установим munin для рисования красивых графиков работы нашего почтового сервера.+Мы установим на чистую машину на //Ubuntu 10.04 LTS server// почтовый сервер на базе //​postfix//​. Для "​забора"​ почты по протоколам //​pop3/​imap//​ будем использовать //dovecot// с поддержкой квот для почтовых ящиков пользователей. На нашем сервере будет располагаться почта для двух разных доменов - //aaa.ru// (наш "​основной"​ домен) и //bbb.ru//. Для настройки почты будем использовать //mysql//. Для аутентификации пользователей будем использовать два механизма - //mysql// для домена //bbb.ru// и //​openldap//​ для пользователей нашего основного домена //aaa.ru//. Кроме этого, почтовый сервер будет проверять входящую почту с помощью //amavis// на вирусы (//​clamav//​) и спам (//​spamassassin//​). Сделаем также лист рассылки (//​mailman//​) и автоответчик для пользователей. Установим систему для доступа к почте через web — //​horde/​imp//​. Мы будем использовать //​horde/​imp//,​ т.к. это самый продвинутый веб-клиент,​ позволяющий полностью использовать все современные возможности почты, включая подписывание почты по протоколам //S/MIME// и прочие. Кроме этого, установим ​//munin// для рисования красивых графиков работы нашего почтового сервера.
  
 Итак, предположим,​ что у нас есть только что установленная 10.04 LTS. Предположим также, что компьютер зовут //"​oban"//,​ он имеет IP адреc //​10.0.0.6//,​ находится в DMZ за NAT. Для доступа извне на наш почтовый сервер мы пробросим нужные порты по протоколу TCP – 80, 443 (для доступа к веб-серверу),​ 25 (для доступа к SMTP-серверу),​ 110, 143, 993, 995 (для “забора” почты снаружи по протоколам POP3 и IMAP). Если нужно, откроем еще порт 22 для доступа по SSH (хотя этого делать не стоит – лучше иметь доступ к серверу только изнутри нашей сети). Итак, предположим,​ что у нас есть только что установленная 10.04 LTS. Предположим также, что компьютер зовут //"​oban"//,​ он имеет IP адреc //​10.0.0.6//,​ находится в DMZ за NAT. Для доступа извне на наш почтовый сервер мы пробросим нужные порты по протоколу TCP – 80, 443 (для доступа к веб-серверу),​ 25 (для доступа к SMTP-серверу),​ 110, 143, 993, 995 (для “забора” почты снаружи по протоколам POP3 и IMAP). Если нужно, откроем еще порт 22 для доступа по SSH (хотя этого делать не стоит – лучше иметь доступ к серверу только изнутри нашей сети).
Строка 28: Строка 30:
 Пользователь,​ за которым мы "​сидим"​ - это, конечно,​ не //root//, а //toor// (Вы же не сидите за рутом, правда?​). ​ Пользователь,​ за которым мы "​сидим"​ - это, конечно,​ не //root//, а //toor// (Вы же не сидите за рутом, правда?​). ​
 ===== Установка системы ===== ===== Установка системы =====
-Вначале установим "​чистую"​ систему Ubuntu 10.04 LTS server. В процессе установки ничего дополнительно устанавливать не будем, все нужное установим позже. ​+Вначале установим "​чистую"​ систему ​//Ubuntu 10.04 LTS server//. В процессе установки ничего дополнительно устанавливать не будем, все нужное установим позже. ​
  
-Первое что мы сделаем после перезагрузки,​ еще не отходя от терминала - установим ssh-сервер,​ чтобы все остальное делать удаленно:​+Первое что мы сделаем после перезагрузки,​ еще не отходя от терминала - установим ​//ssh-сервер//, чтобы все остальное делать удаленно:​
  
-''​sudo apt-get install openssh-server''​+<code bash>sudo apt-get install openssh-server</​code>​
  
 После этого со спокойной совестью выходим и идем к нашему собственному компьютеру. Чтобы не набирать каждый раз пароль при входе на наш сервер,​ сделаем вход по ключу: После этого со спокойной совестью выходим и идем к нашему собственному компьютеру. Чтобы не набирать каждый раз пароль при входе на наш сервер,​ сделаем вход по ключу:
  
-''​ssh-copy-id -i ~/​.ssh/​id_rsa.pub toor@10.0.0.6''​+<code bash>ssh-copy-id -i ~/​.ssh/​id_rsa.pub toor@10.0.0.6</​code>​
  
 Нас спросят,​ уверены ли мы, что хотим соединиться с этим сервером ​ Нас спросят,​ уверены ли мы, что хотим соединиться с этим сервером ​
  
-**Are you sure you want to continue connecting (yes/no)?**+<note tip>**Are you sure you want to continue connecting (yes/no)?**</​note>​ 
 + 
 +Ответим
  
-Ответим ''​yes''​+<code bash>yes</​code>​
  
-Нас спросят пароль пользователя toor на oban +Нас спросят пароль пользователя ​//toor// на //oban// 
  
-**toor@10.0.0.6'​s password:**+<note tip>**toor@10.0.0.6'​s password:**</​note>​
  
 Введем. Все, теперь для захода на наш сервер с нашего компьютера достаточно набрать ​ Введем. Все, теперь для захода на наш сервер с нашего компьютера достаточно набрать ​
  
-''​ssh toor@10.0.0.6''​+<code bash>ssh toor@10.0.0.6</​code>​
  
 и мы там. Заметьте,​ что это не то же самое, что попытка входа как ​ и мы там. Заметьте,​ что это не то же самое, что попытка входа как ​
  
-''​ssh toor@oban''​+<code bash>ssh toor@oban</​code>​
  
 так что если хотите - проделайте это еще раз уже для такого варианта. так что если хотите - проделайте это еще раз уже для такого варианта.
Строка 60: Строка 64:
 Итак, вначале установим все обновления (их наверняка набралось уже порядочно): ​ Итак, вначале установим все обновления (их наверняка набралось уже порядочно): ​
  
-''​sudo apt-get update  +<code bash>sudo apt-get update  
-sudo apt-get dist-upgrade''​+sudo apt-get dist-upgrade</​code>​
  
-Мы используем dist-upgrade а не просто upgrade чтобы получить обновления в том числе и для ядра. ​+Мы используем ​//dist-upgrade// а не просто ​//upgrade// чтобы получить обновления в том числе и для ядра. ​
  
 Естественно,​ соглашаемся с предложенным списком и (если были обновления ядра или подобные важные обновления) перезагружаемся ​ Естественно,​ соглашаемся с предложенным списком и (если были обновления ядра или подобные важные обновления) перезагружаемся ​
  
-''​sudo reboot ​''​+<code bash>sudo reboot</​code>​
  
 Начинаем установку. Начинаем установку.
Строка 73: Строка 77:
 Установим нужные пакеты Установим нужные пакеты
  
-''​sudo apt-get install postfix postfix-mysql postfix-ldap postfix-doc postfix-tls libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql dovecot-imapd dovecot-pop3d dovecot-common mysql-client mysql-server apache2 libapache2-mod-php5 php5 php5-mysql''​+<code bash>sudo apt-get install postfix postfix-mysql postfix-ldap postfix-doc postfix-tls libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql dovecot-imapd dovecot-pop3d dovecot-common mysql-client mysql-server apache2 libapache2-mod-php5 php5 php5-mysql</​code>​
  
 (здесь и далее соглашаемся с установкой дополнительных пакетов). (здесь и далее соглашаемся с установкой дополнительных пакетов).
Строка 79: Строка 83:
 Отвечаем на вопросы Отвечаем на вопросы
  
-**Новый пароль для MySQL пользователя "​root":​**+<note tip>**Новый пароль для MySQL пользователя "​root":​**</​note>​
  
-Обязательно устанавливаем пароль для пользователя root в mysql (это - не пароль пользователя root на компьютере,​ не путайте!). Здесь и далее это - +Обязательно устанавливаем пароль для пользователя ​//root// в //mysql// (это - не пароль пользователя ​//root// на компьютере,​ не путайте!). Здесь и далее это - 
  
-''​<​mysql_password>​''​+<code bash><​mysql_password>​</​code>​
  
-**Повторите ввод пароля для MySQL пользователя "​root":​**+<note tip>**Повторите ввод пароля для MySQL пользователя "​root":​**</​note>​
  
-''​<​mysql_password>​''​+<code bash><​mysql_password>​</​code>​
  
-**Выберите тип настройки почтового сервера,​ который оптимально удовлетворяет ваши требования.**+<note tip>**Выберите тип настройки почтового сервера,​ который оптимально удовлетворяет ваши требования.**</​note>​
  
 Здесь просто жмем ''<​OK>''​. Здесь просто жмем ''<​OK>''​.
  
-**Общий тип почтовой настройки:​**+<note tip>**Общий тип почтовой настройки:​**</​note>​
  
-Выбираем ​''​Internet - сайт''​+Выбираем ​
  
-**Системное почтовое имя:**+<code bash>​Internet - сайт</​code>​
  
-''​oban.aaa.ru''​+<note tip>​**Системное почтовое имя:​**</​note>​ 
 + 
 +<code bash>oban.aaa.ru</​code>​
  
 После окончания установки начнем конфигурацию. ​ После окончания установки начнем конфигурацию. ​
  
-Создадим базу данных mysql для хранения всей информации для почтового сервера ​+Создадим базу данных ​//mysql// для хранения всей информации для почтового сервера ​
  
-''​mysqladmin -u root -p create mail''​+<code bash>mysqladmin -u root -p create mail</​code>​
  
-Нас спросят пароль пользователя root mysql+Нас спросят пароль пользователя ​//root// //mysql//
  
-**Enter password:**+<note tip>**Enter password:**</​note>​
  
 Введем выбранный на этапе установки пароль Введем выбранный на этапе установки пароль
  
-''​<​mysql_password>​''​+<code bash><​mysql_password>​</​code>​
  
-Перейдем в оболочку mysql (опять вводя тот же пароль)+Перейдем в оболочку ​//mysql// (опять вводя тот же пароль)
  
-''​mysql -u root -p''​+<code bash>mysql -u root -p</​code>​
  
-Создадим специального пользователя mail_admin и паролем <​mail_admin_password>​ (замените!) для доступа к нашей базе данных mail с привилегиями SELECT, INSERT, UPDATE и DELETE. Доступ ему будет разрешен только с локального компьютера (т.е. с самого сервера):​+Создадим специального пользователя ​//mail_admin// и паролем ​//<​mail_admin_password>​// (замените!) для доступа к нашей базе данных ​//mail// с привилегиями ​//SELECT////INSERT////UPDATE// и //DELETE//. Доступ ему будет разрешен только с локального компьютера (т.е. с самого сервера):​
  
-''​GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO '​mail_admin'​@'​localhost'​ IDENTIFIED BY '<​mail_admin_password>'; ​\\  +<code mysql>GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO '​mail_admin'​@'​localhost'​ IDENTIFIED BY '<​mail_admin_password>';​  
-GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO '​mail_admin'​@'​localhost.localdomain'​ IDENTIFIED BY '<​mail_admin_password>'; ​\\ +GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO '​mail_admin'​@'​localhost.localdomain'​ IDENTIFIED BY '<​mail_admin_password>';​ 
-FLUSH PRIVILEGES;''​+FLUSH PRIVILEGES;</​code>​
  
-Теперь создадим нужные нам таблицы в базе данных mail+Теперь создадим нужные нам таблицы в базе данных ​//mail// 
 + 
 +<code mysql>​use mail; 
 +CREATE TABLE domains (  
 +domain varchar(50) NOT NULL,  
 +PRIMARY KEY (domain) )  
 +TYPE=MyISAM;​  
 + 
 +CREATE TABLE forwardings (  
 +source varchar(80) NOT NULL,  
 +destination TEXT NOT NULL,  
 +PRIMARY KEY (source) )  
 +TYPE=MyISAM;​  
 + 
 +CREATE TABLE transport (  
 +domain varchar(128) NOT NULL DEFAULT '',​  
 +transport varchar(128) NOT NULL DEFAULT '',​  
 +UNIQUE KEY domain (`domain`)  
 +) ENGINE=MyISAM;​  
 + 
 +CREATE TABLE users (  
 +email varchar(80) NOT NULL,  
 +password varchar(20) NOT NULL,  
 +quota varchar(20) DEFAULT '​0',​ 
 +PRIMARY KEY (email)  
 +) TYPE=MyISAM;​ </​code>​
  
-''​use mail;\\ 
-CREATE TABLE domains ( \\ 
-domain varchar(50) NOT NULL, \\ 
-PRIMARY KEY (domain) ) \\ 
-TYPE=MyISAM;​ \\ 
-\\ 
-CREATE TABLE forwardings ( \\ 
-source varchar(80) NOT NULL, \\ 
-destination TEXT NOT NULL, \\ 
-PRIMARY KEY (source) ) \\ 
-TYPE=MyISAM;​ \\ 
-\\ 
-CREATE TABLE transport ( \\ 
-domain varchar(128) NOT NULL DEFAULT ' ', \\ 
-transport varchar(128) NOT NULL DEFAULT ' ', \\ 
-UNIQUE KEY domain (`domain`) \\ 
-) ENGINE=MyISAM;​ \\ 
-\\ 
-CREATE TABLE users ( \\ 
-email varchar(80) NOT NULL, \\ 
-password varchar(20) NOT NULL, \\ 
-quota varchar(20) DEFAULT '​0',​\\ 
-PRIMARY KEY (email) \\ 
-) TYPE=MyISAM;​ ''​ 
-\\ 
 (здесь мы задаем квоту для пользователей по умолчанию без лимита - 0) (здесь мы задаем квоту для пользователей по умолчанию без лимита - 0)
  
-и выйдем из оболочки mysql+и выйдем из оболочки ​//mysql// 
 + 
 +<code bash>​quit;</​code>​
  
-''​quit;''​ 
 ===== Настройка Postfix ===== ===== Настройка Postfix =====
-Сейчас нам необходимо указать Postfix, где ему искать информацию в базе данных. Для этого создадим шесть текстовых файлов. Как вы можете заметить,​ я указываю Postfix соединяться с MySQL через IP адрес 127.0.0.1 вместо localhost. Это связано с тем, что Postfix запущенный в chroot окружении не сможет иметь доступа к MySQL сокету,​ если будет пытаться использовать localhost для подключения. ​+Сейчас нам необходимо указать ​//Postfix//, где ему искать информацию в базе данных. Для этого создадим шесть текстовых файлов. Как вы можете заметить,​ я указываю ​//Postfix// соединяться с //MySQL// через IP адрес ​//127.0.0.1// вместо ​//localhost//. Это связано с тем, что ​//Postfix// запущенный в chroot окружении не сможет иметь доступа к //MySQL// сокету,​ если будет пытаться использовать ​//localhost// для подключения. ​
  
 Проверим,​ что mysql "​слушает"​ локальный IP адрес Проверим,​ что mysql "​слушает"​ локальный IP адрес
  
-''​cat /​etc/​mysql/​my.cnf | grep bind''​+<code bash>cat /​etc/​mysql/​my.cnf | grep bind</​code>​
  
-**bind-address = 127.0.0.1**+<note tip>**bind-address = 127.0.0.1**</​note>​
  
-Если пришлось поменять /​etc/​mysql/​my.cnf,​ то перезапустим mysql+Если пришлось поменять /​etc/​mysql/​my.cnf,​ то перезапустим ​//mysql//
  
-''​sudo service mysql restart''​+<code bash>sudo service mysql restart</​code>​
  
 и проверяем,​ что он действительно слушает этот адрес: ​ и проверяем,​ что он действительно слушает этот адрес: ​
  
-''​sudo netstat -tap | grep mysql ''​+<code bash>sudo netstat -tap | grep mysql </​code>​
  
-**tcp             0 localhost:​mysql ​        ​*:*                     ​LISTEN ​     5908/​mysqld ​    ​**+<note tip>**tcp 0 0 localhost:​mysql *:* LISTEN 5908/mysqld **</​note>​
  
 (здесь 5908- это номер процесса,​ у Вас будет другой). (здесь 5908- это номер процесса,​ у Вас будет другой).
  
-Теперь создадим файлы для того, чтобы postfix знал, где что искать в нашей базе данных:​+Теперь создадим файлы для того, чтобы ​//postfix// знал, где что искать в нашей базе данных:​
  
-''​sudo nano /​etc/​postfix/​mysql-virtual_domains.cf''​+<code bash>sudo nano /​etc/​postfix/​mysql-virtual_domains.cf</​code>​
  
 <​file>​user = mail_admin ​ <​file>​user = mail_admin ​
Строка 188: Строка 195:
 hosts = 127.0.0.1</​file>​ hosts = 127.0.0.1</​file>​
  
-''​sudo nano /​etc/​postfix/​mysql-virtual_forwardings.cf''​+<code bash>sudo nano /​etc/​postfix/​mysql-virtual_forwardings.cf</​code>​
  
 <​file>​user = mail_admin ​ <​file>​user = mail_admin ​
Строка 196: Строка 203:
 hosts = 127.0.0.1</​file>​ hosts = 127.0.0.1</​file>​
  
-''​sudo nano /​etc/​postfix/​mysql-virtual_mailboxes.cf''​+<code bash>sudo nano /​etc/​postfix/​mysql-virtual_mailboxes.cf</​code>​
  
 <​file>​user = mail_admin ​ <​file>​user = mail_admin ​
Строка 204: Строка 211:
 hosts = 127.0.0.1</​file>​ hosts = 127.0.0.1</​file>​
  
-''​sudo nano /​etc/​postfix/​mysql-virtual_email2email.cf''​+<code bash>sudo nano /​etc/​postfix/​mysql-virtual_email2email.cf</​code>​
  
 <​file>​user = mail_admin ​ <​file>​user = mail_admin ​
Строка 212: Строка 219:
 hosts = 127.0.0.1</​file>​ hosts = 127.0.0.1</​file>​
  
-''​sudo nano touch /​etc/​postfix/​mysql-virtual_transports.cf''​+<code bash>sudo nano /​etc/​postfix/​mysql-virtual_transports.cf</​code>​
  
 <​file>​user = mail_admin ​ <​file>​user = mail_admin ​
Строка 220: Строка 227:
 hosts = 127.0.0.1</​file>​ hosts = 127.0.0.1</​file>​
  
-Т.к. в этих файлах у нас лежит пароль для доступа к базе данных,​ меняем права доступа к ним (разрешаем чтение только группе postfix, в которую входит наш почтовый сервер postfix):+Т.к. в этих файлах у нас лежит пароль для доступа к базе данных,​ меняем права доступа к ним (разрешаем чтение только группе ​//postfix//, в которую входит наш почтовый сервер ​//postfix//):
  
-''​sudo chmod o= /​etc/​postfix/​mysql-virtual_*.cf ​\\ +<code bash>sudo chmod o= /​etc/​postfix/​mysql-virtual_*.cf  
-sudo chgrp postfix /​etc/​postfix/​mysql-virtual_*.cf''​+sudo chgrp postfix /​etc/​postfix/​mysql-virtual_*.cf</​code>​
  
 Проверяем права доступа к этим файлам:​ Проверяем права доступа к этим файлам:​
  
-''​ls -al /​etc/​postfix/​mysql-virtual*.cf''​+<code bash>ls -al /​etc/​postfix/​mysql-virtual*.cf</​code>​
  
-**-rw-r----- 1 root postfix 134 2010-11-26 11:24 /​etc/​postfix/​mysql-virtual_domains.cf \\+<note tip>**-rw-r----- 1 root postfix 134 2010-11-26 11:24 /​etc/​postfix/​mysql-virtual_domains.cf \\
 -rw-r----- 1 root postfix 119 2010-11-26 11:25 /​etc/​postfix/​mysql-virtual_email2email.cf \\ -rw-r----- 1 root postfix 119 2010-11-26 11:25 /​etc/​postfix/​mysql-virtual_email2email.cf \\
 -rw-r----- 1 root postfix 132 2010-11-26 11:24 /​etc/​postfix/​mysql-virtual_forwardings.cf \\ -rw-r----- 1 root postfix 132 2010-11-26 11:24 /​etc/​postfix/​mysql-virtual_forwardings.cf \\
 -rw-r----- 1 root postfix 188 2010-11-26 11:25 /​etc/​postfix/​mysql-virtual_mailboxes.cf \\ -rw-r----- 1 root postfix 188 2010-11-26 11:25 /​etc/​postfix/​mysql-virtual_mailboxes.cf \\
--rw-r----- 1 root postfix 128 2010-11-26 11:25 /​etc/​postfix/​mysql-virtual_transports.cf**+-rw-r----- 1 root postfix 128 2010-11-26 11:25 /​etc/​postfix/​mysql-virtual_transports.cf**</​note>​
  
-Создаем нового пользователя и группу с названием vmail с домашней директорией /home/vmail ,  где будут находится почтовые ящики:+Создаем нового пользователя и группу с названием ​//vmail// с домашней директорией /home/vmail ,  где будут находится почтовые ящики:
  
-''​sudo groupadd -g 5000 vmail \\ +<code bash>sudo groupadd -g 5000 vmail \\ 
-sudo useradd -g vmail -u 5000 vmail -d /home/vmail -m''​+sudo useradd -g vmail -u 5000 vmail -d /home/vmail -m</​code>​
  
-Предварительная настройка postfix (нам еще придется ее менять чуть позже). Не забудьте поменять oban.aaa.ru на Ваше реальное полное имя сервера,​ а то postfix не будет работать! ​+Предварительная настройка ​//postfix// (нам еще придется ее менять чуть позже). Не забудьте поменять ​//oban.aaa.ru// на Ваше реальное полное имя сервера,​ а то //postfix// не будет работать! ​
  
-''​sudo postconf -e '​myhostname = oban.aaa.ru' ​\\ +<code bash>sudo postconf -e '​myhostname = oban.aaa.ru'​  
-sudo postconf -e '​mydestination = oban.aaa.ru,​ localhost, localhost.localdomain' ​\\ +sudo postconf -e '​mydestination = oban.aaa.ru,​ localhost, localhost.localdomain'​  
-sudo postconf -e '​mynetworks = 127.0.0.0/​8' ​\\ +sudo postconf -e '​mynetworks = 127.0.0.0/​8'​  
-sudo postconf -e '​virtual_alias_domains =' ​\\ +sudo postconf -e '​virtual_alias_domains ='  
-sudo postconf -e '​virtual_alias_maps = proxy:​mysql:/​etc/​postfix/​mysql-virtual_forwardings.cf,​ mysql:/​etc/​postfix/​mysql-virtual_email2email.cf' ​\\ +sudo postconf -e '​virtual_alias_maps = proxy:​mysql:/​etc/​postfix/​mysql-virtual_forwardings.cf,​ mysql:/​etc/​postfix/​mysql-virtual_email2email.cf'​  
-sudo postconf -e '​virtual_mailbox_domains = proxy:​mysql:/​etc/​postfix/​mysql-virtual_domains.cf' ​\\ +sudo postconf -e '​virtual_mailbox_domains = proxy:​mysql:/​etc/​postfix/​mysql-virtual_domains.cf'​  
-sudo postconf -e '​virtual_mailbox_maps = proxy:​mysql:/​etc/​postfix/​mysql-virtual_mailboxes.cf' ​\\ +sudo postconf -e '​virtual_mailbox_maps = proxy:​mysql:/​etc/​postfix/​mysql-virtual_mailboxes.cf'​  
-sudo postconf -e '​virtual_mailbox_base = /​home/​vmail' ​\\ +sudo postconf -e '​virtual_mailbox_base = /​home/​vmail'​  
-sudo postconf -e '​virtual_uid_maps = static:​5000' ​\\ +sudo postconf -e '​virtual_uid_maps = static:​5000'​  
-sudo postconf -e '​virtual_gid_maps = static:​5000' ​\\ +sudo postconf -e '​virtual_gid_maps = static:​5000'​  
-sudo postconf -e '​smtpd_sasl_auth_enable = yes' ​\\ +sudo postconf -e '​smtpd_sasl_auth_enable = yes'  
-sudo postconf -e '​broken_sasl_auth_clients = yes' ​\\ +sudo postconf -e '​broken_sasl_auth_clients = yes'  
-sudo postconf -e '​smtpd_sasl_authenticated_header = yes' ​\\ +sudo postconf -e '​smtpd_sasl_authenticated_header = yes'  
-sudo postconf -e '​smtpd_recipient_restrictions = permit_mynetworks,​ permit_sasl_authenticated,​ reject_unauth_destination' ​\\ +sudo postconf -e '​smtpd_recipient_restrictions = permit_mynetworks,​ permit_sasl_authenticated,​ reject_unauth_destination'​  
-sudo postconf -e '​smtpd_use_tls = yes' ​\\ +sudo postconf -e '​smtpd_use_tls = yes'  
-sudo postconf -e '​smtpd_tls_cert_file = /​etc/​postfix/​smtp.crt' ​\\ +sudo postconf -e '​smtpd_tls_cert_file = /​etc/​postfix/​smtp.crt'​  
-sudo postconf -e '​smtpd_tls_key_file = /​etc/​postfix/​smtp.key' ​\\ +sudo postconf -e '​smtpd_tls_key_file = /​etc/​postfix/​smtp.key'​  
-sudo postconf -e '​transport_maps = proxy:​mysql:/​etc/​postfix/​mysql-virtual_transports.cf' ​\\ +sudo postconf -e '​transport_maps = proxy:​mysql:/​etc/​postfix/​mysql-virtual_transports.cf'​  
-sudo postconf -e '​virtual_create_maildirsize = yes' \\ +sudo postconf -e '​proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks' ​</​code>​
-sudo postconf -e '​virtual_mailbox_extended = yes' \\ +
-sudo postconf -e '​proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks ​$virtual_mailbox_limit_maps'​ ''+
 ===== Создание SSL-сертификатов ===== ===== Создание SSL-сертификатов =====
-Теперь создадим SSL сертификаты для TLS. Лучше всего (хотя и не обязательно) создать вначале свой CA (Certificate Authority), а потом подписать от его имени все сертификаты (нам еще понадобятся сертификаты для dovecot). В этом случае клиентам нужно будет добавить доверие к этому CA, а не каждому сертификату отдельно.+Теперь создадим SSL сертификаты для TLS. Лучше всего (хотя и не обязательно) создать вначале свой CA (Certificate Authority), а потом подписать от его имени все сертификаты (нам еще понадобятся сертификаты для ​//dovecot//). В этом случае клиентам нужно будет добавить доверие к этому CA, а не каждому сертификату отдельно.
  
 Создаем CA.  Создаем CA. 
Строка 270: Строка 275:
 Создадим папку, в которой будем генерить все сертификаты ​ Создадим папку, в которой будем генерить все сертификаты ​
  
-''​mkdir ~/CA_clean''​+<code bash>mkdir ~/CA_clean</​code>​
  
 Нам нужно вначале подготовить конфигурационный файл для создания CA  Нам нужно вначале подготовить конфигурационный файл для создания CA 
  
-''​nano ca.conf''​+<code bash>nano ca.conf</​code>​
  
 <​file>​[req] ​ <​file>​[req] ​
Строка 303: Строка 308:
 Здесь и далее (замените на нужное Вам): Здесь и далее (замените на нужное Вам):
  
-C= RU (страна) ​\\ +//C// = RU (страна)  
-ST = Moscow Region (регион) ​\\ + 
-L = Moscow (город) ​\\ +//ST// = Moscow Region (регион)  
-O = AAA Ltd. (название компании) ​\\ + 
-CN = aaa.ru (имя сервера,​ для которого выдается ключ; в случае CA - имя домена) ​\\ +//L// = Moscow (город)  
-emailAddress = admin@aaa.ru (почтовый адрес администратора) ​+ 
 +//O// = AAA Ltd. (название компании)  
 + 
 +//CN// = aaa.ru (имя сервера,​ для которого выдается ключ; в случае CA - имя домена)  
 + 
 +//emailAddress// = admin@aaa.ru (почтовый адрес администратора) ​
  
 (закоментаренные строки нужны только,​ если Вы действительно хотите иметь более-менее нормальный CA с листами отзыва ключей и т.п., но это выходит за рамки этого how-to) (закоментаренные строки нужны только,​ если Вы действительно хотите иметь более-менее нормальный CA с листами отзыва ключей и т.п., но это выходит за рамки этого how-to)
Строка 314: Строка 324:
 Создаем частный ключ ключ CA Создаем частный ключ ключ CA
  
-''​sudo openssl genrsa -des3 -out ca.key 4096''​+<code bash>sudo openssl genrsa -des3 -out ca.key 4096</​code>​
  
-**Enter pass phrase for ca.key: **+<note tip>**Enter pass phrase for ca.key: **</​note>​
  
-**Verifying - Enter pass phrase for ca.key: **+Введите пароль для файла ​ca.key ​(два раза для подтверждения) и не забывайте его!
  
-Введите пароль для файла ​ca.key ​(два раза для подтверждения) и не забывайте его! ​Он будет нужен для подписывания всех ключей (здесь используем sudo т.к. при этом переписывается состояние random_state компьютера)+<note tip>​**Verifying - Enter pass phrase for ca.key: **</​note>​ 
 + 
 +Он будет нужен для подписывания всех ключей (здесь используем ​//sudo// т.к. при этом переписывается состояние ​//random_state// компьютера)
  
 Создаем открытый ключ CA. Мы говорим,​ что ключи нашего CA имеют "​срок жизни"​ 10 лет (-days 3650). Создаем открытый ключ CA. Мы говорим,​ что ключи нашего CA имеют "​срок жизни"​ 10 лет (-days 3650).
  
-''​openssl req -new -x509 -nodes -sha1 -days 3650 -key ca.key -out ca.crt -config ca.conf''​+<code bash>openssl req -new -x509 -nodes -sha1 -days 3650 -key ca.key -out ca.crt -config ca.conf</​code>​
  
-**Enter pass phrase for ca.key: **+<note tip>**Enter pass phrase for ca.key: **</​note>​
  
 (вводим выбранный нами на предыдущем шаге пароль закрытого ключа CA) (вводим выбранный нами на предыдущем шаге пароль закрытого ключа CA)
Строка 332: Строка 344:
 Создаем сертификат для подписывания:​ Создаем сертификат для подписывания:​
  
-''​openssl x509 -trustout -inform PEM -in ca.crt -outform DER -out ca.pfx''​+<code bash>​openssl pkcs12 -export -in ca.cer -inkey ca.key -out ca.pfx</​code>​ 
 + 
 +<del>openssl x509 -trustout -inform PEM -in ca.crt -outform DER -out ca.pfx</​del>​
  
-Создадим директорию,​ в которой у нас будут лежать все ключи для всех серверов (если мы в дальнейшем будем создавать и подписывать ключи для других серверов;​ например,​ захотим,​ чтобы ключи были разные для smtp.aaa.ru pop3.aaa.ru и imap.aaa.ru) и, соответственно,​ директории для всех имен серверов (в нашем случае — oban.aaa.ru) ​+Создадим директорию,​ в которой у нас будут лежать все ключи для всех серверов (если мы в дальнейшем будем создавать и подписывать ключи для других серверов;​ например,​ захотим,​ чтобы ключи были разные для ​//smtp.aaa.ru// //pop3.aaa.ru// и //imap.aaa.ru//) и, соответственно,​ директории для всех имен серверов (в нашем случае — //oban.aaa.ru//
  
-''​mkdir SERVERS ​\\ +<code bash>mkdir SERVERS  
-mkdir SERVERS/​oban.aaa.ru''​+mkdir SERVERS/​oban.aaa.ru</​code>​
  
 Создаем файлы конфигураций для ключей серверов (в каждой директории - свой файл, т.к. в нем записано имя сервера). В случае одного имени (замените на нужные Вам значения):​ Создаем файлы конфигураций для ключей серверов (в каждой директории - свой файл, т.к. в нем записано имя сервера). В случае одного имени (замените на нужные Вам значения):​
  
-''​nano SERVERS/​oban.aaa.ru/​openssl.conf''​+<code bash>nano SERVERS/​oban.aaa.ru/​openssl.conf</​code>​
  
 <​file>​[ req ]  <​file>​[ req ] 
Строка 359: Строка 373:
 subjectKeyIdentifier = hash </​file>​ subjectKeyIdentifier = hash </​file>​
  
-Теперь сгенерим ключи для нашего сервера (заметьте,​ что мы опять используем здесь sudo):+Теперь сгенерим ключи для нашего сервера (заметьте,​ что мы опять используем здесь ​//sudo//):
  
-''​sudo openssl genrsa -passout pass:1234 -des3 -out SERVERS/​oban.aaa.ru/​server.key.1 2048''​+<code bash>sudo openssl genrsa -passout pass:1234 -des3 -out SERVERS/​oban.aaa.ru/​server.key.1 2048</​code>​
  
-Здесь 1234 — парольная фраза для промежуточного ключа. Она нам нужна только временно,​ т.к. мы в результате хотим получить ключ без пароля (требование postfix).+Здесь 1234 — парольная фраза для промежуточного ключа. Она нам нужна только временно,​ т.к. мы в результате хотим получить ключ без пароля (требование ​//postfix//).
  
 Убираем из ключа парольную фразу: Убираем из ключа парольную фразу:
  
-''​openssl rsa -passin pass:1234 -in SERVERS/​oban.aaa.ru/​server.key.1 -out SERVERS/​oban.aaa.ru/​server.key''​+<code bash>openssl rsa -passin pass:1234 -in SERVERS/​oban.aaa.ru/​server.key.1 -out SERVERS/​oban.aaa.ru/​server.key</​code>​
  
 Генерим запрос на подпись нашего ключа ​ Генерим запрос на подпись нашего ключа ​
  
-''​openssl req -config SERVERS/​oban.aaa.ru/​openssl.conf -new -key SERVERS/​oban.aaa.ru/​server.key -out SERVERS/​oban.aaa.ru/​server.csr ​''​+<code bash>openssl req -config SERVERS/​oban.aaa.ru/​openssl.conf -new -key SERVERS/​oban.aaa.ru/​server.key -out SERVERS/​oban.aaa.ru/​server.csr ​</​code>​
  
 и удаляем промежуточный ключ ​ и удаляем промежуточный ключ ​
  
-''​rm -f SERVERS/​oban.aaa.ru/​server.key.1''​+<code bash>rm -f SERVERS/​oban.aaa.ru/​server.key.1</​code>​
  
 Теперь нам нужно подписать наш созданный ключ от имени своего CA  Теперь нам нужно подписать наш созданный ключ от имени своего CA 
Строка 381: Строка 395:
 Сделаем конфигурационный файл для подписи (срок действия подписи 5 лет - 1828 дней): Сделаем конфигурационный файл для подписи (срок действия подписи 5 лет - 1828 дней):
  
-''​nano sign.config ​''​+<code bash>nano sign.config ​</​code>​
  
 <​file>​[ ca ]  <​file>​[ ca ] 
Строка 414: Строка 428:
 и создадим директорию для хранения сертификатов подписей:​ и создадим директорию для хранения сертификатов подписей:​
  
-''​mkdir ca.db.certs''​+<code bash>mkdir ca.db.certs</​code>​
  
 Для первого подписанного ключа создаем его номер и формируем индексный файл (для остальных - не нужно!) ​ Для первого подписанного ключа создаем его номер и формируем индексный файл (для остальных - не нужно!) ​
  
-''​echo '​01'​ > ca.db.serial ​\\ +<code bash>echo '​01'​ > ca.db.serial  
-cp /dev/null ca.db.index ​''​+cp /dev/null ca.db.index ​</​code>​
  
-и подписываем (обратите внимание,​ что мы опять используем sudo)+и подписываем (обратите внимание,​ что мы опять используем ​//sudo//)
  
-''​sudo openssl ca -batch -config sign.config -out SERVERS/​oban.aaa.ru/​server.crt -infiles SERVERS/​oban.aaa.ru/​server.csr''​+<code bash>sudo openssl ca -batch -config sign.config -out SERVERS/​oban.aaa.ru/​server.crt -infiles SERVERS/​oban.aaa.ru/​server.csr</​code>​
  
-**Enter pass phrase for ca.key: **+<note tip>**Enter pass phrase for ca.key: **</​note>​
  
 (введем пароль закрытого ключа CA) (введем пароль закрытого ключа CA)
Строка 431: Строка 445:
 Проверим подпись (на всякий случай):​ Проверим подпись (на всякий случай):​
  
-''​openssl verify -CAfile ca.crt SERVERS/​oban.aaa.ru/​server.crt''​+<code bash>openssl verify -CAfile ca.crt SERVERS/​oban.aaa.ru/​server.crt</​code>​
  
 Мы должны получить Мы должны получить
  
-**SERVERS/​oban.aaa.ru/​server.crt:​ OK**+<note tip>**SERVERS/​oban.aaa.ru/​server.crt:​ OK**</​note>​
  
 Номер ключа и индексный файл автоматически обновились,​ удалим старые файлы ​ Номер ключа и индексный файл автоматически обновились,​ удалим старые файлы ​
  
-''​rm -f ca.db.serial.old ​\\ +<code bash>rm -f ca.db.serial.old  
-rm -rf ca.db.index.old''​+rm -rf ca.db.index.old</​code>​
  
 Скопируем ключи в директорию /etc/ssl Скопируем ключи в директорию /etc/ssl
  
-''​sudo cp SERVERS/​oban.aaa.ru/​server.key /​etc/​ssl/​private/​oban.key ​\\ +<code bash>sudo cp SERVERS/​oban.aaa.ru/​server.key /​etc/​ssl/​private/​oban.key  
-sudo cp SERVERS/​oban.aaa.ru/​server.crt /​etc/​ssl/​certs/​oban.crt''​+sudo cp SERVERS/​oban.aaa.ru/​server.crt /​etc/​ssl/​certs/​oban.crt</​code>​
  
 и сменим права доступа к закрытому ключу и сменим права доступа к закрытому ключу
  
-''​sudo chmod og= /​etc/​ssl/​private/​oban.key''​+<code bash>sudo chmod og= /​etc/​ssl/​private/​oban.key</​code>​
  
 Теперь установим доверие к новому CA. Для этого создадим папку для него ​ Теперь установим доверие к новому CA. Для этого создадим папку для него ​
  
-''​sudo mkdir /​usr/​share/​ca-certificates/​aaa ​''​+<code bash>sudo mkdir /​usr/​share/​ca-certificates/​aaa ​</​code>​
  
 и скопируем туда наш сертификат CA  и скопируем туда наш сертификат CA 
  
-''​sudo cp ca.crt /​usr/​share/​ca-certificates/​aaa/ ​''​+<code bash>sudo cp ca.crt /​usr/​share/​ca-certificates/​aaa/ ​</​code>​
  
 После этого переконфигурируем наши корневые сертификаты ​ После этого переконфигурируем наши корневые сертификаты ​
  
-''​sudo dpkg-reconfigure ca-certificates ​''​+<code bash>sudo dpkg-reconfigure ca-certificates ​</​code>​
  
 (ответим,​ что мы хотим доверять новым сертификатам и выберем в списке наш новый сертификат для активации) (ответим,​ что мы хотим доверять новым сертификатам и выберем в списке наш новый сертификат для активации)
  
-Нашим клиентам,​ которые будут связываться с нашим ​первером с использованием шифрования (TLS, SSL) или с нашим веб-сервером по протоколу ​https нужно установить доверие к нашему CA. Тем или иным способом передайте им открытый ключ нашего CA - ca.crt. ​+Нашим клиентам,​ которые будут связываться с нашим ​сервером с использованием шифрования (TLS, SSL) или с нашим веб-сервером по протоколу ​HTTPS нужно установить доверие к нашему CA. Тем или иным способом передайте им открытый ключ нашего CA - ca.crt. ​ 
 <note warning>​Внимание! Никогда никому не передавайте созданные приватные ключи *.key и не делайте их доступными! </​note>​ <note warning>​Внимание! Никогда никому не передавайте созданные приватные ключи *.key и не делайте их доступными! </​note>​
 ===== Настройка saslauthd ===== ===== Настройка saslauthd =====
-Авторизация почтовых пользователей на нашем сервере будет происходить через pam, к которому будет обращаться демон авторизации sasl.+Авторизация почтовых пользователей на нашем сервере будет происходить через ​//pam//, к которому будет обращаться демон авторизации ​//sasl//.
  
 Сначала выполним следующую команду: ​ Сначала выполним следующую команду: ​
  
-''​sudo mkdir -p /​var/​spool/​postfix/​var/​run/​saslauthd ​''​+<code bash>sudo mkdir -p /​var/​spool/​postfix/​var/​run/​saslauthd ​</​code>​
  
 Затем отредактируем файл /​etc/​default/​saslauthd Затем отредактируем файл /​etc/​default/​saslauthd
  
-''​sudo nano /​etc/​default/​saslauthd''​+<code bash>sudo nano /​etc/​default/​saslauthd</​code>​
  
 Установим параметр ''​START''​ в ''​yes''​ и заменим строку ''​OPTIONS="​-c -m /​var/​run/​saslauthd"''​ на ''​OPTIONS="​-c -m /​var/​spool/​postfix/​var/​run/​saslauthd -r"''​ Установим параметр ''​START''​ в ''​yes''​ и заменим строку ''​OPTIONS="​-c -m /​var/​run/​saslauthd"''​ на ''​OPTIONS="​-c -m /​var/​spool/​postfix/​var/​run/​saslauthd -r"''​
Строка 482: Строка 497:
 Создадим файл /​etc/​pam.d/​smtp Создадим файл /​etc/​pam.d/​smtp
  
-''​sudo nano /​etc/​pam.d/​smtp''​+<code bash>sudo nano /​etc/​pam.d/​smtp</​code>​
  
 <​file>​auth sufficient pam_mysql.so user=mail_admin passwd=<​mail_admin_password>​ host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1 ​ <​file>​auth sufficient pam_mysql.so user=mail_admin passwd=<​mail_admin_password>​ host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1 ​
Строка 489: Строка 504:
 и сменим его права доступа и сменим его права доступа
  
-''​sudo chmod o= /​etc/​pam.d/​smtp''​+<code bash>sudo chmod o= /​etc/​pam.d/​smtp</​code>​
  
 Создаем файл /​etc/​postfix/​sasl/​smtpd.conf Создаем файл /​etc/​postfix/​sasl/​smtpd.conf
  
-''​sudo nano /​etc/​postfix/​sasl/​smtpd.conf''​+<code bash>sudo nano /​etc/​postfix/​sasl/​smtpd.conf</​code>​
  
 <​file>​pwcheck_method:​ saslauthd ​ <​file>​pwcheck_method:​ saslauthd ​
Строка 501: Строка 516:
 и меняем ему владельца и права доступа и меняем ему владельца и права доступа
  
-''​sudo chown postfix /​etc/​postfix/​sasl/​smtpd.conf ​\\ +<code bash>sudo chown postfix /​etc/​postfix/​sasl/​smtpd.conf  
-sudo chmod og= /​etc/​postfix/​sasl/​smtpd.conf''​+sudo chmod og= /​etc/​postfix/​sasl/​smtpd.conf</​code>​
  
-Добавляем пользователя postfix в группу sasl (это даст Postfix права доступа к saslauthd): ​+Добавляем пользователя ​//postfix// в группу ​//sasl// (это даст ​//Postfix// права доступа к //saslauthd//): 
  
-''​sudo adduser postfix sasl ''​+<code bash>sudo adduser postfix sasl </​code>​
  
-Перезапускаем Postfix и Saslauthd: ​+Перезапускаем ​//Postfix// и //Saslauthd//
  
-''​sudo /​etc/​init.d/​postfix restart ​\\ +<code bash>sudo /​etc/​init.d/​postfix restart  
-sudo /​etc/​init.d/​saslauthd restart''​+sudo /​etc/​init.d/​saslauthd restart</​code>​
  
-Для проверки авторизации создадим пользователя admin@bbb.ru в базе данных (заодно вначале в таблице domains зададим оба наших почтовых домена — aaa.ru и bbb.ru):+Для проверки авторизации создадим пользователя ​//admin@bbb.ru// в базе данных (заодно вначале в таблице ​//domains// зададим оба наших почтовых домена — //aaa.ru// и //bbb.ru//):
  
-''​mysql -u root -p''​+<code bash>mysql -u root -p</​code>​
  
-**Enter password:**+<note tip>**Enter password:**</​note>​
  
-ведем пароль mysql)+Введем пароль mysql
  
-''​USE mail; \\ +<code bash><​mysql_password></​code>​ 
-INSERT INTO `domains` (`domain`) VALUES ('​aaa.ru'​); ​\\ + 
-INSERT INTO `domains` (`domain`) VALUES ('​bbb.ru'​); ​\\ +<code mysql>USE mail;  
-INSERT INTO `users` (`email`, `password`, `quota`) VALUES ('​admin@bbb.ru',​ ENCRYPT('​secret'​),​ '​10M'​); ​\\ +INSERT INTO `domains` (`domain`) VALUES ('​aaa.ru'​);​  
-quit;''​+INSERT INTO `domains` (`domain`) VALUES ('​bbb.ru'​);​  
 +INSERT INTO `users` (`email`, `password`, `quota`) VALUES ('​admin@bbb.ru',​ ENCRYPT('​secret'​),​ '​10M'​);​  
 +quit;</​code>​
  
-(здесь secret - это пароль нашего пользователя,​ выберите более подходящий;​ квоту пользователю мы задаем в размере 10Мбайт)+(здесь ​//secret// - это пароль нашего пользователя,​ выберите более подходящий;​ квоту пользователю мы задаем в размере 10Мбайт)
  
 Для проверки авторизации нам нужно сгенерить строку,​ которую нужно передать при авторизации (обратите внимание на обратные слеши перед @ и 0): Для проверки авторизации нам нужно сгенерить строку,​ которую нужно передать при авторизации (обратите внимание на обратные слеши перед @ и 0):
  
-''​perl -MMIME::​Base64 -e 'print encode_base64("​admin\@bbb.ru\0admin\@bbb.ru\0secret"​);' ​''​+<code bash>perl -MMIME::​Base64 -e 'print encode_base64("​admin\@bbb.ru\0admin\@bbb.ru\0secret"​);' ​</​code>​
  
-**YWRtaW5AYmJiLnJ1AGFkbWluQGJiYi5ydQBzZWNyZXQ= **+<note tip>**YWRtaW5AYmJiLnJ1AGFkbWluQGJiYi5ydQBzZWNyZXQ= **</​note>​
  
 Теперь проверим авторизацию Теперь проверим авторизацию
  
-''​telnet 127.0.0.1 25''​+<code bash>telnet 127.0.0.1 25</​code>​
  
-**Trying 127.0.0.1... \\+<note tip>**Trying 127.0.0.1... \\
 Connected to 127.0.0.1. \\ Connected to 127.0.0.1. \\
 Escape character is '​^]'​. \\ Escape character is '​^]'​. \\
-220 oban.aaa.ru ESMTP Postfix (Ubuntu)**+220 oban.aaa.ru ESMTP Postfix (Ubuntu)**</​note>​
  
-''​EHLO testing''​+<code bash>EHLO testing</​code>​
  
-**250-oban.aaa.ru \\+<note tip>**250-oban.aaa.ru \\
 250-PIPELINING \\ 250-PIPELINING \\
 250-SIZE 10240000 \\ 250-SIZE 10240000 \\
Строка 556: Строка 573:
 250-ENHANCEDSTATUSCODES\\ ​ 250-ENHANCEDSTATUSCODES\\ ​
 250-8BITMIME \\ 250-8BITMIME \\
-250 DSN**+250 DSN**</​note>​
  
-''​AUTH PLAIN YWRtaW5AYmJiLnJ1AGFkbWluQGJiYi5ydQBzZWNyZXQ=''​+<code bash>AUTH PLAIN YWRtaW5AYmJiLnJ1AGFkbWluQGJiYi5ydQBzZWNyZXQ=</​code>​
  
 (здесь вставляем полученную ранее строку авторизации) (здесь вставляем полученную ранее строку авторизации)
  
-**235 2.7.0 Authentication successful **+<note tip>**235 2.7.0 Authentication successful **</​note>​
  
-''​QUIT ''​+<code bash>QUIT </​code>​
  
-**221 2.0.0 Bye \\ +<note tip>**221 2.0.0 Bye \\ 
-Connection closed by foreign host.**+Connection closed by foreign host.**</​note>​
  
-Если мы получим ответ, отличный от "​Authentication successful",​ то мы где-то ошиблись. Проверить,​ в чем именно,​ можно, посмотрев файлы /​var/​log/​auth.log и /​var/​log/​mail.log+Если мы получим ответ, отличный от **"​Authentication successful"​**, то мы где-то ошиблись. Проверить,​ в чем именно,​ можно, посмотрев файлы /​var/​log/​auth.log и /​var/​log/​mail.log
  
-Теперь сделаем аутентификацию по openldap. Установим нужные пакеты:​+Теперь сделаем аутентификацию по //openldap//. Установим нужные пакеты:​
  
-''​sudo apt-get install libpam-ldap''​+<code bash>sudo apt-get install libpam-ldap</​code>​
  
 и ответим на вопросы:​ и ответим на вопросы:​
  
-**LDAP server Uniform Resource Identifier:​**+<note tip>**LDAP server Uniform Resource Identifier:​**</​note>​
  
-''​%%ldap://​10.0.0.3/​%%''​ (обратите внимание — не ldapi)+<code bash>ldap://​10.0.0.3/​</​code>​ <note important>​Обратите внимание — не ldapi!</​note>​
  
-**Distinguished name of the search base:**+<note tip>**Distinguished name of the search base:**</​note>​
  
-''​dc=aaa,​dc=ru''​+<code bash>dc=aaa,​dc=ru</​code>​
  
-**LDAP version to use:**+<note tip>**LDAP version to use:**</​note>​
  
-''​3''​+<code bash>3</​code>​
  
-**Make local root Database admin:**+<note tip>**Make local root Database admin:**</​note>​
  
-''​Да''​+<code bash>Да</​code>​
  
-**Does the LDAP database require login?**+<note tip>**Does the LDAP database require login?**</​note>​
  
-''​Нет''​+<code bash>Нет</​code>​
  
-**LDAP account for root: **+<note tip>**LDAP account for root: **</​note>​
  
-''​cn=admin,​dc=aaa,​dc=ru''​+<code bash>cn=admin,​dc=aaa,​dc=ru</​code>​
  
-**LDAP root account password:**+<note tip>**LDAP root account password:**</​note>​
  
-''​<​ldap_root_password>​''​+<code bash><​ldap_root_password>​</​code>​
  
 (конечно,​ нужное замените на свои параметры). Здесь мы предполагаем,​ что: (конечно,​ нужное замените на свои параметры). Здесь мы предполагаем,​ что:
  
-  * ldap-сервер доступен по IP 10.0.0.3 +  * ldap-сервер доступен по IP //10.0.0.3// 
-  * корень расположен в dc=aaa,​dc=ru +  * корень расположен в //dc=aaa,​dc=ru// 
-  * администратор ldap-сервера это cn=admin,​dc=aaa,​dc=ru +  * администратор ldap-сервера это ​//cn=admin,​dc=aaa,​dc=ru// 
-  * он имеет пароль <​ldap_root_password>​+  * он имеет пароль ​//<​ldap_root_password>​//
  
 Редактируем файл Редактируем файл
  
-''​sudo nano /​etc/​ldap.conf''​+<code bash>sudo nano /​etc/​ldap.conf</​code>​
  
-и добавляем в него одну строку после закомментаренной #​bind_policy hard+и добавляем в него одну строку после закомментаренной ​//#​bind_policy hard//
  
 <​file>​bind_policy soft</​file>​ <​file>​bind_policy soft</​file>​
Строка 622: Строка 639:
 Редактируем файл Редактируем файл
  
-''​sudo nano /​etc/​pam.d/​smtp''​+<code bash>sudo nano /​etc/​pam.d/​smtp</​code>​
  
 и добавляем в него строки ​ и добавляем в него строки ​
Строка 629: Строка 646:
 account sufficient pam_ldap.so</​file>​ account sufficient pam_ldap.so</​file>​
  
-Теперь можем проверить аутентификацию ldap-пользователя (предполагаем,​ что в ldap есть пользователь admin с паролем secret (у которого,​ кстати,​ почтовый адрес admin@aaa.ru,​ но это сейчас неважно;​ важно понимать,​ что это — другой пользователь,​ а не admin@bbb.ru):​+Теперь можем проверить аутентификацию ldap-пользователя (предполагаем,​ что в //ldap// есть пользователь ​//admin// с паролем ​//secret// (у которого,​ кстати,​ почтовый адрес ​//admin@aaa.ru//, но это сейчас неважно;​ важно понимать,​ что это — другой пользователь,​ а не //admin@bbb.ru//):
  
-''​perl -MMIME::​Base64 -e 'print encode_base64("​admin\0admin\0secret"​);' ​''​+<code bash>perl -MMIME::​Base64 -e 'print encode_base64("​admin\0admin\0secret"​);' ​</​code>​
  
-**YWRtaW4AYWRtaW4Ac2VjcmV0**+<note tip>**YWRtaW4AYWRtaW4Ac2VjcmV0**</​note>​
  
-''​telnet 127.0.0.1 25 ''​+<code bash>telnet 127.0.0.1 25 </​code>​
  
-**Trying 127.0.0.1... \\+<note tip>**Trying 127.0.0.1... \\
 Connected to 127.0.0.1. \\ Connected to 127.0.0.1. \\
 Escape character is '​^]'​. \\ Escape character is '​^]'​. \\
-220 oban.aaa.ru ESMTP Postfix (Ubuntu) **+220 oban.aaa.ru ESMTP Postfix (Ubuntu) **</​note>​
  
-''​EHLO testing ​''​+<code bash>EHLO testing ​</​code>​
  
-**250-oban.aaa.ru \\+<note tip>**250-oban.aaa.ru \\
 250-PIPELINING \\ 250-PIPELINING \\
 250-SIZE 10240000 \\ 250-SIZE 10240000 \\
Строка 654: Строка 671:
 250-ENHANCEDSTATUSCODES \\ 250-ENHANCEDSTATUSCODES \\
 250-8BITMIME \\ 250-8BITMIME \\
-250 DSN **+250 DSN **</​note>​
  
-''​AUTH PLAIN YWRtaW4AYWRtaW4Ac2VjcmV0''​+<code bash>AUTH PLAIN YWRtaW4AYWRtaW4Ac2VjcmV0</​code>​
  
-**235 2.7.0 Authentication successful **+<note tip>**235 2.7.0 Authentication successful **</​note>​
  
-''​QUIT ''​+<code bash>QUIT </​code>​
  
-**221 2.0.0 Bye \\ +<note tip>**221 2.0.0 Bye \\ 
-Connection closed by foreign host. **+Connection closed by foreign host. **</​note>​
  
-Для почтовых ящиков локальных пользователей будем использовать ​ldap. Заметьте,​ что мы конфигурируем их как виртуальных пользователей,​ т.е. локальный домен (aaa.ru) мы занесли в базу данных. Предположим,​ что локальные пользователи в ldap расположены в ou=Users,​dc=aaa,​dc=ru причем их имена записаны в uid а почтовые адреса - в mail. +Для почтовых ящиков локальных пользователей будем использовать ​LDAP. Заметьте,​ что мы конфигурируем их как виртуальных пользователей,​ т.е. локальный домен (aaa.ru) мы занесли в базу данных. Предположим,​ что локальные пользователи в LDAP расположены в //ou=Users,​dc=aaa,​dc=ru// причем их имена записаны в //uid// а почтовые адреса - в //mail//
  
 Создаем файл /​etc/​postfix/​ldap-mailboxes.cf Создаем файл /​etc/​postfix/​ldap-mailboxes.cf
  
-''​sudo nano /​etc/​postfix/​ldap-mailboxes.cf''​+<code bash>sudo nano /​etc/​postfix/​ldap-mailboxes.cf</​code>​
  
 <​file>​server_host = 10.0.0.3 ​ <​file>​server_host = 10.0.0.3 ​
Строка 684: Строка 701:
 Меняем права доступа Меняем права доступа
  
-''​sudo chgrp postfix /​etc/​postfix/​ldap-mailboxes.cf ​\\ +<code bash>sudo chgrp postfix /​etc/​postfix/​ldap-mailboxes.cf  
-sudo chmod o= /​etc/​postfix/​ldap-mailboxes.cf ​''​+sudo chmod o= /​etc/​postfix/​ldap-mailboxes.cf ​</​code>​
  
 и меняем строку ''​virtual_mailbox_maps = … ''​ в файле /​etc/​postfix/​main.cf и меняем строку ''​virtual_mailbox_maps = … ''​ в файле /​etc/​postfix/​main.cf
  
-''​sudo nano /​etc/​postfix/​main.cf''​+<code bash>sudo nano /​etc/​postfix/​main.cf</​code>​
  
 <​file>​virtual_mailbox_maps = proxy:​mysql:/​etc/​postfix/​mysql-virtual_mailboxes.cf ldap:/​etc/​postfix/​ldap-mailboxes.cf</​file>​ <​file>​virtual_mailbox_maps = proxy:​mysql:/​etc/​postfix/​mysql-virtual_mailboxes.cf ldap:/​etc/​postfix/​ldap-mailboxes.cf</​file>​
Строка 700: Строка 717:
 (это запрещает доставку писем с локального IP-адреса не в наши виртуальные домены) ​ (это запрещает доставку писем с локального IP-адреса не в наши виртуальные домены) ​
  
-Перезапускаем postfix ​+Перезапускаем ​//postfix// 
  
-''​sudo /​etc/​init.d/​postfix restart ​''​+<code bash>sudo /​etc/​init.d/​postfix restart ​</​code>​
  
-и проверяем работу обоих наших тестовых адресов - test@bbb.ru (который записан в базе данных) и betatest@aaa.ru (который записан в ldap у пользователя betatest) ​+и проверяем работу обоих наших тестовых адресов - //test@bbb.ru// (который записан в базе данных) и //betatest@aaa.ru// (который записан в LDAP у пользователя ​//betatest//
  
-''​telnet 127.0.0.1 25 ''​+<code bash>telnet 127.0.0.1 25 </​code>​
  
-**Trying 127.0.0.1... \\+<note tip>**Trying 127.0.0.1... \\
 Connected to 127.0.0.1. \\ Connected to 127.0.0.1. \\
 Escape character is '​^]'​. \\ Escape character is '​^]'​. \\
-220 oban.aaa.ru ESMTP Postfix (Ubuntu) **+220 oban.aaa.ru ESMTP Postfix (Ubuntu) **</​note>​
  
-''​HELO test ''​+<code bash>HELO test </​code>​
  
-**250 oban.aaa.ru **+<note tip>**250 oban.aaa.ru **</​note>​
  
-''​MAIL FROM: aaa@aa.aa ​''​+<code bash>MAIL FROM: aaa@aa.aa ​</​code>​
  
-**250 2.1.0 Ok **+<note tip>**250 2.1.0 Ok **</​note>​
  
-''​RCPT TO: admin@bbb.ru ​''​+<code bash>RCPT TO: admin@bbb.ru</​code>​
  
-**250 2.1.5 Ok **+<note tip>**250 2.1.5 Ok **</​note>​
  
-''​RCPT TO: admin@aaa.ru ​''​+<code bash>RCPT TO: admin@aaa.ru ​</​code>​
  
-**250 2.1.5 Ok **+<note tip>**250 2.1.5 Ok **</​note>​
  
 (если мы попробуем передать на несуществующий адрес, мы получим:​) ​ (если мы попробуем передать на несуществующий адрес, мы получим:​) ​
  
-''​RCPT TO: aaa@bbb.ru''​+<code bash>RCPT TO: aaa@bbb.ru</​code>​
  
-**550 5.1.1 %%<​aaa@bbb.ru>​%%:​ Recipient address rejected: User unknown in virtual mailbox table **+<note tip>**550 5.1.1 %%<​aaa@bbb.ru>​%%:​ Recipient address rejected: User unknown in virtual mailbox table **</​note>​
  
-''​QUIT ''​+<code bash>QUIT </​code>​
  
-**221 2.0.0 Bye \\ +<note tip>**221 2.0.0 Bye \\ 
-Connection closed by foreign host. **+Connection closed by foreign host. **</​note>​
  
 Вернем обратно строку в файле /​etc/​postfix/​main.cf:​ Вернем обратно строку в файле /​etc/​postfix/​main.cf:​
  
-''​sudo nano /​etc/​postfix/​main.cf''​+<code bash>sudo nano /​etc/​postfix/​main.cf</​code>​
  
 <​file>​smtpd_recipient_restrictions = permit_mynetworks,​ permit_sasl_authenticated,​ reject_unauth_destination</​file>​ <​file>​smtpd_recipient_restrictions = permit_mynetworks,​ permit_sasl_authenticated,​ reject_unauth_destination</​file>​
  
-Для запрета аутентификации в postfix с передачей данных открытым текстом,​ вставляем в файл /​etc/​postfix/​main.cf ​+Для запрета аутентификации в //postfix// с передачей данных открытым текстом,​ вставляем в файл /​etc/​postfix/​main.cf ​
  
-''​sudo nano /​etc/​postfix/​main.cf ​''​+<code bash>sudo nano /​etc/​postfix/​main.cf ​</​code>​
  
 <​file>​smtpd_tls_auth_only = yes  <​file>​smtpd_tls_auth_only = yes 
Строка 755: Строка 772:
 smtpd_use_tls = yes</​file>​ smtpd_use_tls = yes</​file>​
  
-и перезапускаем postfix+и перезапускаем ​//postfix//
  
-''​sudo /​etc/​init.d/​postfix restart''​+<code bash>sudo /​etc/​init.d/​postfix restart</​code>​
  
-Откроем и изменим /​etc/​aliases+Откроем и изменим /​etc/​aliases
  
-''​sudo nano /​etc/​aliases''​+<code bash>sudo nano /​etc/​aliases</​code>​
  
-Сделайте так, чтобы postmaster указывал на root, а root указывал на ваше имя пользователя или ваш почтовый адрес, у вас должно получится примерно так: ​+Сделайте так, чтобы ​//postmaster// указывал на //root//, а //root// указывал на ваше имя пользователя или ваш почтовый адрес, у вас должно получится примерно так: ​
  
 <​file>​postmaster:​ root  <​file>​postmaster:​ root 
Строка 770: Строка 787:
 После изменения /​etc/​aliases вы должны запустить команду После изменения /​etc/​aliases вы должны запустить команду
  
-''​sudo newaliases ​''​+<code bash>sudo newaliases ​</​code>​
  
 ===== Настройка dovecot ===== ===== Настройка dovecot =====
 Скопируем файл ​ Скопируем файл ​
  
-''​sudo cp /​etc/​pam.d/​smtp /​etc/​pam.d/​dovecot''​+<code bash>sudo cp /​etc/​pam.d/​smtp /​etc/​pam.d/​dovecot</​code>​
  
-(мы будем для dovecot использовать тоже аутентификацию через pam)+(мы будем для ​//dovecot// использовать тоже аутентификацию через ​//pam//)
  
 Отредактируем файл /​etc/​dovecot/​dovecot-ldap.conf Отредактируем файл /​etc/​dovecot/​dovecot-ldap.conf
  
-''​sudo nano /​etc/​dovecot/​dovecot-ldap.conf''​+<code bash>sudo nano /​etc/​dovecot/​dovecot-ldap.conf</​code>​
  
 <​file>​uris = ldap://​10.0.0.3/ ​ <​file>​uris = ldap://​10.0.0.3/ ​
Строка 797: Строка 814:
 Отредактируем файл /​etc/​dovecot/​dovecot-sql.conf Отредактируем файл /​etc/​dovecot/​dovecot-sql.conf
  
-''​sudo nano /​etc/​dovecot/​dovecot-sql.conf''​+<code bash>sudo nano /​etc/​dovecot/​dovecot-sql.conf</​code>​
  
 <​file>​driver = mysql  <​file>​driver = mysql 
Строка 805: Строка 822:
 Отредактируем файл /​etc/​dovecot/​dovecot.conf,​ изменив следующие параметры:​ Отредактируем файл /​etc/​dovecot/​dovecot.conf,​ изменив следующие параметры:​
  
-''​sudo nano /​etc/​dovecot/​dovecot.conf''​+<code bash>sudo nano /​etc/​dovecot/​dovecot.conf</​code>​
  
 <​file>​disable_plaintext_auth = yes  <​file>​disable_plaintext_auth = yes 
Строка 863: Строка 880:
 Создадим скрипт,​ который будет посылать пользователям напоминания при превышении ими квоты Создадим скрипт,​ который будет посылать пользователям напоминания при превышении ими квоты
  
-''​sudo nano /​usr/​local/​bin/​quota-warning.sh''​+<code bash>sudo nano /​usr/​local/​bin/​quota-warning.sh</​code>​
  
 <code bash>#​!/​bin/​sh ​ <code bash>#​!/​bin/​sh ​
Строка 879: Строка 896:
 exit 0 </​code>​ exit 0 </​code>​
  
-(здесь мы посылаем сообщение от имени admin@aaa.ru,​ причем копию сообщения направляем на admin@aaa.ru)+(здесь мы посылаем сообщение от имени ​//admin@aaa.ru//, причем копию сообщения направляем на //admin@aaa.ru//)
  
 и сделаем его выполняемым и сделаем его выполняемым
  
-''​sudo chmod a+x /​usr/​local/​bin/​quota-warning.sh''​+<code bash>sudo chmod a+x /​usr/​local/​bin/​quota-warning.sh</​code>​
  
-Не ждите от dovecot немедленной реакции на достижение квоты пороговых значений:​ dovecot пересчитывает квоту периодически.+Не ждите от //dovecot// немедленной реакции на достижение квоты пороговых значений: ​//dovecot// пересчитывает квоту периодически.
  
 Сменим права файлам,​ в которых записана информация о доступе к mysql и ldap Сменим права файлам,​ в которых записана информация о доступе к mysql и ldap
  
-''​sudo chown root.root /​etc/​dovecot/​dovecot-ldap.conf ​\\ +<code bash>sudo chown root.root /​etc/​dovecot/​dovecot-ldap.conf  
-sudo chown root.root /​etc/​dovecot/​dovecot-sql.conf ​\\ +sudo chown root.root /​etc/​dovecot/​dovecot-sql.conf  
-sudo chmod og= /​etc/​dovecot/​dovecot-ldap.conf ​\\ +sudo chmod og= /​etc/​dovecot/​dovecot-ldap.conf  
-sudo chmod og= /​etc/​dovecot/​dovecot-sql.conf''​+sudo chmod og= /​etc/​dovecot/​dovecot-sql.conf</​code>​
  
 Перезапустим dovecot Перезапустим dovecot
  
-''​sudo /​etc/​init.d/​dovecot restart''​+<code bash>sudo /​etc/​init.d/​dovecot restart</​code>​
  
 и проверим аутентификацию dovecot для обоих наших пользователей:​ и проверим аутентификацию dovecot для обоих наших пользователей:​
  
-''​telnet 127.0.0.1 110 ''​+<code bash>telnet 127.0.0.1 110</​code>​
  
-**Trying 127.0.0.1... \\+<note tip>**Trying 127.0.0.1... \\
 Connected to 127.0.0.1. \\ Connected to 127.0.0.1. \\
 Escape character is '​^]'​. \\ Escape character is '​^]'​. \\
-+OK Dovecot ready.**++OK Dovecot ready.**</​note>​
  
-''​user admin@bbb.ru''​+<code bash>user admin@bbb.ru</​code>​
  
-**+OK **+<note tip>**+OK **</​note>​
  
-''​pass secret''​+<code bash>pass secret</​code>​
  
-(здесь,​ конечно,​ вводим пароль пользователя admin@bbb.ru)+(здесь,​ конечно,​ вводим пароль пользователя ​//admin@bbb.ru//)
  
-**+OK Logged in. **+<note tip>**+OK Logged in. **</​note>​
  
-''​quit''​+<code bash>quit</​code>​
  
-**+OK Logging out. \\ +<note tip>**+OK Logging out. \\ 
-Connection closed by foreign host. **+Connection closed by foreign host. **</​note>​
  
 и и
  
-''​telnet 127.0.0.1 110 ''​+<code bash>telnet 127.0.0.1 110 </​code>​
  
-**Trying 127.0.0.1... \\+<note tip>**Trying 127.0.0.1... \\
 Connected to 127.0.0.1. \\ Connected to 127.0.0.1. \\
 Escape character is '​^]'​. \\ Escape character is '​^]'​. \\
-+OK Dovecot ready.**++OK Dovecot ready.**</​note>​
  
-''​user admin''​+<code bash>user admin</​code>​
  
-**+OK **+<note tip>**+OK **</​note>​
  
-''​pass secret''​+<code bash>pass secret</​code>​
  
-(здесь,​ конечно,​ вводим пароль пользователя admin)+(здесь,​ конечно,​ вводим пароль пользователя ​//admin//)
  
-**+OK Logged in. **+<note tip>**+OK Logged in. **</​note>​
  
-''​quit''​+<code bash>quit</​code>​
  
-**+OK Logging out. \\ +<note tip>**+OK Logging out. \\ 
-Connection closed by foreign host. **+Connection closed by foreign host. **</​note>​
  
 После этой проверки,​ кстати,​ автоматически создадутся папки для хранения почты: После этой проверки,​ кстати,​ автоматически создадутся папки для хранения почты:
  
-''​sudo ls -R /​home/​vmail/​''​+<code bash>sudo ls -R /​home/​vmail/​</​code>​
  
-**/​home/​vmail:​ \\+<note tip>**/​home/​vmail:​ \\
 aaa.ru bbb.ru \\ aaa.ru bbb.ru \\
  /​home/​vmail/​aaa.ru:​ \\  /​home/​vmail/​aaa.ru:​ \\
Строка 965: Строка 982:
  /​home/​vmail/​bbb.ru/​admin/​cur:​ \\  /​home/​vmail/​bbb.ru/​admin/​cur:​ \\
  /​home/​vmail/​bbb.ru/​admin/​new:​ \\  /​home/​vmail/​bbb.ru/​admin/​new:​ \\
- /​home/​vmail/​bbb.ru/​admin/​tmp:​ **+ /​home/​vmail/​bbb.ru/​admin/​tmp:​ **</​note>​
  
 ===== Установка horde ===== ===== Установка horde =====
 Установим нужные пакеты Установим нужные пакеты
  
-''​sudo apt-get install horde3 imp4 turba2 sork-passwd-h3''​+<code bash>sudo apt-get install horde3 imp4 turba2 sork-passwd-h3</​code>​
  
 Разрешим доступ к нашей web-почте только через ssl. Для этого вначале отредактируем файл /​etc/​apache2/​sites-available/​default-ssl ​ Разрешим доступ к нашей web-почте только через ssl. Для этого вначале отредактируем файл /​etc/​apache2/​sites-available/​default-ssl ​
  
-''​sudo nano /​etc/​apache2/​sites-available/​default-ssl ​''​+<code bash>sudo nano /​etc/​apache2/​sites-available/​default-ssl ​</​code>​
  
 Заменяем ​ Заменяем ​
Строка 1022: Строка 1039:
 SSLCertificateKeyFile /​etc/​ssl/​private/​oban.key</​file>​ SSLCertificateKeyFile /​etc/​ssl/​private/​oban.key</​file>​
  
-Подключаем модуль ssl, разрешаем сайт default-ssl и перезапускаем apache+Подключаем модуль ​//ssl//, разрешаем сайт ​//default-ssl// и перезапускаем ​//apache//
  
-''​sudo a2enmod ssl \\ +<code bash>sudo a2enmod ssl  
-sudo a2ensite default-ssl ​\\ +sudo a2ensite default-ssl  
-sudo /​etc/​init.d/​apache2 restart''​+sudo /​etc/​init.d/​apache2 restart</​code>​
  
 Редактируем файл /​etc/​horde/​horde3/​conf.php и закомментарим строки Редактируем файл /​etc/​horde/​horde3/​conf.php и закомментарим строки
  
-''​sudo nano /​etc/​horde/​horde3/​conf.php''​+<code bash>sudo nano /​etc/​horde/​horde3/​conf.php</​code>​
  
 <​file>//​echo "​Horde3 configuration disabled by default because the administration/​install wizard gives the whole world too much access to the system. Read /​usr/​share/​doc/​horde3/​README.Debian.gz on how to allow access."; ​ <​file>//​echo "​Horde3 configuration disabled by default because the administration/​install wizard gives the whole world too much access to the system. Read /​usr/​share/​doc/​horde3/​README.Debian.gz on how to allow access."; ​
 //exit (0);</​file>​ //exit (0);</​file>​
  
-Распаковываем скрипт для создания базы данных horde+Распаковываем скрипт для создания базы данных ​//horde//
  
-''​sudo gzip -d /​usr/​share/​doc/​horde3/​examples/​scripts/​sql/​create.mysql.sql.gz ​''​+<code bash>sudo gzip -d /​usr/​share/​doc/​horde3/​examples/​scripts/​sql/​create.mysql.sql.gz ​</​code>​
  
 и меняем пароль в файле /​usr/​share/​doc/​horde3/​examples/​scripts/​sql/​create.mysql.sql ​ и меняем пароль в файле /​usr/​share/​doc/​horde3/​examples/​scripts/​sql/​create.mysql.sql ​
  
-''​sudo nano /​usr/​share/​doc/​horde3/​examples/​scripts/​sql/​create.mysql.sql ​''​+<code bash>sudo nano /​usr/​share/​doc/​horde3/​examples/​scripts/​sql/​create.mysql.sql ​</​code>​
  
 <​file>​-- IMPORTANT: Change this password. ​ <​file>​-- IMPORTANT: Change this password. ​
  PASSWORD('​horde'​) </​file>​  PASSWORD('​horde'​) </​file>​
  
-на другой (далее будем называть его <​horde_password>​)+на другой (далее будем называть его ​//<​horde_password>​//)
  
-Исполняем скрипт с параметрами администратора mysql+Исполняем скрипт с параметрами администратора ​//mysql//
  
-''​sudo mysql --user=root --password=<​mysql_password>​ < /​usr/​share/​doc/​horde3/​examples/​scripts/​sql/​create.mysql.sql''​+<code bash>sudo mysql --user=root --password=<​mysql_password>​ < /​usr/​share/​doc/​horde3/​examples/​scripts/​sql/​create.mysql.sql</​code>​
  
-и заходим браузером на %%https://​oban.aaa.ru%%+и заходим браузером на https://​oban.aaa.ru
  
 В первый раз нас пустят с администраторскими привилегиями. Настроим систему аутентификации. Вначале войдем в **Управление - Приложения - Портал (horde)** и выберем закладку **Authentication**. В первый раз нас пустят с администраторскими привилегиями. Настроим систему аутентификации. Вначале войдем в **Управление - Приложения - Портал (horde)** и выберем закладку **Authentication**.
Строка 1058: Строка 1075:
 Зададим список пользователей-администраторов,​ перечислив двух наших пользователей — ''​admin@bbb.ru,​ admin''​ (через запятую) в поле **"​Which users should be treated as administrators (root, super-user) by Horde?"​**. Зададим список пользователей-администраторов,​ перечислив двух наших пользователей — ''​admin@bbb.ru,​ admin''​ (через запятую) в поле **"​Which users should be treated as administrators (root, super-user) by Horde?"​**.
  
-Затем выберем способ аутентификации - через ​imap (выберем ''​IMAP authentication''​ в поле **"​What backend should we use for authenticating users to Horde?"​**). Страница обновится,​ дав нам настройки для выбранного нами способа аутентификации.+Затем выберем способ аутентификации - через ​IMAP (выберем ''​IMAP authentication''​ в поле **"​What backend should we use for authenticating users to Horde?"​**). Страница обновится,​ дав нам настройки для выбранного нами способа аутентификации.
  
 В поле **"​Configuration type"​** выберем ''​Separate values''​. В поле **"​Configuration type"​** выберем ''​Separate values''​.
Строка 1116: Строка 1133:
 Это нормально,​ т.к. мы не хотим, чтобы возможно было менять конфигурацию через веб. Скопируем показанный внизу на странице сгенеренный код и запишем его в файл /​etc/​horde/​horde3/​conf.php (важно скопировать ВЕСЬ текст, заменив ВЕСЬ текст, имеющийся в файле). Это нормально,​ т.к. мы не хотим, чтобы возможно было менять конфигурацию через веб. Скопируем показанный внизу на странице сгенеренный код и запишем его в файл /​etc/​horde/​horde3/​conf.php (важно скопировать ВЕСЬ текст, заменив ВЕСЬ текст, имеющийся в файле).
  
-''​sudo nano /​etc/​horde/​horde3/​conf.php''​+<code bash>sudo nano /​etc/​horde/​horde3/​conf.php</​code>​
  
 (здесь вставляем скопированный текст со страницы броузера) (здесь вставляем скопированный текст со страницы броузера)
Строка 1124: Строка 1141:
 Отредактируем файл /​etc/​horde/​imp4/​servers.php Отредактируем файл /​etc/​horde/​imp4/​servers.php
  
-''​sudo /​etc/​horde/​imp4/​servers.php''​+<code bash>sudo nano /​etc/​horde/​imp4/​servers.php</​code>​
  
 <​file>​$servers['​imap'​] = array( ​ <​file>​$servers['​imap'​] = array( ​
Строка 1142: Строка 1159:
 и закомментируем все остальные примеры ниже. и закомментируем все остальные примеры ниже.
  
-Войдем заново на %%https://​oban.aaa.ru%% уже под одним из введенных нами пользователей с правами администратора.+Войдем заново на https://​oban.aaa.ru уже под одним из введенных нами пользователей с правами администратора.
  
 Зайдем в **Управление - Приложения - Почта (imp)** и выберем закладку **Server**. ​ Зайдем в **Управление - Приложения - Почта (imp)** и выберем закладку **Server**. ​
Строка 1150: Строка 1167:
 Нажмем кнопку **Generate Почта Configuration**,​ скопируем сгенеренный текст конфигурации и запишем в файл /​etc/​horde/​imp4/​conf.php Нажмем кнопку **Generate Почта Configuration**,​ скопируем сгенеренный текст конфигурации и запишем в файл /​etc/​horde/​imp4/​conf.php
  
-''​sudo nano /​etc/​horde/​imp4/​conf.php''​+<code bash>sudo nano /​etc/​horde/​imp4/​conf.php</​code>​
  
 (здесь вставляем скопированный текст со страницы броузера) (здесь вставляем скопированный текст со страницы броузера)
Строка 1156: Строка 1173:
 Отредактируем файл /​etc/​horde/​passwd3/​backends.php Отредактируем файл /​etc/​horde/​passwd3/​backends.php
  
-''​sudo nano /​etc/​horde/​passwd3/​backends.php''​+<code bash>sudo nano /​etc/​horde/​passwd3/​backends.php</​code>​
  
 Закомментируем все кроме Закомментируем все кроме
Строка 1199: Строка 1216:
 ); </​file>​ ); </​file>​
  
-(здесь вместо <​mail_admin_password>​ вставьте пароль mysql пользователя mail_admin, а также можете изменить политику паролей — какие пароли допустимы:​+(здесь вместо ​//<​mail_admin_password>​// вставьте пароль ​//mysql// пользователя ​//mail_admin//, а также можете изменить политику паролей — какие пароли допустимы:​
  
-'​minLength'​ — минимальная длина паролей+//'​minLength'​// — минимальная длина паролей
  
-'​maxLength'​ — максимальная длина паролей+//'​maxLength'​// — максимальная длина паролей
  
-'​minUpper'​ — минимальное количество заглавных букв в паролях+//'​minUpper'​// — минимальное количество заглавных букв в паролях
  
-'​minLower'​ — минимальное количество прописных букв в паролях+//'​minLower'​// — минимальное количество прописных букв в паролях
  
-'​minNumeric'​ — минимальное количество цифровых символов в паролях+//'​minNumeric'​// — минимальное количество цифровых символов в паролях
  
-'​minSymbols'​ — минимальное количество прочих символов букв в паролях)+//'​minSymbols'​// — минимальное количество прочих символов букв в паролях)
  
 Зайдем в **Управление - Приложения - Пароль (passwd)** и в поле **"​Should we display a list of backends (defined in config/​backends.php) for users to choose from? The options are '​shown',​ '​hidden'​. If the backend list is hidden then you can use the '​preferred'​ mechanism to auto-select from it based on an HTTP virtualhost or another piece of data. If it is shown, the user will be able to pick from any of the options."​** выберем ''​Hidden''​. ​ Зайдем в **Управление - Приложения - Пароль (passwd)** и в поле **"​Should we display a list of backends (defined in config/​backends.php) for users to choose from? The options are '​shown',​ '​hidden'​. If the backend list is hidden then you can use the '​preferred'​ mechanism to auto-select from it based on an HTTP virtualhost or another piece of data. If it is shown, the user will be able to pick from any of the options."​** выберем ''​Hidden''​. ​
Строка 1217: Строка 1234:
  ​Нажмем кнопку **Generate Пароль Configuration**,​ скопируем сгенеренный текст конфигурации и запишем в файл /​etc/​horde/​passwd3/​conf.php ​  ​Нажмем кнопку **Generate Пароль Configuration**,​ скопируем сгенеренный текст конфигурации и запишем в файл /​etc/​horde/​passwd3/​conf.php ​
  
-''​sudo nano /​etc/​horde/​passwd3/​conf.php ​''​+<code bash>sudo nano /​etc/​horde/​passwd3/​conf.php ​</​code>​
  
 (здесь вставляем скопированный текст со страницы броузера) (здесь вставляем скопированный текст со страницы броузера)
Строка 1223: Строка 1240:
 Отредактируем файл /​etc/​horde/​horde3/​registry.php Отредактируем файл /​etc/​horde/​horde3/​registry.php
  
-''​sudo nano /​etc/​horde/​horde3/​registry.php''​+<code bash>sudo nano /​etc/​horde/​horde3/​registry.php</​code>​
  
-и для приложений imp, passwd и turba заменим ​+и для приложений ​//imp////passwd// и //turba// заменим ​
  
 <​file> ​   '​status'​ => '​inactive',​ </​file>​ <​file> ​   '​status'​ => '​inactive',​ </​file>​
Строка 1233: Строка 1250:
 <​file> ​   '​status'​ => '​active',​ </​file>​ <​file> ​   '​status'​ => '​active',​ </​file>​
  
-Учтите,​ что для пользователей,​ которые входят с использованием ldap мы не настроили смену пароля (это лучше делать другими средствами - внутри нашей сети, а не давать им менять пароль через веб). Кроме этого, этим пользователям (т.к. они входят,​ вводя только имя, а не имя@домен),​ нужно задавать свой почтовый адрес в поле "​Ваш адрес отправителя:"​ в **Настройки - Почта — Личные**. ​+Учтите,​ что для пользователей,​ которые входят с использованием ldap мы не настроили смену пароля (это лучше делать другими средствами - внутри нашей сети, а не давать им менять пароль через веб). Кроме этого, этим пользователям (т.к. они входят,​ вводя только имя, а не имя@домен),​ нужно задавать свой почтовый адрес в поле ​**"​Ваш адрес отправителя:"​** в **Настройки - Почта — Личные**. ​
  
 Для настройки адресной книги выполним Для настройки адресной книги выполним
  
-''​sudo mysql -u horde -p horde < /​usr/​share/​doc/​turba2/​examples/​scripts/​sql/​turba.sql ​''​+<code bash>sudo mysql -u horde -p horde < /​usr/​share/​doc/​turba2/​examples/​scripts/​sql/​turba.sql</​code>​
  
-**Enter password: **+<note tip>**Enter password: **</​note>​ 
 + 
 +Введем пароль пользователя //​horde// ​
  
-(введем пароль пользователя horde - <​horde_password>​)+<code bash><​horde_password>​</​code>​
  
 Зайдем в **Управление - Приложения — Адресная книга (turba)** и нажмем кнопку **Create Адресная книга Configuration**,​ скопируем сгенеренный текст конфигурации и запишем в файл /​etc/​horde/​turba2/​conf.php ​ Зайдем в **Управление - Приложения — Адресная книга (turba)** и нажмем кнопку **Create Адресная книга Configuration**,​ скопируем сгенеренный текст конфигурации и запишем в файл /​etc/​horde/​turba2/​conf.php ​
  
-''​sudo nano /​etc/​horde/​turba2/​conf.php ​''​+<code bash>sudo nano /​etc/​horde/​turba2/​conf.php ​</​code>​
  
 (здесь вставляем скопированный текст со страницы броузера) (здесь вставляем скопированный текст со страницы броузера)
Строка 1252: Строка 1271:
  
 ===== Установка amavisd-new,​ SpamAssassin и ClamAV ===== ===== Установка amavisd-new,​ SpamAssassin и ClamAV =====
-Для установки amavisd-new,​ spamassassin и clamav, выполним следующую команду:​+Для установки ​//amavisd-new////spamassassin// и //clamav//, выполним следующую команду:​
    
-''​sudo apt-get install amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 libnet-ph-perl libnet-snpp-perl libnet-telnet-perl nomarch lzop pax ''​+<code bash>sudo apt-get install amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 libnet-ph-perl libnet-snpp-perl libnet-telnet-perl nomarch lzop pax </​code>​
  
-Включим ClamAV и SpamAssassin отредактировав /​etc/​amavis/​conf.d/​15-content_filter_mode+Включим ​//ClamAV// и //SpamAssassin// отредактировав /​etc/​amavis/​conf.d/​15-content_filter_mode
  
-''​sudo nano /​etc/​amavis/​conf.d/​15-content_filter_mode''​+<code bash>sudo nano /​etc/​amavis/​conf.d/​15-content_filter_mode</​code>​
  
 Раскомментируем ​ Раскомментируем ​
Строка 1272: Строка 1291:
 Отредактируем /​etc/​amavis/​conf.d/​50-user ​ Отредактируем /​etc/​amavis/​conf.d/​50-user ​
  
-''​sudo nano /​etc/​amavis/​conf.d/​50-user ​''​+<code bash>sudo nano /​etc/​amavis/​conf.d/​50-user ​</​code>​
  
 Добавим посередке параметр Добавим посередке параметр
Строка 1283: Строка 1302:
 $sql_select_policy = '​SELECT "​Y"​ as local FROM domains WHERE CONCAT("​@",​domain) IN (%k)';</​file>​ $sql_select_policy = '​SELECT "​Y"​ as local FROM domains WHERE CONCAT("​@",​domain) IN (%k)';</​file>​
  
-(нам нужно указать amavis, что виртуальные домены являются локальными. Иначе он не будет вставлять заголовки и проверять на спам, т.к. будет считать,​ что письма,​ посланные на виртуальные домены — исходящие) . Не забудьте подставить свой пароль пользователя mysql mail_admin.+(нам нужно указать ​//amavis//, что виртуальные домены являются локальными. Иначе он не будет вставлять заголовки и проверять на спам, т.к. будет считать,​ что письма,​ посланные на виртуальные домены — исходящие) . <note important>​Не забудьте подставить свой пароль пользователя ​//mysql mail_admin//.</​note>​
  
 Откроем файл /​etc/​amavis/​conf.d/​20-debian_defaults Откроем файл /​etc/​amavis/​conf.d/​20-debian_defaults
  
-''​sudo nano /​etc/​amavis/​conf.d/​20-debian_defaults''​+<code bash>sudo nano /​etc/​amavis/​conf.d/​20-debian_defaults</​code>​
  
 Дальше — список параметров,​ которые используются у меня с кратким пояснением,​ зачем и почему. ​ Дальше — список параметров,​ которые используются у меня с кратким пояснением,​ зачем и почему. ​
Строка 1306: Строка 1325:
 $sa_quarantine_cutoff_level = 11.9; </​file>​ $sa_quarantine_cutoff_level = 11.9; </​file>​
  
-$sa_spam_subject_tag - добавление указанной строки в начало темы письма. Удобно для получателей. ​+//$sa_spam_subject_tag// - добавление указанной строки в начало темы письма. Удобно для получателей. ​
  
-$sa_spam_report_header - добавление заголовков с подробным отчетом о результатах проверки. Учтите только,​ что эти заголовки будут вставлены только в письма,​ признанные спамом. Подробный отчет - это объяснения каждого сработавшего правила spamassassin,​ типа вот такого: ​+//$sa_spam_report_header// - добавление заголовков с подробным отчетом о результатах проверки. Учтите только,​ что эти заголовки будут вставлены только в письма,​ признанные спамом. Подробный отчет - это объяснения каждого сработавшего правила spamassassin,​ типа вот такого: ​
  
-**X-Spam-Report:​ \\+<note tip>**X-Spam-Report:​ \\
  ​* ​ 1.4 MSGID_MULTIPLE_AT Message-ID contains multiple '​@'​ characters \\  ​* ​ 1.4 MSGID_MULTIPLE_AT Message-ID contains multiple '​@'​ characters \\
  ​* ​ 0.0 HTML_MESSAGE BODY: HTML included in message \\  ​* ​ 0.0 HTML_MESSAGE BODY: HTML included in message \\
Строка 1316: Строка 1335:
  ​* ​     [score: 0.5000] \\  ​* ​     [score: 0.5000] \\
  ​* ​ 1.8 MIME_BASE64_TEXT RAW: Message text disguised using base64 encoding \\  ​* ​ 1.8 MIME_BASE64_TEXT RAW: Message text disguised using base64 encoding \\
- ​* ​ 1.3 AWL AWL: From: address is in the auto white-list **+ ​* ​ 1.3 AWL AWL: From: address is in the auto white-list **</​note>​
  
-$sa_tag_level_deflt - добавлять заголовки с результатом проверки на спам в сообщения с указанной оценкой и выше. Здесь - всегда добавлять эти заголовки. Заголовки вот такие: ​+//$sa_tag_level_deflt// - добавлять заголовки с результатом проверки на спам в сообщения с указанной оценкой и выше. Здесь - всегда добавлять эти заголовки. Заголовки вот такие: ​
  
-**Х-Spam-Flag:​ YES \\+<note tip>**Х-Spam-Flag:​ YES \\
 X-Spam-Score:​ 4.54 \\ X-Spam-Score:​ 4.54 \\
 X-Spam-Level:​ **** \\ X-Spam-Level:​ **** \\
 X-Spam-Status:​ Yes, score=4.54 required=4.5 tests=[AWL=1.336,​ BAYES_50=0.001,​ \\ X-Spam-Status:​ Yes, score=4.54 required=4.5 tests=[AWL=1.336,​ BAYES_50=0.001,​ \\
- HTML_MESSAGE=0.001,​ MIME_BASE64_TEXT=1.753,​ MSGID_MULTIPLE_AT=1.449] **+ HTML_MESSAGE=0.001,​ MIME_BASE64_TEXT=1.753,​ MSGID_MULTIPLE_AT=1.449] **</​note>​
  
 если опознан спам и  если опознан спам и 
  
-**X-Spam-Flag:​ NO \\+<note tip>**X-Spam-Flag:​ NO \\
 X-Spam-Score:​ -0.708 \\ X-Spam-Score:​ -0.708 \\
 X-Spam-Level:​ \\ X-Spam-Level:​ \\
 X-Spam-Status:​ No, score=-0.708 required=4.5 tests=[AWL=0.403,​ BAYES_05=-1.11,​ \\ X-Spam-Status:​ No, score=-0.708 required=4.5 tests=[AWL=0.403,​ BAYES_05=-1.11,​ \\
- SPF_PASS=-0.001] **+ SPF_PASS=-0.001] **</​note>​
  
-если сообщение "​чистое"​. Еще раз подчеркну,​ что в этом случае заголовка "​X-Spam-Report:"​ не будет. Если нужен - нужно править сам amavis. ​+если сообщение "​чистое"​. Еще раз подчеркну,​ что в этом случае заголовка "​X-Spam-Report:"​ не будет. Если нужен - нужно править сам ​//amavis//
  
-$sa_tag2_level_deflt - уровень,​ начиная с которого сообщение признается спамом. ​+//$sa_tag2_level_deflt// - уровень,​ начиная с которого сообщение признается спамом. ​
  
-$sa_kill_level_deflt - уровень,​ начиная с которого выполняется правило по обработке спама (описание ниже) ​+//$sa_kill_level_deflt// - уровень,​ начиная с которого выполняется правило по обработке спама (описание ниже) ​
  
-$sa_dsn_cutoff_level - уровень,​ начиная с которого не отсылается сообщение о невозможности доставки. Очень советую его иметь равным $sa_kill_level_deflt,​ иначе Вас, скорее всего, внесут в какой-нибудь черный список. Особенно это любит делать,​ например,​ att.com ​+//$sa_dsn_cutoff_level// - уровень,​ начиная с которого не отсылается сообщение о невозможности доставки. Очень советую его иметь равным ​//$sa_kill_level_deflt//, иначе Вас, скорее всего, внесут в какой-нибудь черный список. Особенно это любит делать,​ например, ​//att.com// 
  
-$sa_quarantine_cutoff_level - уровень начиная с которого письмо не сохраняется в карантине (/​var/​lib/​amavis/​virusmails/​...) ​+//$sa_quarantine_cutoff_level// - уровень начиная с которого письмо не сохраняется в карантине (/​var/​lib/​amavis/​virusmails/​...) ​
  
 <​file>​$final_virus_destiny ​     = D_DISCARD; ​ # (data not lost, see virus quarantine) ​ <​file>​$final_virus_destiny ​     = D_DISCARD; ​ # (data not lost, see virus quarantine) ​
Строка 1352: Строка 1371:
 Параметры задают правила обработки "​нехороших"​ сообщений: ​ Параметры задают правила обработки "​нехороших"​ сообщений: ​
  
-$final_virus_destiny - просто игнорировать (сами письма сохраняются в карантине) ​+//$final_virus_destiny// - просто игнорировать (сами письма сохраняются в карантине) ​
  
-$final_banned_destiny - письма с запрещенными вложениями по типу файлов:​ сообщить отправителю о невозможности доставки ​+//$final_banned_destiny// - письма с запрещенными вложениями по типу файлов:​ сообщить отправителю о невозможности доставки ​
  
-$final_spam_destiny - игнорировать (это и есть то самое правило обработки спама, о котором шла речи выше) ​+//$final_spam_destiny// - игнорировать (это и есть то самое правило обработки спама, о котором шла речи выше) ​
  
-$final_bad_header_destiny - некорректные заголовки писем пропускать. ​+//$final_bad_header_destiny// - некорректные заголовки писем пропускать. ​
  
-$virus_admin ​адрес, куда доставлять сообщения о вирусах и отраженных письмах с запрещенными вложениями (postmaster),​ чтобы можно было проверить содержимое писем в карантине. О письмах со спамом,​ попавшим в карантин,​ сообщений не будет. ​+//$virus_admin// - адрес, куда доставлять сообщения о вирусах и отраженных письмах с запрещенными вложениями (//postmaster//), чтобы можно было проверить содержимое писем в карантине. О письмах со спамом,​ попавшим в карантин,​ сообщений не будет. ​
  
 Настройки,​ связанные с вирусами и запрещенными вложениями лучше оставить "по умолчанию"​. ​ Настройки,​ связанные с вирусами и запрещенными вложениями лучше оставить "по умолчанию"​. ​
  
-Конкретные уровни оценки выставьте сами (я использую именно такие, и они меня полностью удовлетворяют,​ по крайней мере, по прошествии довольно большого времени и накопленной bayes-овской базы и с регулярными обновлениями правил spamassassin). Недавно специально проверял - за три дня ложных срабатываний было 0 (менял D_DISCARD на D_PASS у $final_spam_destiny).+Конкретные уровни оценки выставьте сами (я использую именно такие, и они меня полностью удовлетворяют,​ по крайней мере, по прошествии довольно большого времени и накопленной bayes-овской базы и с регулярными обновлениями правил spamassassin). Недавно специально проверял - за три дня ложных срабатываний было 0 (менял ​''​D_DISCARD'' ​на ''​D_PASS'' ​у //$final_spam_destiny//).
  
-Сделаем так, чтобы amavis не проверял исходящие письма на спам, а только входящие (на вирусы он будет проверять все письма). Вставим строки ​+Сделаем так, чтобы ​//amavis// не проверял исходящие письма на спам, а только входящие (на вирусы он будет проверять все письма). Вставим строки ​
  
 <​file>#​ add these for SASL SA bypass ​ <​file>#​ add these for SASL SA bypass ​
Строка 1379: Строка 1398:
 Отредактируйте файл /​etc/​amavis/​conf.d/​21-ubuntu_defaults Отредактируйте файл /​etc/​amavis/​conf.d/​21-ubuntu_defaults
  
-''​sudo nano /​etc/​amavis/​conf.d/​21-ubuntu_defaults''​+<code bash>sudo nano /​etc/​amavis/​conf.d/​21-ubuntu_defaults</​code>​
  
 и закомментируйте строки и закомментируйте строки
Строка 1390: Строка 1409:
 #​$spam_admin = undef;</​file>​ #​$spam_admin = undef;</​file>​
  
-Добавим пользователя clamav в группу amavis и перезапустим amavisd-new и ClamAV: ​+Добавим пользователя ​//clamav// в группу ​//amavis// и перезапустим ​//amavisd-new// и //ClamAV//
  
-''​sudo adduser clamav amavis ​\\ +<code bash>sudo adduser clamav amavis  
-sudo /​etc/​init.d/​amavis restart ​\\ +sudo /​etc/​init.d/​amavis restart  
-sudo /​etc/​init.d/​clamav-daemon restart ​\\ +sudo /​etc/​init.d/​clamav-daemon restart  
-sudo /​etc/​init.d/​clamav-freshclam restart''​+sudo /​etc/​init.d/​clamav-freshclam restart</​code>​
  
-Укажем,​ чтобы postfix проверял почту через amavis+Укажем,​ чтобы ​//postfix// проверял почту через ​//amavis//
  
-''​sudo postconf -e '​content_filter = amavis:​[127.0.0.1]:​10024' ​\\ +<code bash>sudo postconf -e '​content_filter = amavis:​[127.0.0.1]:​10024'​  
-sudo postconf -e '​receive_override_options = no_address_mappings' ​''​+sudo postconf -e '​receive_override_options = no_address_mappings' ​</​code>​
  
 Отредактируем файл /​etc/​postfix/​master.cf Отредактируем файл /​etc/​postfix/​master.cf
  
-''​sudo nano /​etc/​postfix/​master.cf''​+<code bash>sudo nano /​etc/​postfix/​master.cf</​code>​
  
 и добавим в конец следующие строки и добавим в конец следующие строки
Строка 1425: Строка 1444:
         -o smtpd_bind_address=127.0.0.1</​file>​         -o smtpd_bind_address=127.0.0.1</​file>​
  
-Перезапустим postfix+Перезапустим ​//postfix//
  
-''​sudo /​etc/​init.d/​postfix restart''​+<code bash>sudo /​etc/​init.d/​postfix restart</​code>​
  
-Для периодической очистки карантина вставим в cron +Для периодической очистки карантина вставим в //cron//
  
-''​sudo crontab -e''​+<code bash>sudo crontab -e</​code>​
  
 <​file>​1 0 * * * find /​var/​lib/​amavis/​virusmails/​* -mtime +60 | xargs rm &> /​dev/​null</​file>​ <​file>​1 0 * * * find /​var/​lib/​amavis/​virusmails/​* -mtime +60 | xargs rm &> /​dev/​null</​file>​
Строка 1440: Строка 1459:
 Установим нужные пакеты Установим нужные пакеты
  
-''​sudo apt-get install razor pyzor''​+<code bash>sudo apt-get install razor pyzor</​code>​
  
-DCC не содержится в репозитории Ubuntu, поэтому мы его установим так:+//DCC// не содержится в репозитории ​//Ubuntu//, поэтому мы его установим так:
  
-''​cd /tmp \\ +<code bash>cd /tmp  
-wget %%http://​launchpadlibrarian.net/​11564361/​dcc-server_1.3.42-5_i386.deb%% \\ +wget http://​launchpadlibrarian.net/​11564361/​dcc-server_1.3.42-5_i386.deb  
-wget %%http://​launchpadlibrarian.net/​11564359/​dcc-common_1.3.42-5_i386.deb%% \\ +wget http://​launchpadlibrarian.net/​11564359/​dcc-common_1.3.42-5_i386.deb  
-sudo dpkg -i dcc-common_1.3.42-5_i386.deb ​\\ +sudo dpkg -i dcc-common_1.3.42-5_i386.deb  
-sudo dpkg -i dcc-server_1.3.42-5_i386.deb\\ +sudo dpkg -i dcc-server_1.3.42-5_i386.deb 
-cd ~''​+cd ~</​code>​
  
 (Для работы клиента DCC нам нужно пробросить на шлюзе UDP порт 6277 на наш почтовый сервер) (Для работы клиента DCC нам нужно пробросить на шлюзе UDP порт 6277 на наш почтовый сервер)
-Скажем spamassassin использовать эти три программы. Отредактируем /​etc/​spamassassin/​local.cf добавив несколько строчек в конец: 
  
-''​sudo nano /​etc/​spamassassin/​local.cf''​+Скажем //​spamassassin//​ использовать эти три программы. Отредактируем /​etc/​spamassassin/​local.cf добавив несколько строчек в конец:​ 
 + 
 +<code bash>sudo nano /​etc/​spamassassin/​local.cf</​code>​
  
 <​file>#​dcc ​ <​file>#​dcc ​
Строка 1470: Строка 1490:
 bayes_auto_learn 1</​file>​ bayes_auto_learn 1</​file>​
  
-Мы должны включить плагин DCC в SpamAssassin. Откроем /​etc/​spamassassin/​v310.pre+Мы должны включить плагин ​//DCC// в //SpamAssassin//. Откроем /​etc/​spamassassin/​v310.pre
  
-''​sudo nano /​etc/​spamassassin/​v310.pre''​+<code bash>sudo nano /​etc/​spamassassin/​v310.pre</​code>​
  
 и раскомментируем такую строчку ​ и раскомментируем такую строчку ​
Строка 1478: Строка 1498:
 <​file>​loadplugin Mail::​SpamAssassin::​Plugin::​DCC </​file>​ <​file>​loadplugin Mail::​SpamAssassin::​Plugin::​DCC </​file>​
  
-Проверим конфигурацию spamassassin ​+Проверим конфигурацию ​//spamassassin// 
  
-''​spamassassin --lint ​''​+<code bash>spamassassin --lint ​</​code>​
  
 Мы не должны получить никакого сообщения,​ если у нас все в норме. Мы не должны получить никакого сообщения,​ если у нас все в норме.
  
-Обновим набор правил для SpamAssassin следующим образом: ​+Обновим набор правил для ​//SpamAssassin// следующим образом: ​
  
-''​sudo sa-update --no-gpg ​''​+<code bash>sudo sa-update --no-gpg</​code>​
  
-Добавим в cron задание,​ чтобы набор правил обновлялся регулярно. Запустим ​+Добавим в //cron// задание,​ чтобы набор правил обновлялся регулярно. Запустим ​
  
-''​sudo crontab -e ''​+<code bash>sudo crontab -e</​code>​
  
-чтобы открыть редактор cron и добавим в него следующее задание: ​+чтобы открыть редактор ​//cron// и добавим в него следующее задание: ​
  
 <​file>​ 23 4 */2 * * /​usr/​bin/​sa-update --no-gpg &> /dev/null </​file>​ <​file>​ 23 4 */2 * * /​usr/​bin/​sa-update --no-gpg &> /dev/null </​file>​
Строка 1498: Строка 1518:
 Это позволит обновлять набор правил каждый 2 день в 4 часа 23 минуты. ​ Это позволит обновлять набор правил каждый 2 день в 4 часа 23 минуты. ​
  
-Для работы razor нам нужно сформировать для него домашнюю директорию и зарегистрироваться,​ для того, чтобы иметь возможность сообщать о спаме. Т. к. spamassassin ​ работает от имени пользователя amavis, сделаем следующее (по умолчанию домашней директорией пользователя amavis является /​var/​lib/​amavis):​+Для работы ​//razor// нам нужно сформировать для него домашнюю директорию и зарегистрироваться,​ для того, чтобы иметь возможность сообщать о спаме. Т. к. ​//spamassassin//  ​работает от имени пользователя ​//amavis//, сделаем следующее (по умолчанию домашней директорией пользователя amavis является /​var/​lib/​amavis):​
  
-''​sudo su amavis\\ +<code bash>sudo su amavis 
-cd\\ +cd 
-razor-admin -create\\ +razor-admin -create 
-razor-admin -register''​+razor-admin -register</​code>​
  
-**Register successful. ​ Identity stored in /​var/​lib/​amavis/​.razor/​identity-XXXXXXXXXX**+<note tip>**Register successful. ​ Identity stored in /​var/​lib/​amavis/​.razor/​identity-XXXXXXXXXX**</​note>​
  
-''​exit''​+<code bash>exit</​code>​
  
-После этого у нас появится директория /​var/​lib/​amavis/​.razor/​ в которой будет лежать информация о серверах razor и о имени/​пароле для доступа к ним (сгенеренные автоматически).+После этого у нас появится директория /​var/​lib/​amavis/​.razor/​ в которой будет лежать информация о серверах ​//razor// и о имени/​пароле для доступа к ним (сгенеренные автоматически).
  
-Зададим правила отчета о спаме в horde. Зайдем броузером на %%https://​oban.aaa.ru%% под административной записью и зайдя в **Управление - Приложения - Почта (imp)** и выберем закладку **Message and Spam**. ​+Зададим правила отчета о спаме в //horde//. Зайдем броузером на https://​oban.aaa.ru под административной записью и зайдя в **Управление - Приложения - Почта (imp)** и выберем закладку **Message and Spam**. ​
  
 В поле **"​Should we report the spam message via an external program (e.g. /​usr/​local/​bin/​spamassassin -r)? If you include the placeholder %u in this string, it will be replaced with the current username. If you include the placeholder %l in this string, it will be replaced with the current short username. If you include the placeholder %d in this string, it will be replaced with the current domain name."​** введем ''/​usr/​local/​bin/​spamassassin -r''​ а в поле **"​Should we report the innocent message via an external program (e.g. /​usr/​local/​bin/​spamassassin -k)? If you include the placeholder %u in this string, it will be replaced with the current username"​** введем ''/​usr/​local/​bin/​spamassassin -k''​ В поле **"​Should we report the spam message via an external program (e.g. /​usr/​local/​bin/​spamassassin -r)? If you include the placeholder %u in this string, it will be replaced with the current username. If you include the placeholder %l in this string, it will be replaced with the current short username. If you include the placeholder %d in this string, it will be replaced with the current domain name."​** введем ''/​usr/​local/​bin/​spamassassin -r''​ а в поле **"​Should we report the innocent message via an external program (e.g. /​usr/​local/​bin/​spamassassin -k)? If you include the placeholder %u in this string, it will be replaced with the current username"​** введем ''/​usr/​local/​bin/​spamassassin -k''​
  
-При приеме писем postfix проверки на спам проводятся amavisd-new пользователем amavis, а при работе horde — пользователем www-data. Поэтому создаем ссылки+При приеме писем ​//postfix// проверки на спам проводятся ​//amavisd-new// пользователем ​//amavis//, а при работе ​//horde// — пользователем ​//www-data//. Поэтому создаем ссылки
  
-''​sudo ln -s /​var/​lib/​amavis/​.pyzor /​var/​www/​.pyzor ​\\ +<code bash>sudo ln -s /​var/​lib/​amavis/​.pyzor /​var/​www/​.pyzor  
-sudo ln -s /​var/​lib/​amavis/​.razor /​var/​www/​.razor ​\\ +sudo ln -s /​var/​lib/​amavis/​.razor /​var/​www/​.razor  
-sudo ln -s  /​var/​lib/​amavis/​.spamassassin /​var/​www/​.spamassassin''​+sudo ln -s  /​var/​lib/​amavis/​.spamassassin /​var/​www/​.spamassassin</​code>​
  
 и меняем права и меняем права
  
-''​sudo chmod -R g+rw /​var/​lib/​amavis/​.pyzor\\ +<code bash>sudo chmod -R g+rw /​var/​lib/​amavis/​.pyzor 
-sudo chmod -R g+rw /​var/​lib/​amavis/​.razor\\ +sudo chmod -R g+rw /​var/​lib/​amavis/​.razor 
-sudo chmod -R g+rw /​var/​lib/​amavis/​.spamassassin\\ +sudo chmod -R g+rw /​var/​lib/​amavis/​.spamassassin 
-sudo chmod g+x /​var/​lib/​amavis/​.pyzor\\ +sudo chmod g+x /​var/​lib/​amavis/​.pyzor 
-sudo chmod g+x /​var/​lib/​amavis/​.razor\\ +sudo chmod g+x /​var/​lib/​amavis/​.razor 
-sudo chmod g+x /​var/​lib/​amavis/​.spamassassin''​+sudo chmod g+x /​var/​lib/​amavis/​.spamassassin</​code>​
  
-и вставляем пользователя www-data в группу amavis (чтобы разрешить доступ к bayes-базе при работе в horde)+и вставляем пользователя ​//www-data// в группу ​//amavis// (чтобы разрешить доступ к //bayes-базе// при работе в //horde//)
  
-''​sudo adduser www-data amavis''​+<code bash>sudo adduser www-data amavis</​code>​
  
-и перезапустим apache+и перезапустим ​//apache//
  
-''​sudo /​etc/​init.d/​apache2 restart ​''​+<code bash>sudo /​etc/​init.d/​apache2 restart</​code>​
  
 Отредактируем файл Отредактируем файл
  
-''​sudo nano /​etc/​mail/​spamassassin/​local.cf''​+<code bash>sudo nano /​etc/​mail/​spamassassin/​local.cf</​code>​
  
 и вставим туда строку и вставим туда строку
 +
 <​file>​bayes_path /​var/​lib/​amavis/​.spamassassin/​bayes</​file>​ <​file>​bayes_path /​var/​lib/​amavis/​.spamassassin/​bayes</​file>​
  
-Вставим периодическое обновление нашей bayes-базы (будем делать это каждую ночь). Отредактируем файл ​+Вставим периодическое обновление нашей ​//bayes-базы// (будем делать это каждую ночь). Отредактируем файл ​
  
-''​sudo nano /​etc/​cron.d/​amavisd-new''​+<code bash>sudo nano /​etc/​cron.d/​amavisd-new</​code>​
  
 и вставим строку и вставим строку
Строка 1553: Строка 1574:
 <​file>​1 0 * * * amavis sa-learn --force-expire --sync </​file>​ <​file>​1 0 * * * amavis sa-learn --force-expire --sync </​file>​
  
-Таким образом,​ при приеме писем postfix при помощи amavis будет проверять письма в том числе по bayes-базе,​ которая формируется автоматически (обучение идет из писем с достаточно большим значением уровня спама; письма с очень малым показателем также участвуют в обучении — они помечаются,​ как ham, т. е. не-спам;​ письма со средним значением уровня спама в автоматическом обучении не участвуют). Кроме этого, в пополнении базы данных принимают участие и пользователи,​ когда помечают письма,​ как спам или не-спам (innocent). Чем больше писем участвует в обучении (и как спам, и как ham), тем лучше работает bayes-база данных спама.+Таким образом,​ при приеме писем ​//postfix// при помощи ​//amavis// будет проверять письма в том числе по //bayes-базе//, которая формируется автоматически (обучение идет из писем с достаточно большим значением уровня спама; письма с очень малым показателем также участвуют в обучении — они помечаются,​ как ​//ham//, т. е. не-спам;​ письма со средним значением уровня спама в автоматическом обучении не участвуют). Кроме этого, в пополнении базы данных принимают участие и пользователи,​ когда помечают письма,​ как спам или не-спам (//innocent//). Чем больше писем участвует в обучении (и как спам, и как ham), тем лучше работает ​//bayes-база// данных спама.
  
 ===== Дополнительные правила для защиты от спама ===== ===== Дополнительные правила для защиты от спама =====
Строка 1620: Строка 1641:
  
 //​smtpd_sender_restrictions//​ - проверки по команде MAIL FROM (имя отправителя) ​ //​smtpd_sender_restrictions//​ - проверки по команде MAIL FROM (имя отправителя) ​
 +
   :: //​permit_mynetworks//​ - разрешить при соединении из моей подсети ​   :: //​permit_mynetworks//​ - разрешить при соединении из моей подсети ​
 +
   :: //​permit_sasl_authenticated//​ - разрешить при аутентификации (пользователи) ​   :: //​permit_sasl_authenticated//​ - разрешить при аутентификации (пользователи) ​
 +
   :: //​reject_non_fqdn_sender//​ - отказать,​ если имя отправителя не в полной форме (должно быть не name или name@domain а name@domain.ltd) ​   :: //​reject_non_fqdn_sender//​ - отказать,​ если имя отправителя не в полной форме (должно быть не name или name@domain а name@domain.ltd) ​
 +
   :: //​reject_unknown_sender_domain//​ - отказать,​ если наш сервер не является "​родным"​ для отправителя и домен отправителя не имеет в DNS записи MX или A, или если он имеет неверную запись MX (например,​ пустую) ​   :: //​reject_unknown_sender_domain//​ - отказать,​ если наш сервер не является "​родным"​ для отправителя и домен отправителя не имеет в DNS записи MX или A, или если он имеет неверную запись MX (например,​ пустую) ​
 +
   :: //permit// - в другом случае продолжать прием ​   :: //permit// - в другом случае продолжать прием ​
  
 //​smtpd_recipient_restrictions//​ - проверки по команде RCPT TO (имя получателя) ​ //​smtpd_recipient_restrictions//​ - проверки по команде RCPT TO (имя получателя) ​
 +
   :: //​reject_unauth_pipelining//​ - отсечь хосты, которые пытаются слать команды в конвейере ​   :: //​reject_unauth_pipelining//​ - отсечь хосты, которые пытаются слать команды в конвейере ​
 +
   :: //​permit_sasl_authenticated//​ - разрешить для авторизованных клиентов (пользователи) ​   :: //​permit_sasl_authenticated//​ - разрешить для авторизованных клиентов (пользователи) ​
 +
   :: //​permit_mynetworks//​ - разрешить при соединении из моей подсети ​   :: //​permit_mynetworks//​ - разрешить при соединении из моей подсети ​
 +
   :: //​reject_unauth_destination//​ - отказать,​ если домен-адресат:​ 1) не перечислен в списке доменов,​ для которых мы форвардим почту ($relay_domains) и не содержит команд переадресации (типа user@another@domain);​ 2) не является "​нашим"​ (т.е. не перечислен в списках ​ $mydestination,​ $inet_interfaces,​ $proxy_interfaces,​ $virtual_alias_domains,​ или $virtual_mailbox_domains ) и не содержит команд переадресации (типа user@another@domain). Это - традиционные правила,​ чтобы наш сервер не служил т.н. Open Relay, через который спамеры рассылают почту третьим лицам. ​   :: //​reject_unauth_destination//​ - отказать,​ если домен-адресат:​ 1) не перечислен в списке доменов,​ для которых мы форвардим почту ($relay_domains) и не содержит команд переадресации (типа user@another@domain);​ 2) не является "​нашим"​ (т.е. не перечислен в списках ​ $mydestination,​ $inet_interfaces,​ $proxy_interfaces,​ $virtual_alias_domains,​ или $virtual_mailbox_domains ) и не содержит команд переадресации (типа user@another@domain). Это - традиционные правила,​ чтобы наш сервер не служил т.н. Open Relay, через который спамеры рассылают почту третьим лицам. ​
 +
   :: //​reject_non_fqdn_recipient//​ - отказать,​ если имя получателя не в полной форме (должно быть не name или name@domain а name@domain.ltd) ​   :: //​reject_non_fqdn_recipient//​ - отказать,​ если имя получателя не в полной форме (должно быть не name или name@domain а name@domain.ltd) ​
 +
   :: //​reject_unknown_recipient_domain//​ - отказать,​ если мы не являемся "​родным"​ сервером для получателя и домен получателя не имеет в DNS записи MX или A, или если он имеет неверную запись MX (например,​ пустую) ​   :: //​reject_unknown_recipient_domain//​ - отказать,​ если мы не являемся "​родным"​ сервером для получателя и домен получателя не имеет в DNS записи MX или A, или если он имеет неверную запись MX (например,​ пустую) ​
 +
   :: //​reject_unlisted_recipient//​ - отказать,​ если адрес получателя не указан в списках получателей домена (не перечислен в  $local_recipient_maps или $virtual_alias_maps или $virtual_mailbox_maps или $relay_recipient_maps,​ в зависимости от того, в какой именно таблице найден домен получателя) ​   :: //​reject_unlisted_recipient//​ - отказать,​ если адрес получателя не указан в списках получателей домена (не перечислен в  $local_recipient_maps или $virtual_alias_maps или $virtual_mailbox_maps или $relay_recipient_maps,​ в зависимости от того, в какой именно таблице найден домен получателя) ​
 +
   :: //​check_policy_service inet:​127.0.0.1:​10023//​ - проверка у стороннего сервиса (в данном случае - postgrey, о нем чуть позже) ​   :: //​check_policy_service inet:​127.0.0.1:​10023//​ - проверка у стороннего сервиса (в данном случае - postgrey, о нем чуть позже) ​
 +
   :: //permit// - продолжать прием   :: //permit// - продолжать прием
   ​   ​
Строка 1830: Строка 1865:
 <​file>​milter_default_action = accept ​ <​file>​milter_default_action = accept ​
 milter_protocol = 2  milter_protocol = 2 
-#smtpd_milters = inet:​localhost:​8891,​inet:​localhost:​8892 ​; for internal delivery only +smtpd_milters = inet:​localhost:​8891,​inet:​localhost:​8892
 non_smtpd_milters = inet:​localhost:​8891,​inet:​localhost:​8892 </​file>​ non_smtpd_milters = inet:​localhost:​8891,​inet:​localhost:​8892 </​file>​
- 
-Мы хотим, чтобы подписывались только исходящие письма,​ поэтому строка //​smtpd_milters//​ закомментарена. 
  
 Проверьте,​ что файл Проверьте,​ что файл
Строка 1842: Строка 1875:
  
 <​file>​$enable_dkim_verification = 1; </​file>​ <​file>​$enable_dkim_verification = 1; </​file>​
 +
 +Отредактируем файл /​etc/​postfix/​master.cf
 +
 +<code bash>​sudo nano /​etc/​postfix/​master.cf</​code>​
 +
 +и в блоке
 +
 +<​file>​127.0.0.1:​10025 inet n - - - - smtpd 
 +        -o content_filter= ​
 +        -o local_recipient_maps= ​
 +        -o relay_recipient_maps= ​
 +        -o smtpd_restriction_classes= ​
 +        -o smtpd_client_restrictions= ​
 +        -o smtpd_helo_restrictions= ​
 +        -o smtpd_sender_restrictions= ​
 +        -o smtpd_recipient_restrictions=permit_mynetworks,​reject ​
 +        -o mynetworks=127.0.0.0/​8 ​
 +        -o strict_rfc821_envelopes=yes ​
 +        -o receive_override_options=no_unknown_recipient_checks,​no_header_body_checks
 +        -o smtpd_bind_address=127.0.0.1 </​file>​
 +
 +изменим строку
 +
 +<​file> ​       -o receive_override_options=no_unknown_recipient_checks,​no_header_body_checks,​no_milters</​file>​
 +
 +иначе наши исходящие письма будут подписываться //DKIM// два раза.
  
 Последнее,​ что нам осталось сделать - это внести изменения в DNS-записи нашего домена (доменов):​ Последнее,​ что нам осталось сделать - это внести изменения в DNS-записи нашего домена (доменов):​
Строка 3601: Строка 3660:
  
 <​file>​procmail unix - n n - - pipe  <​file>​procmail unix - n n - - pipe 
-  -o flags=RO user=vmail argv=/​usr/​bin/​procmail -t -m USER=${user} EXTENSION=${extension} NEXTHOP=${nexthop} /​etc/​postfix/​procmailrc.common </​file>​+  -o flags=RO user=vmail argv=/​usr/​bin/​procmail -t -m USER=${user} EXTENSION=${extension} NEXTHOP=${nexthop} /​etc/​postfix/​procmail.common </​file>​
  
 (вторая строка должна начинаться хотя бы с одного пробела) (вторая строка должна начинаться хотя бы с одного пробела)
Строка 3839: Строка 3898:
  
 Теперь в разделе **Почта — Фильтры** можно активировать,​ редактировать имеющиеся фильтры или добавлять новые. Все правила,​ которые Вы будете задавать через //horde (ingo)// будут записываться в файл правил с именем //ingo//. Этот файл будет доступен для редактирования с помощью любого другого плагина //sieve// (например,​ к //​thunderbird//​). ​ Теперь в разделе **Почта — Фильтры** можно активировать,​ редактировать имеющиеся фильтры или добавлять новые. Все правила,​ которые Вы будете задавать через //horde (ingo)// будут записываться в файл правил с именем //ingo//. Этот файл будет доступен для редактирования с помощью любого другого плагина //sieve// (например,​ к //​thunderbird//​). ​
 +
 +===== FAQ =====
 +
 +**Q: В этой статье написано,​ как настроить LDAP?**\\
 +A: Нет. Настройка LDAP - это своя большая тема, которая лежит за рамками этого howto. Здесь просто показано,​ как использовать уже имеющийся LDAP. Если его нет (и нет AD) - используйте только mysql.
 +
 +**Q: Как сделать такой сервер,​ но без LDAP?**\\
 +A: Просто пропускайте все, что связано с LDAP и делайте только то, что связано с mysql.
  
 ===== Ссылки ===== ===== Ссылки =====
  
   * [[http://​forum.ubuntu.ru/​index.php?​topic=127090.0|Обсуждение статьи на форуме]]   * [[http://​forum.ubuntu.ru/​index.php?​topic=127090.0|Обсуждение статьи на форуме]]
-  * [[http://​forum.ubuntu.ru/​index.php?​action=dlattach;​topic=127090.0;​attach=25869|Статья в формате .odt]] +  * [[http://​forum.ubuntu.ru/​index.php?​action=dlattach;​topic=127090.0;​attach=30328|Статья в формате .odt]] 
- +  * [[http://​wiki.horde.org/​FAQ/​Admin/​Troubleshoot|Horde Administrator'​s FAQ]] — решение проблем с Horde
-{{tag>​postfix dovecot amavis spamassassin autoresponder sieve horde clamav razor pyzor postgrey spf dkim domainkey mailman fail2ban munin}}+
  
 +{{tag>​администрирование postfix dovecot amavis spamassassin autoresponder sieve horde clamav razor pyzor postgrey spf dkim domainkey mailman fail2ban munin}}