Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Последняя версия Следующая версия справа и слева | ||
wiki:почтовый_сервер_со_всем_фаршем_на_10.04_lts [2011/07/20 12:23] [Настройка saslauthd] |
wiki:почтовый_сервер_со_всем_фаршем_на_10.04_lts [2012/08/13 15:27] перенёс что-то с форума, вдруг пригодится |
||
---|---|---|---|
Строка 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 ===== | ||
Строка 1126: | Строка 1143: | ||
Отредактируем файл /etc/horde/imp4/servers.php | Отредактируем файл /etc/horde/imp4/servers.php | ||
- | <code bash>sudo /etc/horde/imp4/servers.php</code> | + | <code bash>sudo nano /etc/horde/imp4/servers.php</code> |
<file>$servers['imap'] = array( | <file>$servers['imap'] = array( | ||
Строка 1850: | Строка 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// закомментарена. | ||
Проверьте, что файл | Проверьте, что файл | ||
Строка 1862: | Строка 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-записи нашего домена (доменов): | ||
Строка 3621: | Строка 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> |
(вторая строка должна начинаться хотя бы с одного пробела) | (вторая строка должна начинаться хотя бы с одного пробела) | ||
Строка 3859: | Строка 3900: | ||
Теперь в разделе **Почта — Фильтры** можно активировать, редактировать имеющиеся фильтры или добавлять новые. Все правила, которые Вы будете задавать через //horde (ingo)// будут записываться в файл правил с именем //ingo//. Этот файл будет доступен для редактирования с помощью любого другого плагина //sieve// (например, к //thunderbird//). | Теперь в разделе **Почта — Фильтры** можно активировать, редактировать имеющиеся фильтры или добавлять новые. Все правила, которые Вы будете задавать через //horde (ingo)// будут записываться в файл правил с именем //ingo//. Этот файл будет доступен для редактирования с помощью любого другого плагина //sieve// (например, к //thunderbird//). | ||
+ | |||
+ | ===== FAQ ===== | ||
+ | |||
+ | **Q: В этой статье написано, как настроить LDAP?**\\ | ||
+ | A: Нет. Настройка LDAP - это своя большая тема, которая лежит за рамками этого howto. Здесь просто показано, как использовать уже имеющийся LDAP. Если его нет (и нет AD) - используйте только mysql. | ||
+ | |||
+ | **Q: Как сделать такой сервер, но без LDAP?**\\ | ||
+ | A: Просто пропускайте все, что связано с LDAP и делайте только то, что связано с mysql. | ||
===== Ссылки ===== | ===== Ссылки ===== | ||
* [[http://forum.ubuntu.ru/index.php?topic=127090.0|Обсуждение статьи на форуме]] | * [[http://forum.ubuntu.ru/index.php?topic=127090.0|Обсуждение статьи на форуме]] | ||
- | * [[http://forum.ubuntu.ru/index.php?action=dlattach;topic=127090.0;attach=25869|Статья в формате .odt]] | + | * [[http://forum.ubuntu.ru/index.php?action=dlattach;topic=127090.0;attach=30328|Статья в формате .odt]] |
- | + | * [[http://wiki.horde.org/FAQ/Admin/Troubleshoot|Horde Administrator's FAQ]] — решение проблем с Horde | |
- | {{tag>postfix dovecot amavis spamassassin autoresponder sieve horde clamav razor pyzor postgrey spf dkim domainkey mailman fail2ban munin}} | + | |
+ | {{tag>администрирование postfix dovecot amavis spamassassin autoresponder sieve horde clamav razor pyzor postgrey spf dkim domainkey mailman fail2ban munin}} |