Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Следующая версия Следующая версия справа и слева | ||
wiki:почтовый_сервер_со_всем_фаршем_на_10.04_lts [2011/07/20 11:13] [Дополнительные правила для защиты от спама] |
wiki:почтовый_сервер_со_всем_фаршем_на_10.04_lts [2012/07/24 16:50] [Ссылки] |
||
---|---|---|---|
Строка 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 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 'virtual_create_maildirsize = yes' |
- | sudo postconf -e 'virtual_mailbox_extended = yes' \\ | + | 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' '' | + | 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' </code> |
===== Создание SSL-сертификатов ===== | ===== Создание SSL-сертификатов ===== | ||
- | Теперь создадим SSL сертификаты для TLS. Лучше всего (хотя и не обязательно) создать вначале свой CA (Certificate Authority), а потом подписать от его имени все сертификаты (нам еще понадобятся сертификаты для dovecot). В этом случае клиентам нужно будет добавить доверие к этому CA, а не каждому сертификату отдельно. | + | Теперь создадим SSL сертификаты для TLS. Лучше всего (хотя и не обязательно) создать вначале свой CA (Certificate Authority), а потом подписать от его имени все сертификаты (нам еще понадобятся сертификаты для //dovecot//). В этом случае клиентам нужно будет добавить доверие к этому CA, а не каждому сертификату отдельно. |
Создаем CA. | Создаем CA. | ||
Строка 270: | Строка 277: | ||
Создадим папку, в которой будем генерить все сертификаты | Создадим папку, в которой будем генерить все сертификаты | ||
- | ''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: | Строка 310: | ||
Здесь и далее (замените на нужное Вам): | Здесь и далее (замените на нужное Вам): | ||
- | 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: | Строка 326: | ||
Создаем частный ключ ключ 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: | Строка 346: | ||
Создаем сертификат для подписывания: | Создаем сертификат для подписывания: | ||
- | ''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: | Строка 375: | ||
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: | Строка 397: | ||
Сделаем конфигурационный файл для подписи (срок действия подписи 5 лет - 1828 дней): | Сделаем конфигурационный файл для подписи (срок действия подписи 5 лет - 1828 дней): | ||
- | ''nano sign.config '' | + | <code bash>nano sign.config </code> |
<file>[ ca ] | <file>[ ca ] | ||
Строка 414: | Строка 430: | ||
и создадим директорию для хранения сертификатов подписей: | и создадим директорию для хранения сертификатов подписей: | ||
- | ''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: | Строка 447: | ||
Проверим подпись (на всякий случай): | Проверим подпись (на всякий случай): | ||
- | ''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: | Строка 499: | ||
Создадим файл /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: | Строка 506: | ||
и сменим его права доступа | и сменим его права доступа | ||
- | ''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: | Строка 518: | ||
и меняем ему владельца и права доступа | и меняем ему владельца и права доступа | ||
- | ''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: | Строка 575: | ||
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: | Строка 641: | ||
Редактируем файл | Редактируем файл | ||
- | ''sudo nano /etc/pam.d/smtp'' | + | <code bash>sudo nano /etc/pam.d/smtp</code> |
и добавляем в него строки | и добавляем в него строки | ||
Строка 629: | Строка 648: | ||
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: | Строка 673: | ||
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: | Строка 703: | ||
Меняем права доступа | Меняем права доступа | ||
- | ''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: | Строка 719: | ||
(это запрещает доставку писем с локального 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: | Строка 774: | ||
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: | Строка 789: | ||
После изменения /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: | Строка 816: | ||
Отредактируем файл /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: | Строка 824: | ||
Отредактируем файл /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: | Строка 882: | ||
Создадим скрипт, который будет посылать пользователям напоминания при превышении ими квоты | Создадим скрипт, который будет посылать пользователям напоминания при превышении ими квоты | ||
- | ''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: | Строка 898: | ||
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: | Строка 984: | ||
/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: | Строка 1041: | ||
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: | Строка 1077: | ||
Зададим список пользователей-администраторов, перечислив двух наших пользователей — ''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: | Строка 1135: | ||
Это нормально, т.к. мы не хотим, чтобы возможно было менять конфигурацию через веб. Скопируем показанный внизу на странице сгенеренный код и запишем его в файл /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: | Строка 1143: | ||
Отредактируем файл /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: | Строка 1161: | ||
и закомментируем все остальные примеры ниже. | и закомментируем все остальные примеры ниже. | ||
- | Войдем заново на %%https://oban.aaa.ru%% уже под одним из введенных нами пользователей с правами администратора. | + | Войдем заново на https://oban.aaa.ru уже под одним из введенных нами пользователей с правами администратора. |
Зайдем в **Управление - Приложения - Почта (imp)** и выберем закладку **Server**. | Зайдем в **Управление - Приложения - Почта (imp)** и выберем закладку **Server**. | ||
Строка 1150: | Строка 1169: | ||
Нажмем кнопку **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: | Строка 1175: | ||
Отредактируем файл /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: | Строка 1218: | ||
); </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: | Строка 1236: | ||
Нажмем кнопку **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: | Строка 1242: | ||
Отредактируем файл /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: | Строка 1252: | ||
<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: | Строка 1273: | ||
===== Установка 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: | Строка 1293: | ||
Отредактируем /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: | Строка 1304: | ||
$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: | Строка 1327: | ||
$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: | Строка 1337: | ||
* [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: | Строка 1373: | ||
Параметры задают правила обработки "нехороших" сообщений: | Параметры задают правила обработки "нехороших" сообщений: | ||
- | $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: | Строка 1400: | ||
Отредактируйте файл /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: | Строка 1411: | ||
#$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: | Строка 1446: | ||
-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: | Строка 1461: | ||
Установим нужные пакеты | Установим нужные пакеты | ||
- | ''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: | Строка 1492: | ||
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: | Строка 1500: | ||
<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: | Строка 1520: | ||
Это позволит обновлять набор правил каждый 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: | Строка 1576: | ||
<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: | Строка 1643: | ||
//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: | Строка 1867: | ||
<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: | Строка 1877: | ||
<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: | Строка 3662: | ||
<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> |
(вторая строка должна начинаться хотя бы с одного пробела) | (вторая строка должна начинаться хотя бы с одного пробела) | ||
Строка 3843: | Строка 3904: | ||
* [[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]] |
- | + | ||
- | {{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}} |