Установка MySQL
Тут особо нечего писать, поскольку в каждой системе (как минимум) этот продукт установлен по умолчанию Обращу только внимание на одну деталь - нужно убедится в том, что нормально работает русский + UTF-8 Так же для MTAweb будут использоваться таблицы с движком InnoDB. Требования к настройке InnoDB стандартные (те что поставляются в конфигурационном файле по умолчанию). Можно не использовать InnoDB, но это на свой страх и риск :)
Создаем базу:
> create database mail default charset utf8;
> grant all on mail.* to 'postfix'@'127.0.0.1' identified by 'postfix';
> Create Table: CREATE TABLE `transport` (
`id` int(5) NOT NULL auto_increment COMMENT 'Идентификатор записи',
`domain` varchar(100) NOT NULL default '' COMMENT 'Домен: mydomain.net',
`transport` varchar(100) NOT NULL default 'virtual' COMMENT 'Транспорт',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
> CREATE TABLE `aliases` (
`id` int(5) NOT NULL auto_increment COMMENT 'Идентификатор записи',
`alias` varchar(150) NOT NULL default '' COMMENT 'Имя алиаса: user@domain.net',
`recipient` varchar(150) NOT NULL default 'root@localhost' COMMENT 'Имя получателя: user@domain.net',
`comment` varchar(255) NOT NULL default '' COMMENT 'Коментарий',
PRIMARY KEY (`id`),
UNIQUE KEY `alias` (`alias`,`recipient`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
> CREATE TABLE `users` (
`id` int(5) NOT NULL auto_increment COMMENT 'Идентификатор записи',
`name` varchar(100) NOT NULL default '' COMMENT 'Имя учетной записи',
`login` varchar(65) NOT NULL default '' COMMENT 'Логин учетной записи: user@mydomain.net',
`passwd` varchar(65) NOT NULL default '' COMMENT 'Пароль',
`uid` int(5) NOT NULL default '8' COMMENT 'Системный пользователь',
`gid` int(5) NOT NULL default '12' COMMENT 'Системная группа',
`maildir` varchar(255) NOT NULL default '' COMMENT 'Путь к почтовой папке',
`smtp` tinyint(1) unsigned default '0' COMMENT 'Вкл / Отк SMTP протокола',
`imap` tinyint(1) unsigned default '0' COMMENT 'Вкл / Отк IMAP / POP3 протокола',
`quota` bigint(20) NOT NULL default '10000000' COMMENT 'Квота',
`manager` tinyint(1) NOT NULL default '0' COMMENT 'Разершить авторизоваться как менеджеру через вэб для управления',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
С базой разобрались.
Система
Немного шаманства и тут. Для корректной работы нужно завести группу и пользователя, которые будут владеть рядом операций, а так же деревом папок с письмами. Сразу оговорюсь, в моем случае сложилось так, что группа и пользователь уже были в системе и я ими воспользовался mail:mail. Их id связаны с теми, которые указаны в таблице users (uid, gid)
> groupadd -g 12 mail
> useradd -g mail -u 8 mail -d /home/domains -m
Установка Postfix
Про установку тоже упущу. Нужно обратить внимание на наличие следующих опций: mysql, pam, ssl, sasl. О sasl, его нужно выбирать исходя из того, какая будет использована система просмотра: courier, dovecot etc.
master.cf и main.cf - разница между ними велика и степень важности немаловажна (прикольная ТУФТАлогия вышла :) ) master.cf - взаимодействие модулей системы от момента открытия коннекта, до "положить письмо на диск". Сюда мы заглянем только, если нужно будет прибинтовать spamassassin или антивирус. main.cf - общие положения и свойства системы в целом и о нем пойдет речь. По правде говоря заносить записи в конф можно через встроенную команду postconf, но некоторым это может показать неудобным и тогда они расчехлят любимые редакторы и начнут многострадальный путь к совершенству. Приступим
Настраиваем важные параметры. Можно по примеру команды ниже, можно отредактировать файл
> postconf -e 'myhostname = domain.net'
- вместо domain.net должен быть указан настоящий FQDN
Далее перечислены параметры подлежащие изменению
mydestination = $transport_maps
mynetworks = 127.0.0.0/8
alias_maps = hash:/etc/postfix/aliases $virtual_alias_maps
alias_database = hash:/etc/postfix/aliases
Это нужно добавить (обычно в конец)
disable_vrfy_command = yes
smtpd_client_restrictions = permit_mynetworks,
check_client_access hash:/etc/postfix/access,
permit_sasl_authenticated,
reject_rhsbl_client rhsbl.dnsbl.sorbs.net
reject_rbl_client web.dnsbl.sorbs.net,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client dul.dnsbl.sorbs.net,
reject_rbl_client bl.spamcop.net,
reject_rbl_client rbl-plus.mail-abuse.org,
reject_rbl_client dul.ru,
reject_rbl_client dnsbl.njabl.org
smtpd_recipient_restrictions = permit_sasl_authenticated,
permit_mynetworks,
permit_auth_destination,
reject_unauth_pipelining,
reject_unauth_destination
smtpd_sender_restrictions = permit_sasl_authenticated,
check_sender_access hash:/etc/postfix/access
Строки ниже о приветствии для отъявленных параноиков. Можно их раскомментировать
smtpd_helo_required = yes
#smtpd_helo_restrictions = permit_mynetworks,
# reject_unknown_helo_hostname,
# reject_invalid_hostname,
# reject_non_fqdn_hostname
#smtpd_data_restrictions = reject_non_fqdn_recipient,
# reject_non_fqdn_sender,
# reject_unknown_recipient_domain,
# reject_unknown_sender_domain,
# permit
# Sasl-smtp plugin
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
broken_sasl_auth_clients = yes
smtp_tls_auth_only = yes
smtp_use_tls = yes
smtp_tls_key_file = /etc/courier-imap/imapd.pem
smtp_tls_cert_file = $smtp_tls_key_file
smtp_tls_CAfile = $smtp_tls_key_file
smtp_tls_note_starttls_offer = yes
smtpd_tls_auth_only = yes
smtpd_use_tls = yes
smtpd_log_loglevel = 3
smtpd_tls_recieved_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
smtpd_tls_key_file = /etc/courier-imap/imapd.pem
smtpd_tls_cert_file = $smtp_tls_key_file
smtpd_tls_CAfile = $smtp_tls_key_file
# MySQL
transport_maps = mysql:/etc/postfix/sql/transport.cf
virtual_minimum_uid = 8
virtual_mailbox_base = /home/domains
virtual_alias_maps = mysql:/etc/postfix/sql/aliases.cf
virtual_mailbox_maps = mysql:/etc/postfix/sql/users.cf
virtual_uid_maps = mysql:/etc/postfix/sql/uid.cf
virtual_gid_maps = mysql:/etc/postfix/sql/gid.cf
Теперь пора и запросы накидать. Создаем папку /etc/postfix/sql и в ней располагаем файлы с содержанием. Отмечу сразу - файлы содержат конструктор запросов, так что сильно не стоит умничать комментируя там что-то.
/etc/postfix/sql/aliases.cf
user = postfix
password = postfix
dbname = mail
table = aliases
select_field = recipient
where_field = alias
hosts = 127.0.0.1
/etc/postfix/sql/destination.cf
user = postfix
password = postfix
dbname = mail
table = transport
select_field = domain
where_field = domain
hosts = 127.0.0.1
/etc/postfix/sql/gid.cf
user = postfix
password = postfix
dbname = mail
table = users
select_field = gid
where_field = login
additional_conditions = and smtp = '1'
hosts = 127.0.0.1
/etc/postfix/sql/transport.cf
user = postfix
password = postfix
dbname = mail
table = transport
select_field = transport
where_field = domain
hosts = 127.0.0.1
/etc/postfix/sql/uid.cf
user = postfix
password = postfix
dbname = mail
table = users
select_field = uid
where_field = login
additional_conditions = and smtp = '1'
hosts = 127.0.0.1
/etc/postfix/sql/users.cf
user = postfix
password = postfix
dbname = mail
table = users
select_field = maildir
where_field = login
additional_conditions = and smtp = '1'
hosts = 127.0.0.1
Про ssl и сертификаты
Учитывая тот факт, что система несет на борту еще и courier-imapd, то было принято решение держать общий сертификат для обеих сторон (прием, отправка), так что по конфигурации main.cf видно куда ведут тропинки. АДМИНИСТРАТОР, это твое дело где ты будет хранить свой секьюрный хлам. Расскажу и покажу пример, как я себе облегчил жизнь с ключами. Дело было так, сегенерил ssl барахло, проработало установленный срок и сертификат истек и тут началось... А как я это делал? Забыл!... В папке где я храню ключи положил скрипт
#!/bin/bash
Name='imapd.pem'
DaysValid=365
Date=`date +%Y%m%d`
Name="${Date}-${Name}"
openssl req -x509 -nodes -days ${DaysValid} -subj '/C=RU/ST=MW/L=Moscow/O=Sharazh Montazh Server/OU=Sharazh Montazh Server/CN=full.domain.net/emailAddress=admin@domain.net' -newkey rsa:2048 -keyout ${Name} -out ${Name}
echo ""
echo ""
openssl x509 -in ${Name} -noout -text
echo ""
echo "Move link to the new certificate"
echo ""
Запускаем скрипт и вот радость, файл с .pem создан. Далее вешаем линк с простым удобным именем которое соответствует указанному пути в конфигурации. Должно получится нечто подобное
.
..
20120830-imapd.pem
create-cert.sh
imapd.pem -> 20120830-imapd.pem
Удобно тем, что в дальнейшем нужно будет сдвигать только линк, а файлы конфигурации остаются без изменения.
На сегодня хватит