NB: Любые поправки и дополнения приветствуются!
Нам нужна почта, способная предоставить следующие сервисы:
Делать всё это будем на базе ALT Linux Master 2.4 и почтового демона Postfix. За основу возьмём HOWTO, взятое по ссылке с официального сайта Postfix.
Нам понадобятся:
Подключаем репозитарий backports, т.к. в ALM 2.4 нет необходимого нам postfix с поддержкой TLS.
cat > /etc/apt/sources.list.d/vendors.list.d/backports.list
simple-key “aris” {
И устанавливаем нужные нам пакеты:
Если ставить из Сизифа, то понадобится также:
Не забудьте сменить пароль в MySQL!
Так как MySQL в ALT Linux Master 2.4 работает в chroot и postfix тоже, нам придётся закомментировать в /var/lib/mysql/my.cnf строку skip-networking.
Заводим БД в MySQL:
И исполняем следующий скрипт для заведения таблиц:
CREATE TABLE postfix_alias (
id int(11) unsigned NOT NULL auto_increment,
alias varchar(128) NOT NULL default '',
destination varchar(128) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;
CREATE TABLE postfix_relocated (
id int(11) unsigned NOT NULL auto_increment,
email varchar(128) NOT NULL default '',
destination varchar(128) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;
CREATE TABLE postfix_transport (
id int(11) unsigned NOT NULL auto_increment,
domain varchar(128) NOT NULL default '',
destination varchar(128) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY domain (domain)
) TYPE=MyISAM;
CREATE TABLE postfix_virtual_domains (
id int(11) unsigned NOT NULL auto_increment,
domain varchar(128) NOT NULL default '',
destination varchar(128) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY domain (domain)
) TYPE=MyISAM;
CREATE TABLE postfix_users (
id int(11) unsigned NOT NULL auto_increment,
email varchar(128) NOT NULL default '',
clear varchar(128) NOT NULL default '',
crypt varchar(128) NOT NULL default '',
name tinytext NOT NULL,
uid int(11) unsigned NOT NULL default '1001',
gid int(11) unsigned NOT NULL default '1001',
homedir varchar(255) NOT NULL,
maildir varchar(255) NOT NULL default 'Maildir/',
quota varchar(255) NOT NULL default '20971520',
access enum('Y','N') NOT NULL default 'Y',
postfix enum('Y','N') NOT NULL default 'Y',
pop3 enum('Y','N') NOT NULL default 'Y',
imap enum('Y','N') NOT NULL default 'Y',
webmail enum('Y','N') NOT NULL default 'Y',
sharedgroup varchar(128) NOT NULL default '0',
smtpaccess enum('Y','N') NOT NULL default 'Y',
PRIMARY KEY (id),
UNIQUE KEY email (email)
) TYPE=MyISAM;
CREATE TABLE postfix_virtual (
id int(11) unsigned NOT NULL auto_increment,
email varchar(128) NOT NULL default '',
destination varchar(128) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;
CREATE TABLE postfix_access (
id int(10) unsigned NOT NULL auto_increment,
source varchar(128) NOT NULL default '',
access varchar(128) NOT NULL default '',
type enum('recipient','sender','client') NOT NULL default 'recipient',
PRIMARY KEY (id)
) TYPE=MyISAM ;
Копируем в MySQL содержимое /etc/postfix/aliases:
INSERT INTO postfix_alias VALUES (1,'MAILER-DAEMON','postmaster');
INSERT INTO postfix_alias VALUES (2,'info','postmaster');
INSERT INTO postfix_alias VALUES (3,'marketing','postmaster');
INSERT INTO postfix_alias VALUES (4,'sales','postmaster');
INSERT INTO postfix_alias VALUES (5,'support','postmaster');
INSERT INTO postfix_alias VALUES (6,'abuse','postmaster');
INSERT INTO postfix_alias VALUES (7,'noc','postmaster');
INSERT INTO postfix_alias VALUES (8,'security','postmaster');
INSERT INTO postfix_alias VALUES (9,'daemon','postmaster');
INSERT INTO postfix_alias VALUES (10,'ftp','postmaster');
INSERT INTO postfix_alias VALUES (11,'hostmaster','postmaster');
INSERT INTO postfix_alias VALUES (12,'lp','postmaster');
INSERT INTO postfix_alias VALUES (13,'mail','postmaster');
INSERT INTO postfix_alias VALUES (14,'news','postmaster');
INSERT INTO postfix_alias VALUES (15,'usenet','news');
INSERT INTO postfix_alias VALUES (16,'uucp','postmaster');
INSERT INTO postfix_alias VALUES (17,'webmaster','postmaster');
INSERT INTO postfix_alias VALUES (18,'www','webmaster');
INSERT INTO postfix_alias VALUES (19,'root','yourmail@yourdomain.ru');
Теперь создадим пользователя, от которого будет работать вся наша виртуальная почта:
Создадим новый домен и в нём пользователя:
INSERT INTO postfix_virtual_domains VALUES (NULL,'test.com','maildrop:') ;
INSERT INTO postfix_users (email,clear,name,homedir)
VALUES ('ujo@test.com','mypassword','Artem',' /home/vmail/test.com/ujo/') ;
И не забудем создать ему структуру каталога:
Дописываем в файл /etc/postfix/main.cf следующие строки:
smtpd_sasl_auth_enable = yes
smtpd_sasl2_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,
# The above line must be fitted in one line DONT FORGET
smtpd_sender_restrictions = check_sender_access mysql:/etc/postfix/mysql-sender.cf
smtpd_client_restrictions = check_client_access mysql:/etc/postfix/mysql-client.cf
alias_maps = mysql:/etc/postfix/mysql-aliases.cf
relocated_maps = mysql:/etc/postfix/mysql-relocated.cf
transport_maps = mysql:/etc/postfix/mysql-transport.cf
maildrop_destination_recipient_limit = 1
virtual_transport = maildrop
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-domains.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual.cf
virtual_mailbox_base = /home/vmail
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-maps.cf
virtual_uid_maps = mysql:/etc/postfix/mysql-virtual-uid.cf
virtual_gid_maps = mysql:/etc/postfix/mysql-virtual-gid.cf
# If you want to use TLS add three lines below
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/postfix.pem
smtpd_tls_key_file = $smtpd_tls_cert_file
TODO: Генерируем сертификат для SSL
openssl req -x509 -newkey rsa:1024 -keyout postfix.pem -out postfix.pem -nodes -days 365
Создаём в каталоге /etc/postfix файлы со следующим содержимым:
# mysql-relocated.cf
user = vmailuser
password = password123
dbname = mail
table = postfix_relocated
select_field = destination
where_field = email
hosts = 127.0.0.1
# mysql-transport.cf
user = vmailuser
password = password123
dbname = mail
table = postfix_transport
select_field = destination
where_field = domain
hosts = 127.0.0.1
# mysql-virtual-domains.cf
user = vmailuser
password = password123
dbname = mail
table = postfix_virtual_domains
select_field = destination
where_field = domain
hosts = 127.0.0.1
# mysql-virtual.cf
user = vmailuser
password = password123
dbname = mail
table = postfix_virtual
select_field = destination
where_field = email
hosts = 127.0.0.1
# mysql-recipient.cf
user = vmailuser
password = password123
dbname = mail
table = postfix_access
select_field = access
where_field = source
additional_conditions = and type = 'recipient'
hosts = 127.0.0.1
# mysql-sender.cf
user = vmailuser
password = password123
dbname = mail
table = postfix_access
select_field = access
where_field = source
additional_conditions = and type = 'sender'
hosts = 127.0.0.1
# mysql-client.cf
user = vmailuser
password = password123
dbname = mail
table = postfix_access
select_field = access
where_field = source
additional_conditions = and type = 'client'
hosts = 127.0.0.1
# mysql-virtual-maps.cf
user = vmailuser
password = password123
dbname = mail
table = postfix_users
select_field = maildir
where_field = email
additional_conditions = and postfix = 'y'
hosts = 127.0.0.1
# mysql-virtual-uid.cf
user = vmailuser
password = password123
dbname = mail
table = postfix_users
select_field = uid
where_field = email
additional_conditions = and postfix = 'y'
hosts = 127.0.0.1
Учитывая, что во всех этих файлах записан пароль для доступа к БД, исполняем следующие команды:
Т.к. в качестве MDA мы будем использовать maildrop, вносим в /etc/postfix/master.cf следующие строки:
maildrop unix – n n – – pipe
Создаём файл /etc/postfix/sasl/smtpd.conf и записываем в него следующее:
Также следим за правами доступа:
редактируем /etc/courier-imap/maildrop-mysql.conf:
Теперь проверяем, что получилось.
Работает.
Отправляем письмо куда-нибудь (echo test|mail -s test root), убеждаемся что связь с MySQL работает.
Postfix сообщает нам, что
Почта пришла и положена на место.
Здесь всё намного проще: база MySQL у нас уже есть, осталось только настроить Courier-IMAP.
Также вписываем в /etc/courier-imap/authdaemon.conf
authmodulelist="authmysql"
и редактируем /etc/courier-imap/authdaemon-mysql.conf:
И — специфика ALT — висываем в /etc/sysconfig/courier-imap
DEFAULT_AUTHD=mysql
Редактируем файлы pop3d, imapd, pop3d-ssl, imapd-ssl в /etc/courier-imap. Везде вписываем нужный нам ADDRESS и меняем строчки вида POP3DSTART=no на POP3DSTART=yes
запускаем authdaemon и другие:
Проверка:
POP3 работает.
IMAP тоже.
Для полноценной работы Courier-IMAP нужен демон FAM. Редактируем /etc/xinetd.d/sgi_fam, исправляем disable = yes на disable = no, и — это ошибка fam или xinetd — закомментируем строку only_from в /etc/xinetd.conf3
1 Так как MySQL и Postfix у нас оба работает в chroot, то следует писать именно 127.0.0.1, а не localhost. Не забудьте закомментировать строку skip-networking в /var/lib/mysql/my.cnf и прикрыть MySQL от внешнего доступа.
2 Строка для авторизации получается так:
perl -MMIME::Base64 -e 'print encode_base64(«ujo\@test.com\0ujo\@test.com\0mypassword»),"\n";'
3 На самом деле, это снижает безопасность xinetd, ведь с этой строкой все сервисы xinetd по умолчанию слушают только адрес 127.0.0.1, а не все доступные адреса. Однако, из-за досадной ошибки fam не желает работать со строкой only_from.