База знаний

www. IT-Mehanika .ru --  журнал доброго админа

Почтовый сервер на основе Postfix, Dovecot, MySQL и SquirrelMail (Ubuntu 10,04 LTS) с Виртуальными пользователями и доменами

эта статья является компиляцией двух мануалов :
"Установка почтового сервера Postfix + Dovecot + MYSQL и виртуальных доменов" автор Stepanoff
"HowTo. Почтовый сервер Postfix, Courier, MySQL и SquirrelMail (Ubuntu 8,04)" автор Falko Timme перевод Глушков Вадим

Всем им респект и уважуха за очень удачные и содержательные мануалы !!!

Меня не устроило в первой статье использование в качестве IMAP Courier. А во второй статье огорчило , что много приходится доделывать руками, например создание директорий доменов. 
Поэтому я взял настройку постфикса и антиспама из первой статьи (она там исчерпывающая), а dovecot из второй.


1. Предварительные замечания

Убедитесь, что вы зашли как суперпользователь,

sudo su

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

Очень важным является, чтобы вы сделали символическую ссылку /bin/sh на /bin/bash...

ln -sf /bin/bash /bin/sh

... и еще отключите AppArmor:

/etc/init.d/apparmor    stop
update-rc.d -f apparmor remove

Все ошибки и прочие события из жизни вашего почтовика вы можете найти в логах
/var/log/mail.log
/var/log/mail.err
/var/log/mail.warn
/var/log/mail.info


2. Установка Postfix, Dovecot, Saslauthd, MySQL, phpMyAdmin

Для установки Postfix, Dovecot, Saslauthd, MySQL и phpMyAdmin, нам просто необходимо вполнить:

apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server dovecot-pop3d dovecot-imapd openssl postfix-tls libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql libpam-smbpass

Вам будет задано несколько вопросов на которые необходимо ответить:

New password for the MySQL "root" user: <-- yourrootsqlpassword
Repeat password for the MySQL "root" user: <-- yourrootsqlpassword
Create directories for web-based administration? <-- No
General type of mail configuration: <-- Internet Site
System mail name: <-- server1.example.com
SSL certificate required <-- Ok
Web server to reconfigure automatically: <-- apache2

3. Применение патча квоты Postfix

Если у вас 10.04 server, то этот пункт вам не нужен . Там квоты и так работают. А если нет ... :
Мы должны получить исходники Postfix, патч к нему, построить .deb пакеты и установить  эти .deb пакеты:

apt-get install build-essential dpkg-dev fakeroot debhelper libgdbm-dev libldap2-dev libpcre3-dev libssl-dev libsasl2-dev postgresql-server-dev-8.2 po-debconf dpatch libmysqlclient15-dev lsb-release libcdb-dev libdb-dev

cd /usr/src
apt-get source postfix

(Убедитесь что вы используете корректную версию Postfix. У меня установлена версия Postfix 2.5.1. Вы можете узнать вашу версию выполнив следующие команды:

postconf -d | grep mail_version

Вы должны увидеть после выполнения команд следующее:

root@server1:/usr/src# postconf -d | grep mail_version
mail_version = 2.5.1
milter_macro_v = $mail_name $mail_version
root@server1:/usr/src#
)

wget http://vda.sourceforge.net/VDA/postfix-2.5.1-vda-ng.patch.gz
gunzip postfix-2.5.1-vda-ng.patch.gz
cd postfix-2.5.1
patch -p1 < ../postfix-2.5.1-vda-ng.patch
dpkg-buildpackage

Вы можете увидеть предупреждения при выполнении команды dpkg-buildpackage, например такие:

dpkg-buildpackage: warning: Failed to sign .dsc and .changes file

такие сообщения можно игнорировать

Сейчас мы перейдем на один уровень вверх и посмотрим какие новые .deb пакеты были созданы:

cd ..

Выполним команду

ls -l

она покажет нам все доступные пакеты:

root@server1:/usr/src# ls -l
total 5804
drwxr-sr-x 19 root src    4096 2008-05-15 00:36 postfix-2.5.1
-rw-r--r--  1 root src  235739 2008-05-15 00:35 postfix_2.5.1-2ubuntu1.diff.gz
-rw-r--r--  1 root src     787 2008-05-15 00:35 postfix_2.5.1-2ubuntu1.dsc
-rw-r--r--  1 root src    2236 2008-05-15 00:37 postfix_2.5.1-2ubuntu1_i386.changes
-rw-r--r--  1 root src 1165838 2008-05-15 00:37 postfix_2.5.1-2ubuntu1_i386.deb
-rw-r--r--  1 root src 3153629 2008-02-26 03:04 postfix_2.5.1.orig.tar.gz
-rw-r--r--  1 root src   57952 2008-03-24 01:51 postfix-2.5.1-vda-ng.patch
-rw-r--r--  1 root src   39796 2008-05-15 00:37 postfix-cdb_2.5.1-2ubuntu1_i386.deb
-rw-r--r--  1 root src  139888 2008-05-15 00:37 postfix-dev_2.5.1-2ubuntu1_all.deb
-rw-r--r--  1 root src  916386 2008-05-15 00:37 postfix-doc_2.5.1-2ubuntu1_all.deb
-rw-r--r--  1 root src   46694 2008-05-15 00:37 postfix-ldap_2.5.1-2ubuntu1_i386.deb
-rw-r--r--  1 root src   41730 2008-05-15 00:37 postfix-mysql_2.5.1-2ubuntu1_i386.deb
-rw-r--r--  1 root src   41530 2008-05-15 00:37 postfix-pcre_2.5.1-2ubuntu1_i386.deb
-rw-r--r--  1 root src   41796 2008-05-15 00:37 postfix-pgsql_2.5.1-2ubuntu1_i386.deb
root@server1:/usr/src#

Выбираем пакеты postfix и postfix-mysql и устанавливаем их:

dpkg -i postfix_2.5.1-2ubuntu1_i386.deb
dpkg -i postfix-mysql_2.5.1-2ubuntu1_i386.deb

4. Создание базы данных MySQL для Postfix/Courier.
Базу можно создавать из командной строки ( как истиному линуксоиду) или нагляднее через phpmyadmin (типа ламеры :) )
Я предпочитаю второй способ. Ниже привиден пример для создания в командной строке , но можно открыть
http://<ваш адрес>/phpmyadmin , скопировать SQL запросы туда и не знать горя :)

Сначала создадим базу данных с названием mail:

mysqladmin -u root -p create mail
в phpmyadmin : create database mail;

Затем мы перейдем в оболочку MySQL:

mysql -u root -p

В оболочке MySQL скорлупы, мы создадим пользователя mail_admin с паролем  mail_admin_password (замените на свои) которые будет иметь следующие привилегии  SELECT, INSERT, UPDATE, DELETE на базу данных mail. Этот пользователь будет использоваться Postfix и Courier для подключения к почтовой базе:

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';
FLUSH PRIVILEGES;

Сейчас используя оболочку MySQL, мы создадим таблицы необходимые Postfix и Courier:

USE mail;

CREATE TABLE domains (
domain varchar(80) 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 userlist (
name varchar(80) NOT NULL,
domain varchar(80) NOT NULL DEFAULT 'ваш домен.по умолчанию',
password varchar(32) NOT NULL,
quota INT(10) DEFAULT '10485760',
PRIMARY KEY (name),
KEY `domain` (`domain`)
) TYPE=MyISAM;

CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;


ALTER TABLE `userlist` ADD INDEX ( `domain` ) ;

CREATE VIEW users AS
SELECT CONCAT(userlist.name, '@', domains.domain) AS email,
userlist.password FROM userlist
LEFT JOIN domains ON userlist.domain=domains.domain;

quit;

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

Как вы уже наверное заметили мы покинули оболочку MySQL и ввернулись командную оболочку Linux.
Таблица domains будет хранить наименования виртуальных доменов для которых Postfix будет получать письма.

domain
example.com

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

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

Таблица users будет содержать всю информацию о  виртуальных пользователях (например, адреса электронной почты, потому что адрес электронной почты и имя пользователя одно и тоже) и паролей (в зашифрованном виде!), а также размер квоты для каждого почтового ящика (в данном примере значение по умолчанию равно 10485760 байт, что означает 10 Мб)

name       
domain
password
quota

sales
example.com
3565626532323934656364306530663038656162373639306432613665653639 (MD5("secret")  )
10485760

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

domain 
transport
example.com
smtp:[1.2.3.4]

направит все сообщения приходящие для example.com по протоколу smtp на сервер IP-адресом 1.2.3.4 (квадратные скобки [] означают "не делать поиск MX записи в DNS" (это имеет смысл для IP-адреса .. .). Если вы используете полное доменное имя (FQDN), а вам не нужно использовать квадратные скобки.).

Между прочим (предполагая, что адрес вашего почтового сервера 192.168.0.100), для доступа к почтовой базе данных через phpMyAdmin вы можете набрать в вашем браузере http://192.168.0.100/phpmyadmin/ и войти как mail_admin. После этого вы можете посмотреть базу данных. В дальнейшем вы можете использовать phpMyAdmin для администрирования  почтового сервера.

5. Настройка Postfix

Сейчас нам необходимо указать Postfix, где ему искать информацию в базе данных. Для этого создадим шесть текстовых файлов. Как вы можете заметить, я указываю Postfix соединяться с MySQL через IP адрес 127.0.0.1 вместо localhost. Это связанно с тем, что Postfix запущенный в chroot окружении не сможет иметь доступа к MySQL сокету, если будет пытаться использовать localhost для подключения. Если же я буду использовать 127.0.0.1 будет использовать TCP сеть для подключения к MySQL, и это снимет проблему соединения из chroot окружения (в качестве альтернативы можно поместить соект MySQL в chroot окружение, но это вызовет дополнительные проблемы).

Убедитесь что /etc/mysql/my.cnf содержит следующие строки:

vi /etc/mysql/my.cnf

[...]
bind-address            = 127.0.0.1
[...]
Если вы изменили /etc/mysql/my.cnf, пожалуйста перезапустите MySQL:

/etc/init.d/mysql restart

Запустите

netstat -tap | grep mysql

чтобы убедится, что MySQL прослушивает  127.0.0.1 (localhost.localdomain):

root@server1:/usr/src# netstat -tap | grep mysql
tcp        0      0 localhost.localdo:mysql *:*                     LISTEN      6177/mysqld
root@server1:/usr/src#

Сейчас давайте создадим шесть необходимых нам файлов:

vi /etc/postfix/mysql-virtual_domains.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1

vi /etc/postfix/mysql-virtual_forwardings.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1

vi /etc/postfix/mysql-virtual_mailboxes.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1

vi /etc/postfix/mysql-virtual_email2email.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1

vi /etc/postfix/mysql-virtual_transports.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT transport FROM transport WHERE domain='%s'
hosts = 127.0.0.1

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT quota FROM users WHERE email='%s'
hosts = 127.0.0.1

Изменяем права доступа и группа для этих файлов:

chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cf

Создаем нового пользователя и группу с названием vmail с домашней директорией /home/vmail ,  где будут находится почтовые ящики:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

Сейчас мы настроим Postfix. Обязательно замените server1.example.com with на настоящий FQDN, иначе ваш почтовый сервер Postfix не сможет корректно работать!

postconf -e 'myhostname = server1.example.com'
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'virtual_alias_domains ='
postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_mailbox_extended = yes'
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'
postconf -e 'virtual_mailbox_limit_override = yes'
postconf -e 'virtual_maildir_limit_message = "The user you are trying to reach is over quota."'
postconf -e 'virtual_overquota_bounce = yes'
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'

Создадим сертификат SSL необходимый для TLS:
cd /etc/postfix
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Country Name (2 letter code) [AU]: <-- Введите страну (например, "RU").
State or Province Name (full name) [Some-State]: <-- Введите название области (например,"Moskow") .
Locality Name (eg, city) []: <-- Введите населенный пункт (например, "Moskow").
Organization Name (eg, company) [Internet Widgits Pty Ltd]: <-- Введите наименование вашей организации (например, "Ltd DoIt").
Organizational Unit Name (eg, section) []: <--  Введите наименование вашего подразделения (например. "IT Department").
Common Name (eg, YOUR name) []: <-- Введите Fully Qualified Domain Name (например. "server1.example.com").
Email Address []: <-- Введите ваш email.

Изменяем права доступа на smtpd.key:

chmod o= /etc/postfix/smtpd.key

6 Настройка Saslauthd

Сначала выполним следующую команду:

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

Затем изменим /etc/default/saslauthd. Установив параметр START в yes и заменим строку OPTIONS="-c -m /var/run/saslauthd" на OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r":

vi /etc/default/saslauthd

#
# Settings for saslauthd daemon
# Please read /usr/share/doc/sasl2-bin/README.Debian for details.
#

# Should saslauthd run automatically on startup? (default: no)
START=yes

# Description of this saslauthd instance. Recommended.
# (suggestion: SASL Authentication Daemon)
DESC="SASL Authentication Daemon"

# Short name of this saslauthd instance. Strongly recommended.
# (suggestion: saslauthd)
NAME="saslauthd"

# Which authentication mechanisms should saslauthd use? (default: pam)
#
# Available options in this Debian package:
# getpwent  -- use the getpwent() library function
# kerberos5 -- use Kerberos 5
# pam       -- use PAM
# rimap     -- use a remote IMAP server
# shadow    -- use the local shadow password file
# sasldb    -- use the local sasldb database file
# ldap      -- use LDAP (configuration is in /etc/saslauthd.conf)
#
# Only one option may be used at a time. See the saslauthd man page
# for more information.
#
# Example: MECHANISMS="pam"
MECHANISMS="pam"

# Additional options for this mechanism. (default: none)
# See the saslauthd man page for information about mech-specific options.
MECH_OPTIONS=""

# How many saslauthd processes should we run? (default: 5)
# A value of 0 will fork a new process for each connection.
THREADS=5

# Other options (default: -c -m /var/run/saslauthd)
# Note: You MUST specify the -m option or saslauthd won't run!
#
# See /usr/share/doc/sasl2-bin/README.Debian for Debian-specific information.
# See the saslauthd man page for general information about these options.
#
# Example for postfix users: "-c -m /var/spool/postfix/var/run/saslauthd"
#OPTIONS="-c -m /var/run/saslauthd"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"
Создаем файл /etc/pam.d/smtp. И добавляем в него две строчки (обязательно используйте корректные значения относящиеся к вашей базе данных):

vi /etc/pam.d/smtp

auth    required   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
account 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
Создаем файл /etc/postfix/sasl/smtpd.conf. Он должен быть подобного вида:

vi /etc/postfix/sasl/smtpd.conf

pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: mail_admin_password
sql_database: mail
sql_select: select password from users where email = '%u'
Добавляем пользователя postfix в группу sasl (это даст Postfix права доступа к saslauthd):

adduser postfix sasl

Перезапускаем Postfix и Saslauthd:

/etc/init.d/postfix restart
/etc/init.d/saslauthd restart

7 Настройка Dovecot

Перейдем к настройкам dovecot, все файлы его конфигурации хранятся в папке /etc/dovecot, начнем настройку с файла /etc/dovecot/dovecot.conf

Найдите строку protocols и смените на

Код:


protocols = imap imaps pop3 pop3s

Так же найдите и измените строку disable_plaintext_auth до состояния disable_plaintext_auth = no

Далее измените параметр mail_location

Код:


mail_location = maildir:/home/vmail/%d/%n

Найдите строку namespace private и измените до

Код:


namespace private {
separator = .
prefix = INBOX.  (если пользователи ругаются на то что ящики расположены деревом, то оставьте пустое место)
inbox = yes
}

Перейдите к секции «auth default» и отредактируйте разрешенные механизмы аутентификации

Код:


mechanisms = plain login

В этой же секции измените

Код:


passdb sql {
args = /etc/dovecot/dovecot-sql.conf
}

Измените так же параметр userdb static

Код:


userdb static {
args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}

Перейдите к секции socket listen сдесь мы укажем файлы сокета для аутентификации dovecot

Код:


socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
user = vmail
}
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}

Перейдите к секции protocol lda, не забудьте сменить адрес постмастера на реальный

Код:


protocol lda {
log_path = /home/vmail/dovecot-deliver.log
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
mail_plugins = cmusieve
global_script_path = /home/vmail/globalsieverc
}

На этом файл можно сохранить.
Отредактируйте файл /etc/dovecot/dovecot-sql.conf, измените настройки на приведенные ниже

Код:


driver = mysql
connect = host=127.0.0.1 dbname=mail user=mail_admin password=mail_admin_password
default_pass_scheme = PLAIN-MD5
password_query = SELECT email as user, password FROM users WHERE email='%u';


Перезапустите dovecot командой /etc/init.d/dovecot restart и загляните в лог файл /var/log/mail.log, там вы должны увидеть

Код:


dovecot: Dovecot v1.0.rc15 starting up
dovecot: auth-worker(default): mysql: Connected to 127.0.0.1 (mymailserver)

Теперь выставим права доступа к файлам конфигурации dovecot

Код:


$>
chgrp vmail /etc/dovecot/dovecot.conf
$>
chmod g+r /etc/dovecot/dovecot.conf

Настроим TLS/SSL

Код:


$>
openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem \
-keyout /etc/ssl/private/dovecot.pem

Ответьте на несколько вопросов и сертификат будет создан, не забудьте указать правльно все параметры вместо примеров привеленных ниже

Код:


Generating a 1024 bit RSA private key
.........++++++
............................++++++
writing new private key to '/etc/ssl/certs/dovecot.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Russia
Locality Name (eg, city) []:Russia
Organization Name (eg, company) [Internet Widgits Pty Ltd]:example.com
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:mail.example.com
Email Address []:Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.

Выставим права доступа на файл

Код:


$>
chmod o= /etc/ssl/private/dovecot.pem


Теперь настроим аутентификацию SMTP, внесите следующие изменения в конфиг Postfix’a, не забудьте сменить примеры на реальные адреса сетей!

Код:

dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

Многие забывают внести последний радостный штрих в постфикс и ломают голову "Что же не работает ???" ( сам такой был:) )
$>
postconf -e mynetworks=192.168.50.0/24  (Внимание !!! подумай прежде чем сделать это ! читай ниже.)
$>
postconf -e smtpd_sasl_type=dovecot
$>
postconf -e smtpd_sasl_path=private/auth
$>
postconf -e smtpd_sasl_auth_enable=yes
$>
postconf -e smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

В примере используется сеть 192.168.50.0/24 ей разрешено отправлятиь почту без SMTP авторизации. В своей сети я запрещаю отправку без авторизации. Причина - потенциальный спам если подхватишь трояна. поэтому я ставлю postconf -e mynetworks=127.0.0.0/8 , а все остальные компы сети только через авторизацию !
На этом настройка нашего БАЗОВОГО почтового сервера закончена .Перезапустите сервисы postfix и dovecot, выполните команду postfix check для проверки правильности настроек и прав доступа на файлы, команда должна отдать пустой результат.


telnet localhost imap
чтобы убедится, что наш сервер IMAP корректно работает. Мы должны увидеть
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
(введите quit для возврата в оболочку Linux).

8 Изменяем /etc/aliases

Откроем и изменим /etc/aliases. Сделаете так, что postmaster указывать на root, а root указывает на ваше имя пользователя или ваш почтовый адрес, у вас должно получится примерно так:

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

[...]
postmaster: root
root:   administrator
[...]

После изменения /etc/aliases, вы должны запустить команду

newaliases

и перезапустить Postfix:

/etc/init.d/postfix restart


9 Установка amavisd-new, SpamAssassin и ClamAV

Для установки amavisd-new, spamassassin и clamav, выполним следующую команду:

apt-get install amavisd-new spamassassin clamav clamav-daemon zoo unzip bzip2 zip libnet-ph-perl libnet-snpp-perl libnet-telnet-perl nomarch lzop pax

Настроим amavisd-new. Конфигурационные файлы находятся в директории  /etc/amavis/conf.d . Ознакомитесь с ними. Большинство из настроек в этих файлах отлично выставлены, но все же мы изменим три файла:

Во первых включим ClamAV и SpamAssassin in /etc/amavis/conf.d/15-content_filter_mode раскомментировав  @bypass_virus_checks_maps и @bypass_spam_checks_maps lines:

vi /etc/amavis/conf.d/15-content_filter_mode

Файл должен быть похож на этот:

use strict;

# You can modify this file to re-enable SPAM checking through spamassassin
# and to re-enable antivirus checking.

#
# Default antivirus checking mode
# Uncomment the two lines below to enable it back
#

@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);


#
# Default SPAM checking mode
# Uncomment the two lines below to enable it back
#

@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

1;  # ensure a defined return

Вам следует посмотреть настройки спама и действия со спамом в /etc/amavis/conf.d/20-debian_defaults. Вам нет необходимости менять настройки по умолчанию. Этот файл содержит хорошие комментарии и поэтому нет необходимости дополнительно их разъяснять здесь:

vi /etc/amavis/conf.d/20-debian_defaults

[...]
$QUARANTINEDIR = "$MYHOME/virusmails";
$quarantine_subdir_levels = 1; # enable quarantine dir hashing

$log_recip_templ = undef;    # disable by-recipient level-0 log entries
$DO_SYSLOG = 1;              # log via syslogd (preferred)
$syslog_ident = 'amavis';    # syslog ident tag, prepended to all messages
$syslog_facility = 'mail';
$syslog_priority = 'debug';  # switch to info to drop debug output, etc

$enable_db = 1;              # enable use of BerkeleyDB/libdb (SNMP and nanny)
$enable_global_cache = 1;    # enable use of libdb-based cache if $enable_db=1

$inet_socket_port = 10024;   # default listening socket

$sa_spam_subject_tag = '***SPAM*** ';
$sa_tag_level_deflt  = 2.0;  # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 6.31; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 6.31; # triggers spam evasive actions
$sa_dsn_cutoff_level = 10;   # spam level beyond which a DSN is not sent

$sa_mail_body_size_limit = 200*1024; # don't waste time on SA if mail is larger
$sa_local_tests_only = 0;    # only tests which do not require internet access?

[...]
$final_virus_destiny      = D_DISCARD;  # (data not lost, see virus quarantine)
$final_banned_destiny     = D_BOUNCE;   # D_REJECT when front-end MTA
$final_spam_destiny       = D_BOUNCE;
$final_bad_header_destiny = D_PASS;     # False-positive prone (for spam)
[...]
Последним отредактируем /etc/amavis/conf.d/50-user добавив посередке параметр  $pax='pax'; :

vi /etc/amavis/conf.d/50-user

use strict;

#
# Place your configuration directives here.  They will override those in
# earlier files.
#
# See /usr/share/doc/amavisd-new/ for documentation and examples of
# the directives you can use in this file
#

$pax='pax';

#------------ Do not modify anything below this line -------------
1;  # ensure a defined return

После этого добавим пользователя clamav в группу amavis и презапустим amavisd-new и ClamAV:

adduser clamav amavis
/etc/init.d/amavis restart
/etc/init.d/clamav-daemon restart
/etc/init.d/clamav-freshclam restart

Настроим Postfix так чтобы он получал всю входящую почту через amavisd-new:

postconf -e 'content_filter = amavis:[127.0.0.1]:10024'
postconf -e 'receive_override_options = no_address_mappings'

Добавим следующие строки в /etc/postfix/master.cf:


vi /etc/postfix/master.cf

[...]
amavis unix - - - - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes

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

Перезапустим Postfix:

/etc/init.d/postfix restart

Выполним

netstat -tap

убедимся, что Postfix (master) прослушивает 25 (smtp) и 10025 порт, а amavisd-new расположен на 10024:

root@server1:/etc/postfix# netstat -tap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 localhost.localdo:10024 *:*                     LISTEN      15645/amavisd (mast
tcp        0      0 localhost.localdo:10025 *:*                     LISTEN      16677/master
tcp        0      0 localhost.localdo:mysql *:*                     LISTEN      6177/mysqld
tcp        0      0 *:www                   *:*                     LISTEN      5367/apache2
tcp        0      0 *:smtp                  *:*                     LISTEN      16677/master
tcp6       0      0 [::]:imaps              [::]:*                  LISTEN      14020/couriertcpd
tcp6       0      0 [::]:pop3s              [::]:*                  LISTEN      14088/couriertcpd
tcp6       0      0 [::]:pop3               [::]:*                  LISTEN      14051/couriertcpd
tcp6       0      0 [::]:imap2              [::]:*                  LISTEN      13983/couriertcpd
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      4006/sshd
tcp6       0     52 server1.example.com:ssh 192.168.0.210%8191:3340 ESTABLISHED 4059/0
root@server1:/etc/postfix#

10 Установка Razor, Pyzor And DCC и настройка SpamAssassin

Razor, Pyzor и DCC это спам фильтры, которые используются совместно для фильтрации в сети. Установим Razor и Pyzor

apt-get install razor pyzor

DCC не содержится в репозитории Ubuntu 8.04, поэтому мы его установим так:

cd /tmp
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
dpkg -i dcc-common_1.3.42-5_i386.deb
dpkg -i dcc-server_1.3.42-5_i386.deb

Скажем SpamAssassin использовать эти три программы. Отредактируем /etc/spamassassin/local.cf добавив несколько строчек в него:

vi /etc/spamassassin/local.cf

[...]
#dcc
use_dcc 1
dcc_path /usr/bin/dccproc

#pyzor
use_pyzor 1
pyzor_path /usr/bin/pyzor

#razor
use_razor2 1
razor_config /etc/razor/razor-agent.conf

#bayes
use_bayes 1
use_bayes_rules 1
bayes_auto_learn 1

Мы должны включить плагин DCC в SpamAssassin. Откроем /etc/spamassassin/v310.pre и раскомментируем такую строчку loadplugin Mail::SpamAssassin::Plugin::DCC :

vi /etc/spamassassin/v310.pre

[...]
# DCC - perform DCC message checks.
#
# DCC is disabled here because it is not open source.  See the DCC
# license for more details.
#
loadplugin Mail::SpamAssassin::Plugin::DCC
[...]

Можно проверить настройки SpamAssassin выполнив:

spamassassin --lint

Вывод не должен содержать никаких ошибок.

Перезапускаем amavisd-new:

/etc/init.d/amavis restart

Обновим набор правил для SpamAssassin следующим образом:

sa-update —no-gpg

Добавим в cron задание, чтобы набор правил обновлялся регулярно. Запустим

crontab -e

чтобы открыть редактор cron и добавим в него следующее задание:

23 4 */2 * * /usr/bin/sa-update --no-gpg &> /dev/null

Это позволит обновлять набор правил каждый 2 день в 4 часа 23 минуты.

11 Предупреждения при превышении квоты

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

cd /usr/local/sbin/
wget http://puuhis.net/vhcs/quota.txt
mv quota.txt quota_notify
chmod 755 quota_notify

Откроем для редактирования файл /usr/local/sbin/quota_notify отредактируем переменные сверху. В конце файла находятся две строчки где вы должны добавить % для подписи:

vi /usr/local/sbin/quota_notify

[...]
my $POSTFIX_CF = "/etc/postfix/main.cf";
my $MAILPROG = "/usr/sbin/sendmail -t";
my $WARNPERCENT = 80;
my @POSTMASTERS = ('Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. ');
my $CONAME = 'My Company';
my $COADDR = 'Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. ';
my $SUADDR = 'Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. ';
my $MAIL_REPORT = 1;
my $MAIL_WARNING = 1;
[...]
print "Subject: WARNING: Your mailbox is $lusers{$luser}% full.\n";
[...]
print "Your mailbox: $luser is $lusers{$luser}% full.\n\n";
[...]

Запустим

crontab -e

чтоб задать задание cron на выполнения скрипта

0 0 * * * /usr/local/sbin/quota_notify &> /dev/null

12 Проверка Postfix

Чтоб ы посмотреть слушает ли Postfix порты SMTP-AUTH и TLS, выполним

telnet localhost 25

После установления подключения с вашим почтовым сервером Postfix введем следующее:

ehlo localhost

и увидим следующие строки

250-STARTTLS
и
250-AUTH LOGIN PLAIN

если все нормально:

root@server1:/usr/local/sbin# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 server1.example.com ESMTP Postfix (Ubuntu)
ehlo localhost
250-server1.example.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
quit
221 2.0.0 Bye
Connection closed by foreign host.
root@server1:/usr/local/sbin#

введем

quit

для того чтобы вернутся в оболочку Linux.

13 Заполнение базы данных и ее тестирование
Большинству более удобно работать через графический интерфейс с MySQL, для этого можно использовать phpMyAdmin ( в данном примере необходимо набрать в строке вашего интернет браузера http://192.168.0.100/phpmyadmin/ или http://server1.example.com/phpmyadmin/) для администрирования базы данных mail . При создании пользователей, мы должны использовать функцию ENCRYPT для шифрования пароля.
Для заполнения базы данных будем использовать оболочку MySQL:

mysql -u root -p
USE mail;

По крайней мере нам необходимо добавить записи в таблицы domains и users:

INSERT INTO `domains` (`domain`) VALUES ('example.com');

INSERT INTO `userlist` (`name`,`domain`, `password`, `quota`) VALUES ('sales','example.com', MD5('secret'), 10485760);

(Пожалуйста, с осторожностью используйте синтаксис MD5 во втором объявлении INSERT для шифрования пароля!)

Если необходимо вставить данные в остальные две таблицы, сделаем так:

INSERT INTO `forwardings` (`source`, `destination`) VALUES ('Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. ', 'Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. ');
INSERT INTO `transport` (`domain`, `transport`) VALUES ('example.com', 'smtp:mail.example.com');

Выйдем с оболочки MySQL набрав

quit;



Таблица forwardings может иметь записи следующего вида:

source
destination

Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
Перенаправляет почту предначначеную для  Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. на Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
@example.com
Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
Создает ловушку для всех аккаунтов Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. . Вся почта домена example.com будет доставляться на адрес Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. , исключая тех кто находится в таблице users (например, если Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. существует в таблице users, то письма направленные на Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. будут по прежнему доставляться Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. ).
@example.com
@anotherdomain.tld
Перенаправляет письма всех пользователей направленные на  example.com на этих же пользователей в домен  anotherdomain.tld. Например, письмо для Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. будет направленно на Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. .
Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. , Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
Перенапрваить почту для Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. на двух и большее количество адресатов. Все указанные адресаты получат копию почтового сообщения.

Таблица transport может иметь записи такого вида:

domain
transport

example.com
:
Delivers emails for example.com locally. This is as if this record would not exist in this table at all.
example.com
smtp:mail.anotherdomain.tld
Delivers all emails for example.com via smtp to the server mail.anotherdomain.com.
example.com
smtp:mail.anotherdomain.tld:2025
Delivers all emails for example.com via smtp to the server mail.anotherdomain.com, but on port 2025, not 25 which is the default port for smtp.
example.com
smtp:[1.2.3.4]
smtp:[1.2.3.4]:2025
smtp:[mail.anotherdomain.tld]

The square brackets prevent Postfix from doing lookups of the MX DNS record for the address in square brackets. Makes sense for IP addresses.
.example.com
smtp:mail.anotherdomain.tld
Mail for any subdomain of example.com is delivered to mail.anotherdomain.tld.
*
smtp:mail.anotherdomain.tld
All emails are delivered to mail.anotherdomain.tld.
Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
smtp:mail.anotherdomain.tld
Emails for Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. are delivered to mail.anotherdomain.tld.

Посмотри

man transport

чтобы узнать больше деталей.

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

Важно: Postfix использует механизм кэширования для транспортов, и чтобы изменения сделанные в таблице transport вступили в действия, вам необходимо выполнить перезагрузку

postfix reload

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

При попытке получения почты с нового почтового ящика (через POP3/IMAP) вы получите сообщение о том, что почтовый каталог не существует. Почтовый каталог создается автоматически, когда приходит первое письмо, поэтому лучше всего отправлять письмо приветствия после создания нового почтового ящика.

Установим пакет mailx:

apt-get install mailx

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

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

Вам будет предложено ввести тему, введите ее (например, добро пожаловать!), нажмите ENTER и в следующих строчках  напишите ваше сообщения. Когда закончим набирать сообщения необходимо набрать CTRL+D и еще раз ENTER:

root@server1:/usr/local/sbin# mailx Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
Subject: Welcome <-- ENTER
Welcome! Have fun with your new mail account. <-- ENTER
<-- CTRL+D
Cc: <-- ENTER
root@server1:/usr/local/sbin#

15 Установка SquirrelMail

SquirrelMail это веб интерфейс, который позволяет пользователю получать и отправлять почту используя браузер. В этой части покажем как установить и позволим в наших настройках пользователям менять свой пароль используя интерфейс SquirrelMail.

Чтобы установить SquirrelMail выполним:

apt-get install squirrelmail php-pear

Скопируем конфигурационный файл Apache, который входит в пакет SquirrelMail, в каталог  /etc/apache2/conf.d перезапустим Apache:

cp /etc/squirrelmail/apache.conf /etc/apache2/conf.d/squirrelmail.conf
/etc/init.d/apache2 restart

Squirrelmail сразу устанавливается со множеством плагинов, но среди нех нет необходимого для нас плагина позволяющего изменять пароль.
Установим его в ручную (предварительно установив установив все необходимое для его работы:

pear install DB

cd /usr/share/squirrelmail/plugins
wget http://www.squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fwww.squirrelmail.org%2Fplugins%2Fchange_sqlpass-3.3-1.2.tar.gz
tar xvfz change_sqlpass-3.3-1.2.tar.gz
cd change_sqlpass
cp config.php.sample config.php

Сейчас нам необходимо отредактировать config.php и настроить его для наших нужд.Пожалуйста , отредактируйте переменные $csp_dsn,
$lookup_password_query, $password_update_queries, $password_encryption, $csp_salt_static и $csp_delimiter variables,
как показанно ниже и закомментируйте $csp_salt_query:

vi config.php

[...]
$csp_dsn = 'mysql://mail_admin:mail_admin_password@localhost/mail';
[...]
$lookup_password_query = 'SELECT count(*) FROM users WHERE email = "%1" AND password = %4';
[...]
$password_update_queries = array('UPDATE users SET password = %4 WHERE email = "%1"');
[...]
$password_encryption = 'MYSQLENCRYPT';
[...]
$csp_salt_static = 'LEFT(password, 2)';
[...]
//$csp_salt_query = 'SELECT salt FROM users WHERE username = "%1"';
[...]
$csp_delimiter = '@';
[...]

В итоге мы должны получить файл такого содержания:

<?php

/**
* SquirrelMail Change SQL Password Plugin
* Copyright (C) 2001-2002 Tyler Akins
*               2002 Thijs Kinkhorst <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. >
*               2002-2005 Paul Lesneiwski <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. >
* This program is licensed under GPL. See COPYING for details
*
* @package plugins
* @subpackage Change SQL Password
*
*/


// Global Variables, don't touch these unless you want to break the plugin
//
global $csp_dsn, $password_update_queries, $lookup_password_query,
$force_change_password_check_query, $password_encryption,
$csp_salt_query, $csp_salt_static, $csp_secure_port,
$csp_non_standard_http_port, $csp_delimiter, $csp_debug,
$min_password_length, $max_password_length, $include_digit_in_password,
$include_uppercase_letter_in_password, $include_lowercase_letter_in_password,
$include_nonalphanumeric_in_password;



// csp_dsn
//
// Theoretically, any SQL database supported by Pear should be supported
// here.  The DSN (data source name) must contain the information needed
// to connect to your database backend. A MySQL example is included below.
// For more details about DSN syntax and list of supported database types,
// please see:
//   http://pear.php.net/manual/en/package.database.db.intro-dsn.php
//
$csp_dsn = 'mysql://mail_admin:mail_admin_password@localhost/mail';



// lookup_password_query
//
// This plugin will always verify the user's old password
// against their login password, but an extra check can also
// be done against the database for more security if you
// desire.  If you do not need the extra password check,
// make sure this setting is empty.
//
// This is a query that returns a positive value if a user
// and password pair are found in the database.
//
// This query should return one value (one row, one column), the
// value being ideally a one or a zero, simply indicating that
// the user/password pair does in fact exist in the database.
//
//   %1 in this query will be replaced with the full username
//      (including domain), such as "Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. "
//   %2 in this query will be replaced with the username (without
//      any domain portion), such as "jose"
//   %3 in this query will be replaced with the domain name,
//      such as "example.com"
//   %4 in this query will be replaced with the current (old)
//      password in whatever encryption format is needed per other
//      plugin configuration settings (Note that the syntax of
//      the password will be provided depending on your encryption
//      choices, so you NEVER need to provide quotes around this
//      value in the query here.)
//   %5 in this query will be replaced with the current (old)
//      password in unencrypted plain text.  If you do not use any
//      password encryption, %4 and %5 will be the same values,
//      except %4 will have double quotes around it and %5 will not.
//
//$lookup_password_query = '';
// TERRIBLE SECURITY: $lookup_password_query = 'SELECT count(*) FROM users WHERE username = "%1" AND plain_password = "%5"';
//$lookup_password_query = 'SELECT count(*) FROM users WHERE username = "%1" AND crypt_password = %4';
$lookup_password_query = 'SELECT count(*) FROM users WHERE email = "%1" AND password = %4';


// password_update_queries
//
// An array of SQL queries that will all be executed
// whenever a password change attempt is made.
//
// Any number of queries may be included here.
// The queries will be executed in the order given here.
//
//   %1 in all queries will be replaced with the full username
//      (including domain), such as "Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. "
//   %2 in all queries will be replaced with the username (without
//      any domain portion), such as "jose"
//   %3 in all queries will be replaced with the domain name,
//      such as "example.com"
//   %4 in all queries will be replaced with the new password
//      in whatever encryption format is needed per other
//      plugin configuration settings (Note that the syntax of
//      the password will be provided depending on your
//      encryption choices, so you NEVER need to provide quotes
//      around this value in the queries here.)
//   %5 in all queries will be replaced with the new password
//      in unencrypted plain text - BEWARE!  If you do not use
//      any password encryption, %4 and %5 will be the same
//      values, except %4 will have double quotes around it
//      and %5 will not.
//
//   $password_update_queries = array(
//            'UPDATE users SET crypt_password = %4 WHERE username = "%1"',
//            'UPDATE user_flags SET force_change_pwd = 0 WHERE username = "%1"',
//            'UPDATE users SET crypt_password = %4, force_change_pwd = 0 WHERE username = "%1"',
//                                   );
$password_update_queries = array('UPDATE users SET password = %4 WHERE email = "%1"');


// force_change_password_check_query
//
// A query that checks for a flag that indicates if a user
// should be forced to change their password.  This query
// should return one value (one row, one column) which is
// zero if the user does NOT need to change their password,
// or one if the user should be forced to change it now.
//
// This setting should be an empty string if you do not wish
// to enable this functionality.
//
//   %1 in this query will be replaced with the full username
//      (including domain), such as "Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. "
//   %2 in this query will be replaced with the username (without
//      any domain portion), such as "jose"
//   %3 in this query will be replaced with the domain name,
//      such as "example.com"
//
//$force_change_password_check_query = 'SELECT IF(force_change_pwd = "yes", 1, 0) FROM users WHERE username = "%1"';
//$force_change_password_check_query = 'SELECT force_change_pwd FROM users WHERE username = "%1"';
$force_change_password_check_query = '';



// password_encryption
//
// What encryption method do you use to store passwords
// in your database?  Please use one of the following,
// exactly as you see it:
//
//   NONE          Passwords are stored as plain text only
//   MYSQLPWD      Passwords are stored using the MySQL password() function
//   MYSQLENCRYPT  Passwords are stored using the MySQL encrypt() function
//   PHPCRYPT      Passwords are stored using the PHP crypt() function
//   MD5CRYPT      Passwords are stored using encrypted MD5 algorithm
//   MD5           Passwords are stored as MD5 hash
//
//$password_encryption = 'MYSQLPWD';
$password_encryption = 'MYSQLENCRYPT';


// csp_salt_query
// csp_salt_static
//
// Encryption types that need a salt need to know where to get
// that salt.  If you have a constant, known salt value, you
// should define it in $csp_salt_static.  Otherwise, leave that
// value empty and define a value for the $csp_salt_query.
//
// Leave both values empty if you do not need (or use) salts
// to encrypt your passwords.
//
// The query should return one value (one row, one column) which
// is the salt value for the current user's password.  This
// query is ignored if $csp_salt_static is anything but empty.
//
//   %1 in this query will be replaced with the full username
//      (including domain), such as "Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. "
//   %2 in this query will be replaced with the username (without
//      any domain portion), such as "jose"
//   %3 in this query will be replaced with the domain name,
//      such as "example.com"
//
//$csp_salt_static = 'LEFT(crypt_password, 2)';
//$csp_salt_static = '"a4"';  // use this format with MYSQLENCRYPT
//$csp_salt_static = '$2$blowsomefish$';  // use this format with PHPCRYPT
//$csp_salt_static = '';
$csp_salt_static = 'LEFT(password, 2)';

//$csp_salt_query = 'SELECT SUBSTRING_INDEX(crypt_password, '$', 1) FROM users WHERE username = "%1"';
//$csp_salt_query = 'SELECT SUBSTRING(crypt_password, (LENGTH(SUBSTRING_INDEX(crypt_password, '$', 2)) + 2)) FROM users WHERE username = "%1"';
//$csp_salt_query = 'SELECT salt FROM users WHERE username = "%1"';
//$csp_salt_query = '';



// csp_secure_port
//
// You may ensure that SSL encryption is used during password
// change by setting this to the port that your HTTPS is served
// on (443 is typical).  Set to zero if you do not wish to force
// an HTTPS connection when users are changing their passwords.
//
// You may override this value for certain domains, users, or
// service levels through the Virtual Host Login (vlogin) plugin
// by setting a value(s) for $vlogin_csp_secure_port in the vlogin
// configuration.
//
$csp_secure_port = 0;
//$csp_secure_port = 443;



// csp_non_standard_http_port
//
// If you serve standard HTTP web requests on a non-standard
// port (anything other than port 80), you should specify that
// port number here.  Set to zero otherwise.
//
// You may override this value for certain domains, users, or
// service levels through the Virtual Host Login (vlogin) plugin
// by setting a value(s) for $vlogin_csp_non_standard_http_port
// in the vlogin configuration.
//
//$csp_non_standard_http_port = 8080;
$csp_non_standard_http_port = 0;



// min_password_length
// max_password_length
// include_digit_in_password
// include_uppercase_letter_in_password
// include_lowercase_letter_in_password
// include_nonalphanumeric_in_password
//
// You can set the minimum and maximum password lengths that
// you accept or leave those settings as zero to indicate that
// no limit should be applied.
//
// Turn on any of the other settings here to check that the
// new password contains at least one digit, upper case letter,
// lower case letter and/or one non-alphanumeric character.
//
$min_password_length = 6;
$max_password_length = 0;
$include_digit_in_password = 0;
$include_uppercase_letter_in_password = 0;
$include_lowercase_letter_in_password = 0;
$include_nonalphanumeric_in_password = 0;



// csp_delimiter
//
// if your system has usernames with something other than
// an "@" sign separating the user and domain portion,
// specify that character here
//
//$csp_delimiter = '|';
$csp_delimiter = '@';



// debug mode
//
$csp_debug = 0;



?>

Установим необходимый нам Compatibility plugin:

cd /usr/share/squirrelmail/plugins
wget http://www.squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fwww.squirrelmail.org%2Fplugins%2Fcompatibility-2.0.11-1.0.tar.gz
tar xvfz compatibility-2.0.11-1.0.tar.gz

Укажем SquirrelMail, что мы используем Courier в качестве POP3 и IMAP сервера и подключим  Change SQL Password и Compatibility плагины:

/usr/sbin/squirrelmail-configure

Увидев меню конфигурации с помощью пунктов выбора настроим наш SquirrelMail^

SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Main Menu --
1.  Organization Preferences
2.  Server Settings
3.  Folder Defaults
4.  General Options
5.  Themes
6.  Address Books
7.  Message of the Day (MOTD)
8.  Plugins
9.  Database
10. Languages

D.  Set pre-defined settings for specific IMAP servers

C   Turn color on
S   Save data
Q   Quit

Command >> <-- D

SquirrelMail Configuration : Read: config.php
---------------------------------------------------------
While we have been building SquirrelMail, we have discovered some
preferences that work better with some servers that don't work so
well with others.  If you select your IMAP server, this option will
set some pre-defined settings for that server.

Please note that you will still need to go through and make sure
everything is correct.  This does not change everything.  There are
only a few settings that this will change.

Please select your IMAP server:
bincimap    = Binc IMAP server
courier     = Courier IMAP server
cyrus       = Cyrus IMAP server
dovecot     = Dovecot Secure IMAP server
exchange    = Microsoft Exchange IMAP server
hmailserver = hMailServer
macosx      = Mac OS X Mailserver
mercury32   = Mercury/32
uw          = University of Washington's IMAP server

quit        = Do not change anything
Command >> <-- courier



imap_server_type = courier
default_folder_prefix = INBOX.
trash_folder = Trash
sent_folder = Sent
draft_folder = Drafts
show_prefix_option = false
default_sub_of_inbox = false
show_contain_subfolders_option = false
optional_delimiter = .
delete_folder = true

Press any key to continue... <-- press some key

SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Main Menu --
1.  Organization Preferences
2.  Server Settings
3.  Folder Defaults
4.  General Options
5.  Themes
6.  Address Books
7.  Message of the Day (MOTD)
8.  Plugins
9.  Database
10. Languages

D.  Set pre-defined settings for specific IMAP servers

C   Turn color on
S   Save data
Q   Quit

Command >> <-- 8

SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Plugins
Installed Plugins

Available Plugins:
1. abook_take
2. administrator
3. bug_report
4. calendar
5. change_sqlpass
6. compatibility
7. delete_move_next
8. demo
9. filters
10. fortune
11. info
12. listcommands
13. mail_fetch
14. message_details
15. newmail
16. sent_subfolders
17. spamcop
18. squirrelspell
19. test
20. translate

R   Return to Main Menu
C   Turn color on
S   Save data
Q   Quit

Command >> <-- 6 (or whatever number the compatibility plugin has - it's needed by the change_sqlpass plugin)

SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Plugins
Installed Plugins
1. compatibility

Available Plugins:
2. abook_take
3. administrator
4. bug_report
5. calendar
6. change_sqlpass
7. delete_move_next
8. demo
9. filters
10. fortune
11. info
12. listcommands
13. mail_fetch
14. message_details
15. newmail
16. sent_subfolders
17. spamcop
18. squirrelspell
19. test
20. translate

R   Return to Main Menu
C   Turn color on
S   Save data
Q   Quit

Command >> <-- 6 (the number of the change_sqlpass plugin)

SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Plugins
Installed Plugins
1. compatibility
2. change_sqlpass

Available Plugins:
3. abook_take
4. administrator
5. bug_report
6. calendar
7. delete_move_next
8. demo
9. filters
10. fortune
11. info
12. listcommands
13. mail_fetch
14. message_details
15. newmail
16. sent_subfolders
17. spamcop
18. squirrelspell
19. test
20. translate

R   Return to Main Menu
C   Turn color on
S   Save data
Q   Quit

Command >> <-- S

SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Plugins
Installed Plugins
1. compatibility
2. change_sqlpass

Available Plugins:
3. abook_take
4. administrator
5. bug_report
6. calendar
7. delete_move_next
8. demo
9. filters
10. fortune
11. info
12. listcommands
13. mail_fetch
14. message_details
15. newmail
16. sent_subfolders
17. spamcop
18. squirrelspell
19. test
20. translate

R   Return to Main Menu
C   Turn color on
S   Save data
Q   Quit

Command >> S

Data saved in config.php
Press enter to continue... <-- press some key

SquirrelMail Configuration : Read: config.php (1.4.0)
---------------------------------------------------------
Plugins
Installed Plugins
1. compatibility
2. change_sqlpass

Available Plugins:
3. abook_take
4. administrator
5. bug_report
6. calendar
7. delete_move_next
8. demo
9. filters
10. fortune
11. info
12. listcommands
13. mail_fetch
14. message_details
15. newmail
16. sent_subfolders
17. spamcop
18. squirrelspell
19. test
20. translate

R   Return to Main Menu
C   Turn color on
S   Save data
Q   Quit

Command >> <-- Q

Все настроено . Для доступа к веб интерфейсу SquirrelMail вы можете набрать в вашем браузере http://server1.example.com/squirrelmail или http://192.168.0.100/squirrelmail.


Вот собственно и все что я хотел написать. Заранее звиняйте если какие-то ляпы остались. Писалось паралельно с установкой нового сервака. ;)

Mr.Bublik

Блогун - монетизируем блоги

Комментарии   

0 #9 Guest 19.05.2011 11:58
Нашёл содержание файла quota.txt вот по этому адресу: howtoforge.com/.../...
0 #8 Guest 08.10.2010 12:33
Сделал все по инструкции, не работает шифрование на SMTP, пишет что соединение небезопасно. Подскажите, куда копать? В чем может быть проблема?
0 #7 Guest 05.10.2010 20:19
С грехом пополам настроил, правда вылазит куча ошибок. При коннекте к постфиксу не выдает STARTTLS, почтовые клиенты тоже говорят мол соединение небезопасно. Подскажите, где копать? почему постфикс не подружился с шифрованием?
0 #6 Guest 02.10.2010 19:42
Цитирую Mr.Bublik:
Спасибо за интерес к этой теме

Да не за что, но...
Запустить рабочий мэйл-сервер по данному руководству мне не удалось, почти на каждом этапе возникают ошибки.
postfix не слушает 25 и 10025 порты, файл quota_notify по ссылке puuhis.net/vhcs/quota.txt отсутствует, архив с патчем для squirrelmail для смены паролей по ссылке не скачался, я нашел через сайт, скачал - не распаковывается - неожиданный конец архива. И т.д. :sigh:
в общем все плохо(у меня).
Прошу помощи. Могу дать номер аськи.
0 #5 mrbublik 26.09.2010 23:32
Цитирую logos:
Хоть один человек по этому руководству настраивал?
Вот это что такое:

Теперь настроим аутентификацию SMTP, внесите следующие изменения в конфиг Postfix’a, не забудьте сменить примеры на реальные адреса сетей!
Код:

dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
???

у меня больше десятка серверов по этому мануалу собраны.
Вот эту строку надо вставить в master.cf что бы dovecot мог нежно общаться с postfix`ом
Спасибо за интерес к этой теме , ну и вообще заметите ляпы какие-нибудь пишите ! буду рад .
0 #4 Guest 26.09.2010 18:45
Хоть один человек по этому руководству настраивал?
Вот это что такое:

Теперь настроим аутентификацию SMTP, внесите следующие изменения в конфиг Postfix’a, не забудьте сменить примеры на реальные адреса сетей!
Код:

dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmai l argv=/usr/lib/d ovecot/deliver -d ${recipient}
???
0 #3 mrbublik 09.08.2010 16:32
Типа Спасиба !!! :-) Еще чего наковыряю -размещу
0 #2 Guest 08.08.2010 16:40
бля респект, не могу нарадоватся)
0 #1 admin 08.07.2010 22:42
Да ! и еще в догонку , не забываем о волшебной утилитке imapsync. Вот такой строчкой можно легко перетащить почту со старого на новый сервак. Пример : imapsync --host1 192.168.0.1 --user1 --password1 pass2 --host2 192.168.0.2 --user2 --password2 pass2
и еще - там параметр интересный --mechauth1
а примеры автоматизации переноса здесь : www.lissyara.su/.../imapsync . Респект и уважуха !!! :)

You have no rights to post comments