Postfix и MySQL · 7 min read · Nov 25, 2025
Виртуальные пользователи и домены с Postfix, Courier, MySQL и SquirrelMail (Fedora 13 x86_64) - Страница 2
6 Установите пароли MySQL и настройте phpMyAdmin
Запустите MySQL:
chkconfig --levels 235 mysqld on
/etc/init.d/mysqld startЗатем установите пароли для учетной записи root MySQL:
mysql_secure_installation[root@server1 ~]# mysql_secure_installation
NOTE: РЕКОМЕНДУЕТСЯ ЗАПУСКАТЬ ВСЕ ЧАСТИ ЭТОГО СКРИПТА ДЛЯ ВСЕХ MySQL
СЕРВЕРОВ В ПРОИЗВОДСТВЕ! Пожалуйста, внимательно прочитайте каждый шаг!
Чтобы войти в MySQL для его защиты, нам нужен текущий
пароль для пользователя root. Если вы только что
установили MySQL и еще не установили пароль root,
пароль будет пустым, поэтому просто нажмите
ввод здесь.
Введите текущий пароль для root (введите для отсутствия): <– ВВОД
Хорошо, пароль успешно использован, продолжаем…
Установка пароля root гарантирует, что никто не сможет
войти в пользователя root MySQL без надлежащей
авторизации.
Установить пароль root? [Y/n] <– ВВОД
Новый пароль: <– вашпарольrootsql
Повторите новый пароль: <– вашпарольrootsql
Пароль успешно обновлен!
Перезагрузка таблиц привилегий.. … Успех!
По умолчанию установка MySQL имеет анонимного пользователя,
что позволяет любому войти в MySQL без необходимости
создания учетной записи пользователя. Это
предназначено только для тестирования и для
облегчения установки. Вы должны удалить их
перед переходом в производственную среду.
Удалить анонимных пользователей? [Y/n] <– ВВОД
… Успех!
Обычно root должен иметь возможность подключаться
только с ‘localhost’. Это гарантирует, что
кто-то не сможет угадать пароль root из сети.
Запретить удаленный вход root? [Y/n] <– ВВОД
… Успех!
По умолчанию MySQL поставляется с базой данных
с именем ‘test’, к которой может получить доступ
любой. Это также предназначено только для
тестирования и должно быть удалено
перед переходом в производственную среду.
Удалить тестовую базу данных и доступ к ней? [Y/n] <– ВВОД
- Удаление тестовой базы данных… … Успех!
- Удаление привилегий на тестовую базу данных… … Успех!
Перезагрузка таблиц привилегий гарантирует, что
все изменения, сделанные до сих пор,
вступят в силу немедленно.
Перезагрузить таблицы привилегий сейчас? [Y/n] <– ВВОД
… Успех!
Очистка…
Все готово! Если вы выполнили все
вышеуказанные шаги, ваша установка MySQL
должна быть теперь защищена.
Спасибо за использование MySQL!
[root@server1 ~]#
Теперь мы настраиваем phpMyAdmin. Мы изменяем
конфигурацию Apache, чтобы phpMyAdmin разрешал
подключения не только с localhost (закомментировав
стихию
vi /etc/httpd/conf.d/phpMyAdmin.conf| # phpMyAdmin - Веб-браузер MySQL на основе php # # Разрешает только localhost по умолчанию # # Но разрешение phpMyAdmin для любого, кроме localhost, следует считать # опасным, если не защищено должным образом с помощью SSL Alias /phpMyAdmin /usr/share/phpMyAdmin Alias /phpmyadmin /usr/share/phpMyAdmin # |
Затем мы создаем системные ссылки для запуска Apache и запускаем его:
chkconfig --levels 235 httpd on
/etc/init.d/httpd startТеперь вы можете направить свой браузер на http://server1.example.com/phpMyAdmin/ или http://192.168.0.100/phpMyAdmin/ и войти с именем пользователя root и вашим новым паролем root MySQL.
7 Создайте базу данных MySQL для Postfix/Courier
Мы создаем базу данных с именем mail:
mysqladmin -u root -p create mailЗатем мы переходим в оболочку MySQL:
mysql -u root -pВ оболочке MySQL мы создаем пользователя mail_admin с паролем mail_admin_password (замените его на свой собственный пароль), который имеет привилегии SELECT, INSERT, UPDATE, DELETE на базе данных mail. Этот пользователь будет использоваться Postfix и Courier для подключения к базе данных mail:
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(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 users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota bigint(20) DEFAULT '10485760',
PRIMARY KEY (email)
) TYPE=MyISAM;CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;quit;Как вы могли заметить, с помощью команды quit; мы вышли из оболочки MySQL и вернулись в оболочку Linux.
Таблица domains будет хранить каждый виртуальный домен, для которого Postfix должен получать электронные письма (например, example.com).
| domain |
| example.com |
Таблица forwardings предназначена для перенаправления одного адреса электронной почты на другой, например, перенаправление писем для [email protected] на [email protected].
| source | destination |
| [email protected] | [email protected] |
Таблица users хранит всех виртуальных пользователей (т.е. адреса электронной почты, поскольку адрес электронной почты и имя пользователя совпадают) и пароли (в зашифрованной форме!) и значение квоты для каждого почтового ящика (в этом примере значение по умолчанию составляет 10485760 байт, что означает 10 МБ).
| password | quota | |
| [email protected] | No9.E4skNvGa. (“секрет” в зашифрованной форме) | 10485760 |
Таблица transport является необязательной, она предназначена для опытных пользователей. Она позволяет перенаправлять письма для отдельных пользователей, целых доменов или всех писем на другой сервер. Например,
| domain | transport |
| example.com | smtp:[1.2.3.4] |
перенаправит все электронные письма для example.com через протокол smtp на сервер с IP-адресом 1.2.3.4 (квадратные скобки [] означают “не выполнять поиск записи MX DNS” (что имеет смысл для IP-адресов…). Если вы используете полное доменное имя (FQDN), то квадратные скобки не используются.).
8 Настройка Postfix
Теперь мы должны сказать Postfix, где он может найти всю информацию в базе данных. Для этого мы должны создать шесть текстовых файлов. Вы заметите, что я говорю Postfix подключаться к MySQL по IP-адресу 127.0.0.1 вместо localhost. Это связано с тем, что Postfix работает в chroot-тюрьме и не имеет доступа к сокету MySQL, к которому он пытался бы подключиться, если бы я сказал Postfix использовать localhost. Если я использую 127.0.0.1, Postfix использует TCP-сетевое соединение для подключения к MySQL, что не является проблемой даже в chroot-тюрьме (альтернативой было бы перемещение сокета MySQL в chroot-тюрьму, что вызывает некоторые другие проблемы).
Теперь давайте создадим наши шесть текстовых файлов.
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 на действительное 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_maildir_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 = "Пользователь, к которому вы пытаетесь обратиться, превышает квоту."'
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'
postconf -e 'inet_interfaces = all'После этого мы создаем 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Название страны (2 буквы) [XX]: <– Введите название вашей страны (например, “DE”).
Название штата или провинции (полное название) []: <– Введите название вашего штата или провинции.
Название местности (например, город) [Default City]: <– Введите ваш город.
Название организации (например, компания) [Default Company Ltd]: <– Введите название вашей организации (например, название вашей компании).
Название организационного подразделения (например, отдел) []: <– Введите название вашего организационного подразделения (например, “IT-отдел”).
Общее название (например, ваше имя или имя хоста вашего сервера) []: <– Введите полное доменное имя системы (например, “server1.example.com”).
Адрес электронной почты []: <– Введите ваш адрес электронной почты.
Затем измените разрешения для smtpd.key:
chmod o= /etc/postfix/smtpd.keyGet new posts in your inbox
No spam. Unsubscribe anytime.