Настройка почтовой системы на freebsd. Часть I

  • Настройка почтовой системы на freebsd. Часть I

  • Данный документ описывает установку и настройку почтовой системы на основе Postfix, Cyrus-SASL, MySQL, Courier-IMAP, postfixadmin, clamav, spamassassin, amavisd-new. При этом нет разницы, сколько почтовых доменов заведено в системе, как называются пользователи, мы будем использовать виртуальных пользователей, которые с системными никак не пересекаются.


    Но аналогично построенные системы работают на CentOS и на других RedHat подобных дистрибутивах. Сейчас данная связка у меня работает больше года на СentOS-4.0, пока ни одного сбоя замечено не было. Поэтому не вижу причин, почему бы данной связке не работать на других системах.

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

    Совет всем линуксоидам
    Не собирайте ничего из исходников tar.bz2 или tar.gz. Лучше скачайте src.rpm и соберите rpm пакет . Лично я, собираю все пакеты на VMware, а на сервер ставлю уже готовые rpm пакеты. Очень удобно и система не засоряется. Также рекомендую прочитать статью про основы работы с менеджером пакетов rpm .

    Обновление системы

    Настраивал данную связку на FreeBSD-7.2. Установленную с помощью образа 7.2-RELEASE-i386-bootonly.iso. Поэтому перед началом использования данной симстемы мы ее обновим. Так как система у нас новая, то воспользуемся бинарным обновлением. Для этого выполняем следующие команды

    # freebsd-update fetch
    # freebsd-update install
    

    После этого перегружаем сервер. В итоге мы должны получить следующую систему:

    # uname -a
    FreeBSD freebsd7.w3.lan 7.2-RELEASE-p2 FreeBSD 7.2-RELEASE-p2 #0: Wed Jun 24 00:57:44 UTC 2009
    root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  i386
    

    А теперь займемся обновление дерева портов. Для начала скачаем самое свежее дерево портов

    # portsnap fetch
    Looking up portsnap.FreeBSD.org mirrors... 3 mirrors found.
    Fetching public key from portsnap2.FreeBSD.org... done.
    Fetching snapshot tag from portsnap2.FreeBSD.org... done.
    Fetching snapshot metadata... done.
    ...
    ...
    ...
    Fetching 11 patches.....10 done.
    Applying patches... done.
    Fetching 0 new ports or files... done.
    

    Разпаковываем дерево портов

    # portsnap extract
    /usr/ports/.cvsignore
    /usr/ports/CHANGES
    /usr/ports/COPYRIGHT
    ...
    ...
    ...
    /usr/ports/x11/yeahconsole/
    /usr/ports/x11/yelp/
    /usr/ports/x11/zenity/
    Building new INDEX files... done.
    

    И так у нас полностью обновленная и свежая система, теперь переходим к установке ПО.

    Perl


    Итак, начнем по порядку. Скорее всего, perl уже стоит у вас в системе, т.к. на него завязано слишком много пакетов. В линуксе он вообще сразу ставится с системой. Если perl не установлен, то ставим его


    Некоторые командные процессоры для ускорения поиска выполнимых файлов и команд кэшируют имена программ, доступных для вызова из каталогов, перечисленных в переменной окружения PATH .

    Если вы используете один из таких командных процессоров, то перед использованием только что добавленных программ вам может понадобиться вызвать команду rehash после установки порта. Эта команда будет работать с такими оболочками, как, например, tcsh.

    При работе с такими командными процессорами, как sh или shells/bash, воспользуйтесь командой hash -r. Дополнительную информацию можно найти в документации к вашему командному процессору

    Openssl


    Устанавливаем openssl. Он нам понадобится для генерации сертификатов/ключей, а также для поддержки SSL/TLS.

    # cd /usr/ports/security/openssl/
    # make install clean
    # rehash 
    

    Mysql


    Устанавливаем и настраиваем MySQL. На unix системах, наверное, одна из самых распространенных СУБД. MySQL необходим для работы postfixadmin. В базе данных мы будем хранить информацию о пользователях и почтовых ящиках.

    # cd /usr/ports/databases/mysql50-server/
    # setenv BUILD_OPTIMIZED yes
    # setenv WITH_OPENSSL yes
    # setenv WITH_CHARSET utf8
    # make install clean
    # rehash
    

    Устанавливаем набор вспомогательных скриптов, которые помогают настроить MySQL.

    # cd /usr/ports/databases/mysql50-scripts/
    # make install clean
    # rehash 
    

    Производим первоначальную настройку MySQL сервера. Настраиваем запуск MySQL вместе с системой

    # echo 'mysql_enable="YES"' >> /etc/rc.conf 
    

    Создаем конфигурационный файл, исправляем по своему желанию

    # cp /usr/local/share/mysql/my-large.cnf /etc/my.cnf 
    
    #
    # /etc/my.cnf
    #
    
    [mysqld]
    # Указываем log файл, полезно для отладки и поиска проблем
    log=/var/log/mysql.log
    
    # Привязываем MySQL к loopback интерфейсу.
    bind-address=127.0.0.1 
    
    # Задаем кодировку по умолчанию
    default-character-set=utf8
    character-set-server=utf8
    collation-server=utf8_general_ci
    init-connect="SET NAMES utf8"

    Создаем соответствующий файл и выставляем необходимые права

    # touch /var/log/mysql.log
    # chown mysql:mysql /var/log/mysql.log 
    

    Запускаем MySQL

    # /usr/local/etc/rc.d/mysql-server start
    Starting mysql.
    
    # cat /var/log/mysql.log
    /usr/local/libexec/mysqld, Version: 5.0.85-log (FreeBSD port: mysql-server-5.0.85). started with:
    Tcp port: 3306  Unix socket: /tmp/mysql.sock
    Time                 Id Command    Argument
    

    А теперь воспользуемся скриптом для настройки безопасности MySQL сервера

    # /usr/local/bin/mysql_secure_installation
    
    
    
    
    NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
          SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
    
    
    In order to log into MySQL to secure it, we'll need the current
    password for the root user.  If you've just installed MySQL, and
    you haven't set the root password yet, the password will be blank,
    so you should just press enter here.
    
    Enter current password for root (enter for none):
    OK, successfully used password, moving on...
    
    Setting the root password ensures that nobody can log into the MySQL
    root user without the proper authorisation.
    
    Set root password? [Y/n] y
    New password: *******
    Re-enter new password: *******
    Password updated successfully!
    Reloading privilege tables..
     ... Success!
    
    
    By default, a MySQL installation has an anonymous user, allowing anyone
    to log into MySQL without having to have a user account created for
    them.  This is intended only for testing, and to make the installation
    go a bit smoother.  You should remove them before moving into a
    production environment.
    
    Remove anonymous users? [Y/n] y
     ... Success!
    
    Normally, root should only be allowed to connect from 'localhost'.  This
    ensures that someone cannot guess at the root password from the network.
    
    Disallow root login remotely? [Y/n] y
     ... Success!
    
    By default, MySQL comes with a database named 'test' that anyone can
    access.  This is also intended only for testing, and should be removed
    before moving into a production environment.
    
    Remove test database and access to it? [Y/n] y
     - Dropping test database...
     ... Success!
     - Removing privileges on test database...
     ... Success!
    
    Reloading the privilege tables will ensure that all changes made so far
    will take effect immediately.
    
    Reload privilege tables now? [Y/n] y
     ... Success!
    
    Cleaning up...
    
    
    
    All done!  If you've completed all of the above steps, your MySQL
    installation should now be secure.
    
    Thanks for using MySQL!
    

    Что делает скрипт mysql_secure_installation
    Как видно из названия самого скрипта он предназначен для повышения безопасности MySQL сервера. С помощью этого скрипта мы выполнили следующие действия:

    • задали пароль для супер пользователя root (с системным root он не имеет ничего общего, это абсолютно два разных пользователя), так как по умолчанию для него не установлен пароль;
    • удалили анонимного пользователя, который создается только для тестовых целей;
    • запретили пользователю root входить удаленно. Теперь он сможет заходить только с localhost;
    • удалили тестовую БД test и доступ к ней;

    Все, с MySQL мы разобрались, идем дальше.

    Cyrus-Sasl

    Собираем и настраиваем Cyrus-SASL. Данную библиотеку мы будем использовать для SMTP аутентификации, т.е. проверки логина и пароля по некоторому алгоритму, например PLAIN, LOGIN, CRAM-MD5.

    # cd /usr/ports/security/cyrus-sasl2/
    # make config 
    

    # make install clean
    

    Courier-authlib


    Собираем и настраиваем courier-authlib. Данную библиотеку courier-imap использует для аутентификации пользователей.

    # cd /usr/ports/security/courier-authlib/
    # make config 
    

    # make install clean 
    


    Делаем автоматический запуск authdaemond при старте системы

    # echo 'courier_authdaemond_enable="YES"' >> /etc/rc.conf 
    


    Настраиваем courier-authlib. Для этого редактируем два конфигурационных файла: /usr/local/etc/authlib/authdaemonrc и /usr/local/etc/authlib/authmysqlrc

    # cat /usr/local/etc/authlib/authdaemonrc | grep -v ^# | grep -v ^
    authmodulelist="authmysql"
    authmodulelistorig="authmysql"
    daemons=5
    authdaemonvar=/var/run/authdaemond
    subsystem=mail
    DEBUG_LOGIN=2
    DEFAULTOPTIONS="wbnodsn=1"
    LOGGEROPTS="" 
    
    # cat /usr/local/etc/authlib/authmysqlrc | grep -v ^# | grep -v ^
    MYSQL_USERNAME          postfix
    MYSQL_PASSWORD          postfix
    MYSQL_SOCKET            /tmp/mysql.sock
    MYSQL_OPT               0
    MYSQL_DATABASE          postfix
    MYSQL_CHARACTER_SET     utf8
    MYSQL_USER_TABLE        mailbox
    MYSQL_CLEAR_PWFIELD     password
    MYSQL_UID_FIELD         '1981'
    MYSQL_GID_FIELD         '1981'
    MYSQL_LOGIN_FIELD       username
    MYSQL_HOME_FIELD        '/var/spool/mail'
    MYSQL_NAME_FIELD        name
    MYSQL_MAILDIR_FIELD     maildir
    MYSQL_QUOTA_FIELD       quota
    MYSQL_WHERE_CLAUSE      active='1' 
    

    MYSQL_UID_FIELD и MYSQL_GID_FIELD
    Обратите внимание на значения этих полей, здесь необходимо указывать uid и gid пользователя и группы virtual соответственно.

    Настройка authmysqlrc
    Если MySQL запускается на той же машине, что и courier-authlib вы можете использовать сокет, вместо указания порта и имени сервера. При этом не нужно инициализировать MYSQL_SERVER/MYSQL_PORT.


    Запускаем authdaemond

    # /usr/local/etc/rc.d/courier-authdaemond start
    Starting courier_authdaemond. 
    


    Если вы все правильно настроили, то в log-файле должно быть следующее

    # cat /var/log/maillog | grep authdaemond
    Sep  7 18:17:24 freebsd7 authdaemond: modules="authmysql", daemons=5
    Sep  7 18:17:24 freebsd7 authdaemond: Installing libauthmysql
    Sep  7 18:17:24 freebsd7 authdaemond: Installation complete: authmysql
    

    Courier-imap


    Устанавливаем и настраиваем courier-imap. Несмотря на название, courier-imap также поддерживает и pop3, хотя основной акцент делается на работу с imap. В качестве альтернативы очень рекомендую посмотреть в сторону dovecot.


    Dovecot это IMAP сервер, разработанный для Linux/UNIX подобных систем, написанный прежде всего с учетом безопасности. Несмотря на то, что он написан на C, он использует несколько техник программирования, которые позволяют избежать большинства общих ошибок. Dovecot может работать со стандартными форматами mbox и maildir, а также он полностью совместим с серверами UW-IMAP и Courier IMAP.

    # cd /usr/ports/mail/courier-imap/
    # make config 
    

     # make install clean 
    


    В зависимости от того, что вы хотите использовать pop3 или imap, редактируем соответствующие файлы. Лично я использую pop3, поэтому редактируем следующий файл /usr/local/etc/courier-imap/pop3d

    # cat /usr/local/etc/courier-imap/pop3d | grep -v ^# | grep -v ^
    PIDFILE=/var/run/pop3d.pid
    MAXDAEMONS=40
    MAXPERIP=4
    POP3AUTH="PLAIN LOGIN CRAM-MD5"
    POP3AUTH_ORIG="PLAIN LOGIN CRAM-MD5"
    POP3AUTH_TLS="PLAIN LOGIN CRAM-MD5"
    POP3AUTH_TLS_ORIG="PLAIN LOGIN CRAM-MD5"
    POP3_PROXY=0
    PORT=110
    ADDRESS=192.168.127.1
    TCPDOPTS="-nodnslookup -noidentlookup"
    LOGGEROPTS="-name=courier-imap"
    POP3DSTART=YES
    MAILDIRPATH=Maildir 
    
    # cat /usr/local/etc/courier-imap/imapd | grep -v ^# | grep -v ^
    ADDRESS=0
    PORT=143
    MAXDAEMONS=40
    MAXPERIP=4
    PIDFILE=/var/run/imapd.pid
    TCPDOPTS="-nodnslookup -noidentlookup"
    LOGGEROPTS="-name=imapd"
    IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE"
    IMAP_KEYWORDS=1
    IMAP_ACL=1
    IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 IDLE"
    IMAP_PROXY=0
    IMAP_PROXY_FOREIGN=0
    IMAP_IDLE_TIMEOUT=60
    IMAP_MAILBOX_SANITY_CHECK=1
    IMAP_CAPABILITY_TLS="$IMAP_CAPABILITY AUTH=PLAIN"
    IMAP_CAPABILITY_TLS_ORIG="$IMAP_CAPABILITY_ORIG AUTH=PLAIN"
    IMAP_DISABLETHREADSORT=0
    IMAP_CHECK_ALL_FOLDERS=0
    IMAP_OBSOLETE_CLIENT=0
    IMAP_UMASK=022
    IMAP_ULIMITD=65536
    IMAP_USELOCKS=1
    IMAP_SHAREDINDEXFILE=/usr/local/etc/courier-imap/shared/index
    IMAP_ENHANCEDIDLE=0
    IMAP_TRASHFOLDERNAME=Trash
    IMAP_EMPTYTRASH=Trash:7
    IMAP_MOVE_EXPUNGE_TO_TRASH=0
    SENDMAIL=/usr/sbin/sendmail
    HEADERFROM=X-IMAP-Sender
    IMAPDSTART=YES
    MAILDIRPATH=Maildir
    

    Примечание !!!
    Для того чтобы пользователи могли просматривать почту из мира, то в поле ADDRESS необходимо указать 0. В этом случае courier-imap будет слушать на всех активных интерфейсах.

    Если вы хотите, чтобы пользователи могли просматривать почту только через веб интерфейс (imp), то в поле ADDRESS необходимо указать 127.0.0.1.

    Если у вас в системе много интерфейсов, а вам нужно привязать pop/imap сервер только к некоторым, то это можно сделать так:
    ADDRESS=0
    PORT=192.168.127.1.110,127.0.0.1.110

    Настраиваем автоматический запуск pop/imap сервера при старте системы

    # echo 'courier_imap_pop3d_enable="YES"' >> /etc/rc.conf 
    # echo 'courier_imap_imapd_enable="YES"' >> /etc/rc.conf
    

    Запускаем pop/imap сервер

    # /usr/local/etc/rc.d/courier-imap-pop3d start
    Starting courier_imap_pop3d. 
    
    # /usr/local/etc/rc.d/courier-imap-imapd start
    Starting courier_imap_imapd.
    


    Проверяем, запустился ли pop3/imap сервер

    # sockstat | grep 143
    root     couriertcp 84757 3  tcp4   *:143                 *:*
    
    # sockstat | grep 110
    root     couriertcp 84745 3  tcp4   *:110                 *:*
    

    Postfix

    Ну а теперь собираем сердце нашей системы - Postfix

    # cd /usr/ports/mail/postfix
    # make config 
    

    # make install clean
    # rehash 
    

    В конце установки на вопрос

    Would you like to activate Postfix in /etc/mail/mailer.conf [n]?
    

    Отвечаем y.


    Отключаем запуск sendmail при старте системы, иначе postfix и sendmail будут конфликтовать между собой. Для этого добавляем следующие строчки в rc.conf

    # cat /etc/rc.conf | grep sendmail
    sendmail_enable="NO"
    sendmail_submit_enable="NO"
    sendmail_outbound_enable="NO"
    sendmail_msp_queue_enable="NO" 
    


    Отключаем специфические для sendmail опции

    # touch /etc/periodic.conf
    # cat /etc/periodic.conf
    daily_clean_hoststat_enable="NO"
    daily_status_mail_rejects_enable="NO"
    daily_status_include_submit_mailq="NO"
    daily_submit_queuerun="NO" 
    

    Редактируем конфигурационный файл postfix, а именно main.cf

     
    #
    # /usr/local/etc/postfix/main.cf
    #
    
    # LOCAL PATHNAME INFORMATION
    #
    # Указываем месторасположения директории очереди postfix. Также данная
    # директория является корнем, когда postfix запускается в chroot окружении.
    queue_directory = /var/spool/postfix
    
    # Задает месторасположение всех postXXX команд (postmap, postconf, postdrop)
    command_directory = /usr/local/sbin
    
    # Задаем корень конфигурационных файлов, для более "быстрой навигации".
    # Например, теперь можно использовать $base/header_checks вместо
    # /usr/local/etc/postfix/header_checks. Мелочь, а приятно.
    base = /usr/local/etc/postfix
    
    # Задает месторасположение всех программ демонов postfix. Это программы,
    # перечисленные в файле master.cf. Владельцем этой директории должен быть root
    daemon_directory = /usr/local/libexec/postfix
    
    # QUEUE AND PROCESS OWNERSHIP
    #
    # Задает владельца очереди postfix, а также большинства демонов postfix.
    # В целях безопасности, необходимо использовать выделенную учетную запись.
    # Т.е. от данного пользователя не должны запускаться какие-либо процессы
    # в системе, а также он не должен являться владельцем каких-либо файлов.
    mail_owner = postfix
    
    # Права по умолчанию, использующиеся local delivery agent. Не указывайте
    # здесь привилегированного пользователя или владельца postfix.
    default_privs = nobody
    
    # INTERNET HOST AND DOMAIN NAMES
    #
    # Задает имя хоста в формате FQDN. По умолчанию, используется значение,
    # возвращаемой функцией gethostname().
    myhostname = mail.sys-adm.org.ua
    
    # Задает имя нашего домена. По умолчанию используется значение $myhostname
    # минус первый компонент.
    mydomain = sys-adm.org.ua
    
    # SENDING MAIL
    #
    # Данный параметр указывает имя домена, которое используется при отправлении
    # почты с этой машины. По умолчанию, используется имя локальной машины -
    # $myhostname. Для согласованности между адресами отправителя и получателя,
    # myorigin также указывает доменное имя, которое добавляется к адресу
    # получателя для которого не указана доменная часть.
    # myorigin = $myhostname (отправлять письма от: "alex@mail.sys-adm.org.ua")
    # myorigin = $mydomain (отправлять письма от: "alex@sys-adm.org.ua")
    myorigin = $mydomain
    
    # RECEIVING MAIL
    #
    # Указывает адреса сетевых интерфейсов, на которых будет принимать почту
    # наша почтовая система. По умолчанию используются все активные интерфейсы
    # на машине. При изменении этого праметра необходимо перезапустить postfix
    inet_interfaces = all
    
    # Данный параметр указывает список доменов, для которых почта будет доставляться
    # локально, а не пересылаться на другой хост. Не указывайте здесь виртуальные
    # домены, для этого есть специальный параметр virtual_mailbox_domains
    mydestination = $myhostname, localhost.$mydomain, localhost
    
    # REJECTING MAIL FOR UNKNOWN LOCAL USERS
    #
    # Таблица просмотра со всеми именами и адресами локальных получателей.
    local_recipient_maps = unix:passwd.byname $alias_maps
    
    # TRUST AND RELAY CONTROL
    #
    # Данный параметр задает список "доверенных" клиентов, которые обладают
    # некоторыми привилегиями. В частности доверенным SMTP клиентам дозволено
    # пересылать почту через postfix. Если вы не доверяете никому, то оставьте
    # только 127.0.0.0/8
    mynetworks = 127.0.0.0/8
    
    # ALIAS DATABASE
    #
    # Данный параметр указывает список алиасов, используемый local delivery agent
    # После внесения изменений в данный файл необходимо выполнить команду newaliases
    # или postalias /etc/mail/aliases
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    
    # SHOW SOFTWARE VERSION OR NOT
    #
    # Желательно сообщать как можно меньше информации о нашем почтовом сервере.
    # Согласно требованиям SMTP протокола вы должны указать $myhostname вначале текста
    smtpd_banner = $myhostname ESMTP
    
    # DEBUGGING CONTROL
    #
    # Задает уровень информативности, когда имя или адрес SMTP клиента
    # или сервера соответствует шаблону, заданному в параметре debug_peer_list.
    # Следует использовать только во время отладки.
    # debug_peer_list = 127.0.0.1, sys-adm.org.ua
    debug_peer_level = 2
    
    # RESTRICTIONS
    #
    # client, helo, sender, recipient, data, end-of-data
    #
    
    # Дополнительные ограничения доступа  smtp сервера в контексте
    # smtp запроса клиента
    smtpd_client_restrictions =  permit_mynetworks,
                                 permit_sasl_authenticated,
                                 check_client_access hash:$base/client_access,
                                 reject_unknown_client_hostname
    
    # Дополнительные ограничения, применяемые сервером Postfix
    # в контексте SMTP команды HELO
    smtpd_helo_restrictions =       check_helo_access hash:$base/hello_access,
                                    permit_mynetworks,
                                    permit_sasl_authenticated,
                                    reject_invalid_helo_hostname,
                                    reject_non_fqdn_helo_hostname,
                                    reject_unknown_helo_hostname
    
    # Дополнительные ограничения, применяемые сервером Postfix
    # в контексте команды MAIL FROM
    smtpd_sender_restrictions =     permit_mynetworks,
                                    check_sender_access hash:$base/sender_access,
                                    reject_authenticated_sender_login_mismatch,
                                    reject_unknown_sender_domain,
                                    reject_unlisted_sender,
                                    reject_unverified_sender
    
    # Дополнительные ограничения, применяемые сервером Postfix
    # в контексте команды RCPT TO
    smtpd_recipient_restrictions =  permit_mynetworks,
                                    permit_sasl_authenticated,
                                    reject_unauth_destination,
                                    check_recipient_access hash:$base/recipient_access,
                                    reject_unlisted_recipient,
                                    reject_unknown_recipient_domain,
                                    reject_non_fqdn_recipient,
                                    reject_unverified_recipient
    
    # Отклонять команду ETRN
    smtpd_etrn_restrictions = reject
    
    # Заставляем отклонять почту с неизвестным адресом отправителя.
    # Позволяет бороться с червями и некоторыми вирусами.
    smtpd_reject_unlisted_sender = yes
    
    # Отключает SMTP команду VRFY. В результате чего, невозможно определить
    # существование определенного ящика. Данная техника (применение команды
    # VRFY) используется спамерами для сбора имен почтовых ящиков.
    disable_vrfy_command = yes
    
    # Требуем чтобы адреса, передаваемые в SMTP командах MAIL FROM и RCPT TO
    # заключались в <>, а также не содержали стилей или фраз RFC 822.
    strict_rfc821_envelopes = yes
    
    # Скрываем отображение имени таблицы получателей в ответе "User unknown"
    # yes: User unknown in virtual mailbox table
    # no: User unknown
    show_user_unknown_table_name = no
    
    # Данный адрес будет использоваться при проверки существования адреса отправителя.
    address_verify_sender = <>
    
    # Числовой код ответа SMTP сервера Postfix в случае, когда адрес
    # получателя отвергнут ограничением reject_unverified_sender.
    unverified_sender_reject_code = 550
    
    # Требуем, чтобы удаленный SMTP клиент представлял себя
    # в начале SMTP сессии с помощью команды HELO или EHLO.
    smtpd_helo_required = yes
    
    # Всегда отправлять EHLO вначале SMTP сессии
    smtp_always_send_ehlo = yes
    
    # Максимальное количество ошибок, которое может сделать удаленный SMTP клиент.
    # При превышение данного числа Postfix разорвет соединение.
    smtpd_hard_error_limit = 8
    
    # Включаем поддержку sasl аутентификации
    smtpd_sasl_auth_enable = yes
    
    # Имя приложения, используемого для инициализации SASL сервера.
    # Данный параметр задает имя конфигурационного файла. Имя smtpd
    # будет соответсвовать конфигурационному файлу SASL - smtpd.conf.
    smtpd_sasl_application_name = smtpd
    
    # Включает функциональную совместимость с SMTP клиентами, которые
    # используют устаревшую версию команды AUTH (RFC 2554),
    # например, outlook express 4 и MicroSoft Exchange version 5.0.
    broken_sasl_auth_clients = yes
    
    # Отвергаем методы, позволяющие анонимную аутентификацию
    smtpd_sasl_security_options = noanonymous
    
    # Optional lookup table with the SASL login names
    # that own sender (MAIL FROM) addresses
    smtpd_sender_login_maps = mysql:$base/mysqlLookupMaps/sender.conf
    
    # Указываем, где postfix должен брать информацию о алиасах
    virtual_alias_maps = mysql:$base/mysqlLookupMaps/alias.conf
    
    # Указываем, где postfix должен брать информацию о доменах
    virtual_mailbox_domains = mysql:$base/mysqlLookupMaps/domain.conf
    
    # Указываем, где postfix должен брать информацию о почтовых ящиках
    virtual_mailbox_maps = mysql:$base/mysqlLookupMaps/mailbox.conf
    virtual_mailbox_base = /var/spool/mail
    
    # Настраиваем поддержку квот
    virtual_mailbox_limit_maps = mysql:$base/mysqlLookupMaps/quota.conf
    virtual_maildir_extended=yes
    virtual_mailbox_limit_override=yes
    virtual_create_maildirsize = yes
    virtual_overquota_bounce = yes
    virtual_maildir_limit_message="Sorry, the user's maildir has overdrawn
    his diskspace quota, please try again later"
    
    # Ограничиваем максимальный размер письма до 5 Мб
    message_size_limit = 5242880
    
    # 1981 - uid и gid пользователя и группы virtual соответственно
    virtual_gid_maps = static:1981
    virtual_uid_maps = static:1981
    virtual_minimum_uid = 1000 

    Указываем postfix, как производить аутентификацию пользователей. Для этого создаем файл smtpd.conf со следующим содержимым:

    # cat /usr/local/lib/sasl2/smtpd.conf
    pwcheck_method: auxprop
    mech_list: PLAIN LOGIN CRAM-MD5
    auxprop_plugin: sql
    sql_usessl: yes
    sql_engine: mysql
    sql_hostnames: localhost
    sql_user: postfix
    sql_passwd: postfix
    sql_database: postfix
    sql_select: select password from mailbox where username = '%u@%r'
    log_level: 3 
    

    Инициализируем базу данных псевдонимов

    # /usr/local/bin/newaliases 
    

    Создаем необходимые файлы

    # cd /usr/local/etc/postfix
    # touch hello_access sender_access
    # touch recipient_access client_access
    # postmap hello_access
    # postmap sender_access
    # postmap recipient_access
    # postmap client_access
    
    # mkdir /usr/local/etc/postfix/mysqlLookupMaps
    
    # cat /usr/local/etc/postfix/mysqlLookupMaps/alias.conf
    user = postfix
    password = postfix
    hosts = localhost
    dbname = postfix
    table = alias
    select_field = goto
    where_field = address
    
    # cat /usr/local/etc/postfix/mysqlLookupMaps/domain.conf
    user = postfix
    password = postfix
    hosts = localhost
    dbname = postfix
    table = domain
    select_field = domain
    where_field = domain
    additional_conditions = and active = '1' and backupmx = '0'
    
    # cat /usr/local/etc/postfix/mysqlLookupMaps/mailbox.conf
    user = postfix
    password = postfix
    hosts = localhost
    dbname = postfix
    table = mailbox
    select_field = maildir
    where_field = username
    additional_conditions = and active = '1'
    
    # cat /usr/local/etc/postfix/mysqlLookupMaps/quota.conf
    user = postfix
    password = postfix
    hosts = localhost
    dbname = postfix
    table = mailbox
    select_field = quota
    where_field = username
    additional_conditions = and active = '1'
    
    # cat /usr/local/etc/postfix/mysqlLookupMaps/sender.conf
    user = postfix
    password = postfix
    hosts = localhost
    dbname = postfix
    table = mailbox
    select_field = username
    where_field = username
    additional_conditions = and active = '1' 
    

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

    # chown -R root:postfix /usr/local/etc/postfix/mysqlLookupMaps/
    # chmod 440 /usr/local/etc/postfix/mysqlLookupMaps/*.conf
    # chmod 550 /usr/local/etc/postfix/mysqlLookupMaps/
    
    # pw group add virtual -g 1981
    # pw user add virtual -g virtual -s /sbin/nologin -u 1981
    
    # mkdir /var/spool/mail
    # chown virtual:virtual /
    Фото автора
    Артем Ведун
    ИТ-специалист, исследователь цифровой гармонии

    Более 15 лет работаю в сфере информационных технологий — от системного администрирования и DevOps до анализа сетевой безопасности. В какой-то момент понял, что цифровые процессы и числа — не только про технологии, но и про закономерности, которые управляют жизнью.

    Так начался мой путь в прикладную нумерологию и изучение того, как числа влияют на решения, инфраструктуру и даже ИТ-проекты.

    В статьях совмещаю строгую логику и символику чисел: от практических гайдов по Linux до разбора цифровых архетипов в бизнесе и киберпространстве.

    Верю, что в мире нет случайных чисел — даже в логах сервера.

    Последние Статьи

    Как выбрать частного SEO‑специалиста в Киеве: практическое руководство

    Как выбрать частного SEO‑специалиста в Киеве: практическое руководство

    В Киеве существует множество SEO‑услуг: крупные агентства, маленькие студии и частники, с разными подходами и ценами. Для бизнеса важно найти того специалиста, который пониманием задач, прозрачностью ..

    Что предлагает KupiFanove.bg? для соц.сетей (smm)

    Что предлагает KupiFanove.bg? для соц.сетей (smm)

    KupiFanove.bg специализируется на предоставлении услуг по увеличению числа подписчиков и лайков в следующих социальных сетях: Instagram: Покупка подписчиков для повышения авторитета и доверия к ваш..

    Почему вам нужен список SEO компаний в Варне?

    Почему вам нужен список SEO компаний в Варне?

    Сегодня Google обрабатывает более 40 000 поисковых запросов каждую секунду! С такими ошеломляющими цифрами выделиться среди жесткой конкуренции требует профессионального опыта от опытной SEO-команды. ..

    Время 02:02 на часах: ангельская нумерология

    Время 02:02 на часах: ангельская нумерология

    Когда вы в очередной раз случайно бросаете взгляд на часы, и там застыли 02:02, это может быть не просто цифра — это тонкий знак от невидимого мира. Такие зеркальные времена не приходят в жизнь без пр..

    Подписаться на рассылку