postfix+dovecot+mysql в FreeBSD

    Введение


    Почтовый сервер хотел изучить уже давно, но руки дошли только сейчас, да и информации корректной не особо много удавалось найти, поэтому решил написать как можно более подробную публикацию. В данной публикации пойдёт речь не только о postfix, dovecot, mysql, postfixadmin, а также и о spamassassin, clamav-milter(специальная версия clamav для почтовых серверов), postgrey, а также о возможности переноса спама в папку «Спам»(dovecot-pigeonhole).

    Подготовка


    Первым делом установим пакеты которые понадобятся для работы (postfix, dovecot и dovecot-pigeonhole необходимо установить из портов, dovecot-sieve можно в принципе установить из пакетов, но в портах версии бывают более новые и по этой причине может быть не совместимость dovecot с dovecot-sieve). Установим следующие пакеты:

    pkg install apache24 php73 mod_php73 php73-extensions php73-mysqli php73-mbstring php73-openssl clamav-milter postgrey spamassassin mysql57-server openssl wget
    

    После установки поместим необходимые службы в автозапуск:

    #postfix и dovecot также добавим, чтобы не возвращаться к этому позже
    sysrc postfix_enable="YES"
    sysrc dovecot_enable="YES"
    
    sysrc mysql_enable="YES"
    sysrc apache24_enable="YES"
    
    sysrc spamd_flags="-u spamd -H /var/spool/spamd"
    sysrc spamd_enable="YES"
    
    sysrc postgrey_enable="YES"
    
    sysrc clamav_clamd_enable="YES"
    sysrc clamav_milter_enable="YES"
    sysrc clamav_freshclam_enable="YES"
    #freshclam будем использовать как службу и проверять обновления 12 раз
    sysrc clamav_freshclam_flags="--daemon --checks=12"
    

    Запустим службы:

    service apache24 start
    service mysql-server start
    #Перед запуском spamassassin необходимо обновить базы и скомпилировать правила
    sa-update
    sa-compile
    service sa-spamd start
    #Выполните обновления баз clamav перед запуском
    freshclam
    service clamav-clamd start
    service clamav-freshclam start
    service clamav-milter start
    #Перед запуском postgrey необходимо отредактировать скрип инициализации(/usr/local/etc/rc.d/postgrey), для того чтобы отправители переносились в "белый" список после 4-х попыток отправки писем, необходимо найти строку : ${postgrey_flags:=--inet=10023} и привести её к виду:
    : ${postgrey_flags:=--inet=10023 --auto-whitelist-clients=4}
    service postgrey start
    

    Не забываем добавить в httpd.conf строки необходимые для работы php в apache и корректной работы postfixadmin:

    <FilesMatch "\.php$">
        SetHandler application/x-httpd-php
    </FilesMatch>
    <FilesMatch "\.phps$">
        SetHandler application/x-httpd-php-source
    </FilesMatch>
    
    <IfModule dir_module>
        DirectoryIndex index.php
    </IfModule>
    
    #А также необходимо изменить домашний каталог для корректной работы postfixadmin
    
    DocumentRoot "/usr/local/www/apache24/data/postfixadmin-3.2/public"
    

    Далее необходимо перейти в каталог и скачать postfixadmin

    cd /usr/local/www/apache24/data
    

    Скачаем postfixadmin (на момент написания актуальная версия была 3.2)

    wget --no-check-certificate https://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-3.2/postfixadmin-3.2.tar.gz
    

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

    gzip -d postfixadmin-3.2.tar.gz
    tar -xvf postfixadmin-3.2.tar
    chown -R www:www /usr/local/www/apache24/data
    service apache24 restart
    

    Далее подготовим базу данных для postfixadmin, выполните скрипт mysql-secure-installation(тот пароль который Вы создадите в данном скрипте, необходимо будет создать и в mysql командой alter user), для первичной настройки mysql, далее войдите в mysql, создайте базу данных и права для неё:

    mysql -p -r
    alter user 'root'@'localhost' identified by 'password123';
    create database postfix;
    grant all privileges on postfix.* to 'postfix'@'localhost' identified by 'password123';
    exit
    

    После того как база данных настроена необходимо отредактировать файл config.inc.php, в данном примере этот файл находится в каталоге /usr/local/www/apache24/data/postfixadmin-3.2/, в данном файле необходимо отредактировать несколько строк и привести их к виду, после того как измените данные настройки, перезагрузите apache, также необходимо создать каталог templates_c в каталоге /usr/local/www/apache24/data/postfixadmin-3.2 и назначить на него владельца www:

    mkdir /usr/local/www/apache24/data/postfixadmin-3.2/templates_c
    chown -R www:www /usr/local/www/apache24/data/postfixadmin-3.2/templates_c
    
    $CONF['configured'] = true
    #данный хэш необходимо сгенерировать в вэб интерфейсе postfixadmin и добавить в данную строку.
    $CONF['setup_password'] = 'dd28fb2139a3bca426f02f60e6877fd5:13d2703c477b0ab85858e3ac5e076a0a7a477315';
    $CONF['default_language'] = 'ru'
    $CONF['database_type'] = 'mysqli';
    $CONF['database_host'] = 'localhost';
    $CONF['database_user'] = 'postfix';
    #Пароль и имя баз данных использую которые создал в данном примере
    $CONF['database_password'] = 'password123';
    $CONF['database_name'] = 'postfix';
    
    service apache24 restart
    

    SSL


    Для генерации ключа будем использовать способ который предложен на сайте postfix.org, с созданием собственного центра сертификации, необходимо перейти в каталог /etc/ssl и выполнить скрипт:

    cd /etc/ssl
    /usr/local/openssl/misc/CA.pl -newca
    

    Во время выполнения скрипта будет запрошено имя для сертификата, не чего не вводите, нажмите Enter, далее скрипт запросит создать пароль для сертификата, далее будут стандартные вопросы для создания сертификата.

    Далее необходимо создать секретный ключ(без пароля) и не подписанный сертификат открытого ключа(Organizational Unit Name (eg, section) [] должен отличаться от того, что указан в сертификате созданном выше):

    openssl req -new -newkey rsa:4096 -nodes -keyout foo-key.pem -out foo-req.pem
    

    Подпишем сертификат открытого ключа(количество дней укажите столько, сколько вам необходимо):

    openssl ca -out foo-cert.pem -days 365 -infiles foo-req.pem
    

    Созданные сертификаты оставьте в данном каталоге, или перенесите их в тот каталог который Вам более удобен, «конфиги» postfix и dovecote будут настроены с учётом того, что сертификаты будут находиться в данном каталоге.

    Пользователь vmail


    Перед тем как приступить к установке postfix, dovecot и dovecot-pigeonhole, создадим пользователя и группу(группа создаться автоматически) vmail, а также каталог в котором будет располагаться почта.

    pw useradd -n vmail -s /usr/sbin/nologin -u 1000 -d /var/vmail
    

    Создадим каталог для почты и назначим владельцем пользователя vmail:

    mkdir /var/vmail
    chown -R vmail:vmail /var/vmail
    chmod -R 744 /var/vmail
    

    Postfix, dovecot, dovecot-pigeonhole


    Как я писал ранее сборку данных приложений произведём из портов, выполните команду для скачивания и распаковки портов:

    portsnap fetch extract
    

    После распаковки портов перейдите в каталог dovecot, выполните настройку порта (необходимо отметить поддержку mysql) и запустите сборку(BATCH=yes укажет make не задавать вопросы при установке):

    cd /usr/ports/mail/dovecot
    make config
    make BATCH=yes install clean
    

    Те же действия проделать с postfix и dovecot-pigeonhole

    dovecot-pigeonhole:

    cd /usr/ports/mail/dovecot-pigeonhole
    make BATCH=yes install clean
    

    postfix: также отметьте в настройке порта поддержку mysql

    cd  /usr/ports/mail/postfix-sasl
    make config
    make BATCH=yes install clean
    

    Перед запуском dovecot скопируйте «конфиги»:

     cp -R /usr/local/etc/dovecot/example-config/*  /usr/local/etc/dovecot
    

    После установки postfix и dovecot запустите службы:

    service postfix start
    service dovecot start
    

    Также необходимо создать каталог в котором будет компилироваться модуль для пересылки спама в папку спам, в моём случаи данный каталог находиться в папке /usr/local/etc/dovecot/conf.d, имя каталога def, создадим данный каталог и файл с кодом для компиляции и установим владельцем данного каталога пользователя vmail:

    mkdir /usr/local/etc/dovecot/conf.d/def
    touch /usr/local/etc/dovecot/conf.d/def/default.sieve
    chown -R vmail:vmail /usr/local/etc/dovecot/conf.d/def
    chmod -R 744 /usr/local/etc/dovecot/conf.d/def
    

    В данный файл поместите строки:

    require "fileinto";
    if header :contains "X-Spam-Flag" "YES" {
        fileinto "Junk";
    }
    

    «Конфиги»


    В данном разделе приведу примеры «конфигов» с комментариями в них, сомневаюсь только в «конфиге» spamassassin, так как корректных описаний в сети не нашёл(оставил «конфиг» по умолчанию), просьба дополнить в комментариях как лучше настроить spamassassin.

    Postfix


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

    mkdir /usr/local/etc/postfix/mysql
    touch /usr/local/etc/postfix/mysql/relay_domains.cf
    touch /usr/local/etc/postfix/mysql/virtual_alias_maps.cf
    touch /usr/local/etc/postfix/mysql/virtual_alias_domain_maps.cf
    touch /usr/local/etc/postfix/mysql/virtual_mailbox_maps.cf
    

    Содержимое данных файлов будет таким:
    relay_domains.cf

    hosts = 127.0.0.1
    user = postfix
    password = password123
    dbname = postfix
    query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'
    

    virtual_alias_maps.cf

    hosts = 127.0.0.1
    user = postfix
    password = password123
    dbname = postfix
    query = SELECT goto FROM alias WHERE address='%s' AND active ='1'
    

    virtual_alias_domain_maps.cf

    hosts = 127.0.0.1
    user = postfix
    password = password123
    dbname = postfix
    query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = '1'
    

    virtual_mailbox_maps.cf

    hosts = 127.0.0.1
    user = postfix
    password = password123
    dbname = postfix
    query = SELECT maildir FROM mailbox WHERE username='%s' AND  active = '1'
    

    master.cf

    #Указать postfix о том, что необходимо использовать dovecot для доставки почты
    dovecot unix - n n - - pipe
        flags=DRhu user=vmail:vmail argv=/usr/local/libexec/dovecot/deliver -f ${sender} -d ${recipient}
    
    #Укажем службе smtpd о возможности авторизоваться через sasl, а также о том, что spamassassin будет фильтровать почту
    smtp      inet  n       -       n       -       -       smtpd
      -o content_filter=spamassassin
      -o smtpd_sasl_auth_enable=yes
    
    #Использовать порт 587 и возможность авторизации через sasl
    submission inet n       -       n       -       -       smtpd
     -o smtpd_sasl_auth_enable=yes
    
    #Указать службе smtp использовать авторизацию через SASL
    smtps     inet  n       -       n       -       -       smtpd
      -o smtpd_sasl_auth_enable=yes
      -o smtpd_tls_wrappermode=yes
    
    #Использовать Spamassassin
    spamassassin   unix  -       n       n       -       -       pipe
       flags=DROhu user=vmail:vmail argv=/usr/local/bin/spamc -f -e
       /usr/local/libexec/dovecot/deliver -f ${sender} -d ${user}@${nexthop}
    
    #628       inet  n       -       n       -       -       qmqpd
    pickup    unix  n       -       n       60      1       pickup
    cleanup   unix  n       -       n       -       0       cleanup
    qmgr      unix  n       -       n       300     1       qmgr
    #qmgr     unix  n       -       n       300     1       oqmgr
    tlsmgr    unix  -       -       n       1000?   1       tlsmgr
    rewrite   unix  -       -       n       -       -       trivial-rewrite
    bounce    unix  -       -       n       -       0       bounce
    defer     unix  -       -       n       -       0       bounce
    trace     unix  -       -       n       -       0       bounce
    verify    unix  -       -       n       -       1       verify
    flush     unix  n       -       n       1000?   0       flush
    proxymap  unix  -       -       n       -       -       proxymap
    proxywrite unix -       -       n       -       1       proxymap
    smtp      unix  -       -       n       -       -       smtp
    relay     unix  -       -       n       -       -       smtp
            -o syslog_name=postfix/$service_name
    #       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
    showq     unix  n       -       n       -       -       showq
    error     unix  -       -       n       -       -       error
    retry     unix  -       -       n       -       -       error
    discard   unix  -       -       n       -       -       discard
    local     unix  -       n       n       -       -       local
    virtual   unix  -       n       n       -       -       virtual
    lmtp      unix  -       -       n       -       -       lmtp
    anvil     unix  -       -       n       -       1       anvil
    scache    unix  -       -       n       -       1       scache
    postlog   unix-dgram n  -       n       -       1       postlogd
    

    main.cf

    #Если не указать в данном параметре значение dovecot, то почта будет поступать локальным пользователям
    local_transport = dovecot
    
    #Не чувствительный к регистру список ключевых слов, которые SMTP-сервер не будет отправлять в ответе EHLO удалённому SMTP клиенту
    smtpd_discard_ehlo_keywords = CONNECT GET POST
    
    #Подождать пока придёт вся информация о клиенте и только потом применить ограничения
    smtpd_delay_reject = yes
    
    #Требовать начинать сессию с приветствия
    smtpd_helo_required = yes
    
    #Запретить узнавать существует определённый почтовый ящик, или нет
    disable_vrfy_command = yes
    
    #Этот параметр необходим для работы устаревших клиентов
    broken_sasl_auth_clients = yes
    
    #Запретить анонимную авторизацию
    smtpd_sasl_security_options = noanonymous noactive nodictionary
    smtp_sasl_security_options = noanonymous noactive nodictionary
    
    #Использовать dovecot для авторизации(по умолчанию cyrus)
    smtpd_sasl_type = dovecot
    smtp_sasl_type = dovecot
    
    #путь до плагина аутентификации
    smtpd_sasl_path = private/auth
    
    #Список существующих пользователей
    local_recipient_maps = $virtual_mailbox_maps $virtual_alias_maps
    
    #Если пользователя не существует, тогда отклонить почту
    smtpd_reject_unlisted_recipient = yes
    
    #Лимиты размера писем
    message_size_limit = 10485760
    
    #Каждый получатель получит индивидуальную обработку spamassassin
    spamassassin_destination_recipient_limit = 1
    
    #Антивирус
    milter_default_action = accept
    milter_protocol = 2
    #Путь до сокета clamav
    smtpd_milters = unix:/var/run/clamav/clmilter.sock
    non_smtpd_milters = unix:/var/run/clamav/clmilter.sock
    
    
    #MYSQL
    relay_domains = mysql:/usr/local/etc/postfix/mysql/relay_domains.cf
    virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql/virtual_alias_maps.cf, mysql:/usr/local/etc/postfix/mysql/virtual_alias_domain_maps.cf
    virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql/virtual_mailbox_maps.cf
    
    #Проверка HELO
    smtpd_helo_restrictions = permit_sasl_authenticated, reject_non_fqdn_helo_hostname, reject_invalid_hostname
    
    #Ограничения для содержимого писем
    smtpd_data_restrictions = permit_sasl_authenticated reject_unauth_pipelining, reject_multi_recipient_bounce
    
    #Правила отправки почты
    smtpd_sender_restrictions = permit_sasl_authenticated reject_sender_login_mismatch,reject_unauthenticated_sender_login_mismatch, reject_non_fqdn_sender, reject_unknown_sender_domain
    
    #Правила приёма почты(check_policy_service inet:127.0.0.1:10023 параметр postgrey - запрещает приём почты с первого раза)
    smtpd_recipient_restrictions = permit_sasl_authenticated reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_multi_recipient_bounce, reject_unknown_client_hostname, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023
    
    
    #Папка для почты
    virtual_mailbox_base = /var/vmail
    
    #uid и gid vmail
    virtual_minimum_uid = 1000
    virtual_uid_maps = static:1000
    virtual_gid_maps = static:1000
    
    #Указать виртуальный транспорт
    virtual_transport = devecot
    dovecot_destination_recipient_limit = 1
    
    
    #Настройки шифрования
    smtp_use_tls=yes
    smtp_tls_note_starttls_offer=yes
    #строка smtp_tls_security_level=encrypt отвечает за отправку почту только через ssl, если сервер не поддерживает приём почты через ssl, тогда необходимо поставить smtp_tls_security_level=may(если сервер не поддерживает ssl, то отправить в открытом виде)
    smtp_tls_security_level=encrypt
    smtp_tls_session_cache_database=btree:$data_directory/smtp_tls_session_cache
    smtp_tls_CAfile=/etc/ssl/demoCA/cacert.pem
    smtp_tls_key_file=/etc/ssl/foo-key.pem
    smtp_tls_cert_file=/etc/ssl/foo-cert.pem
    smtp_tls_session_cache_timeout=3600s
    smtp_tls_protocols=!TLSv1.2
    smtp_tls_loglevel=1
    
    #строка smtpd_tls_security_level=encrypt отвечает за отправку почту только через ssl, если сервер не поддерживает приём почты через ssl, тогда необходимо поставить smtpd_tls_security_level=may(если сервер не поддерживает ssl, то отправить в открытом виде)
    smtpd_tls_security_level=encrypt
    smtpd_use_tls=yes
    smtpd_tls_auth_only=yes
    smtpd_tls_loglevel=1
    smtpd_tls_received_header=yes
    smtpd_tls_session_cache_timeout=3600s
    smtpd_tls_session_cache_database=btree:$data_directory/smtpd_tls_session_cache
    smtpd_tls_key_file=/etc/ssl/foo-key.pem
    smtpd_tls_cert_file=/etc/ssl/foo-cert.pem
    smtpd_tls_CAfile= /etc/ssl/demoCA/cacert.pem
    smtpd_tls_protocols=!TLSv1.2
    
    #Путь до устройства генератора случайных чисел
    tls_random_source=dev:/dev/urandom
    
    #Обратная совместимость
    compatibility_level = 2
    
    #Сообщить клиенту о том, что почта не отклонена, а необходимо отправит ее ещё раз, но немного позже
    soft_bounce = no
    
    #Системная учётная запись UNIX из по которой запускается и работает postfix
    mail_owner = postfix
    
    #Имя хоста на котором развёрнут postfix(в данном примере имя домена и имя хоста совпадают)
    myhostname = $mydomain
    
    #В данном параметре необходимо указать имя домена
    mydomain = virusslayer.su
    myorigin = $myhostname
    
    #Какие интерфейсы необходимо использовать
    inet_interfaces = all
    
    #Список доменов на которые будет осуществляться доставка почты
    mydestination = $mydomain, localhost, localhost.$mydomain
    
    #Отправляет код ответа 550 отправителю который пытается отправить письмо не существующему пользователю
    unknown_local_recipient_reject_code = 550
    
    #пересылать почту только от localhost
    mynetworks_style = host
    
    #В данном параметре не нужно не чего указывать, так-как подсети указанные в данном параметре будут считаться привилегированными
    mynetworks =
    
    #Версия протокола ip
    inet_protocols = ipv4
    
    #Алиасы локальных пользователей(если конечно это необходимо)
    alias_maps = hash:/etc/mail/aliases
    alias_database = dbm:/etc/mail/aliases.db
    
    #Данным сообщением сервер будет представляться при отправке и получении почты
    smtpd_banner = $myhostname ESMTP $mail_name
    
    #Указать на сколько подробным должен быть отчёт
    debug_peer_level = 2
    
    #Указать между какими доменами отслкживать пересылку (для записи в лог, можно указать например yandex.ru gmail.ru mail.ru и т.д.)
    debug_peer_list = 127.0.0.1
    
    #Путь до отладчика
    debugger_command =
             PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
             ddd $daemon_directory/$process_name $process_id & sleep 5
    
    #Совместимость с sendmail
    sendmail_path = /usr/local/sbin/sendmail
    mailq_path = /usr/local/bin/mailq
    
    
    setgid_group = maildrop
    
    #Пути до различных каталогов
    html_directory = /usr/local/share/doc/postfix
    manpage_directory = /usr/local/man
    sample_directory = /usr/local/etc/postfix
    readme_directory = /usr/local/share/doc/postfix
    meta_directory = /usr/local/libexec/postfix
    shlib_directory = /usr/local/lib/postfix
    queue_directory = /var/spool/postfix
    command_directory = /usr/local/sbin
    daemon_directory = /usr/local/libexec/postfix
    data_directory = /var/db/postfix
    

    Dovecot


    dovecot.conf

    #Протоколы с которыми будет работать dovecot
    protocols = imap pop3
    
    #Какие адреса необходимо слушать
    listen = *, ::
    
    #Путь до файла с параметрами извлечения квот из mysql
    dict {
        quota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql.conf.ext
    }
    
    #Извлечь необходимые конфиги
    !include conf.d/*.conf
    !include_try local.conf
    

    dovecot-dict-sql.conf.ext

    connect = host=127.0.0.1 dbname=postfix user=postfix password=password123
    
    map {
      pattern = priv/quota/storage
      table = quota2
      username_field = username
      value_field = bytes
    }
    map {
      pattern = priv/quota/messages
      table = quota2
      username_field = username
      value_field = messages
    }
    

    dovecot-sql.conf.ext

    #Параметры подключения к базе MYSQL
    driver = mysql
    connect = host=127.0.0.1 dbname=postfix user=postfix password=password123
    
    #Какая схема используется для паролей
    default_pass_scheme = MD5
    
    #Запросы для пользователей, паролей и квот
    user_query = SELECT '/var/mail/%d/%n/' AS  home, 'maildir:/var/vmail/%d/%n' AS mail, 1000 AS uid, 1000 AS gid, concat('*:bytes=',quota) as quota_rule FROM mailbox \
        WHERE username ='%u' AND active = '1'
    
    password_query = SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, 'maildir:/var/vmail/%d/%n' as userdb_mail, 1000 as userdb_uid, \
     1000 as userdb_gid, concat('*:bytes=',quota) AS userdb_quota_rule FROM mailbox WHERE username ='%u' AND active ='1'
    

    10-auth.conf

    #Запретить авторизацию без SSL
    disable_plaintext_auth = yes
    
    #Имя Вашего домена
    auth_realms = virusslayer.su
    auth_default_realm = virusslayer.su
    
    #Использовать авторизацию в открытом виде(обычным текстом, но в данном случаи все будете передаваться через ssl)
    auth_mechanisms = plain login
    
    #Необходимо закомментировать все строки, кроме !include auth-sql.conf.ext, так как пользователи будут виртуальные из базы mysql
    #!include auth-deny.conf.ext
    #!include auth-master.conf.ext
    
    #!include auth-system.conf.ext
    !include auth-sql.conf.ext
    #!include auth-ldap.conf.ext
    #!include auth-passwdfile.conf.ext
    #!include auth-checkpassword.conf.ext
    #!include auth-vpopmail.conf.ext
    #!include auth-static.conf.ext
    

    10-mail.conf

    #Путь до почтовых ящиков
    mail_location = maildir:/var/vmail/%d/%n
    
    #Возможен только один ящик для приёма писем
    namespace inbox {
      inbox = yes
    }
    
    #uid и gid vmail
    mail_uid = 1000
    mail_gid = 1000
    
    #Список плагинов, в данном случаи quota
    mail_plugins = quota
    

    10-master.conf

    #Описание номеров портов и использование ssl
    service imap-login {
      inet_listener imap {
        port = 143
      }
      inet_listener imaps {
        port = 993
        ssl = yes
      }
    }
    
    service pop3-login {
      inet_listener pop3 {
        port = 110
      }
      inet_listener pop3s {
        port = 995
        ssl = yes
      }
    }
    
    service submission-login {
      inet_listener submission {
        port = 587
      }
    }
    
    #Пользователи и права для их доступа к базе пользователей и авторизации (возможно не корректно описал, но эти параметры я понял именно так)
    service auth {
      unix_listener auth-userdb {
        mode = 0600
        user = vmail
        group = vmail
      }
      # Postfix smtp-auth
      unix_listener /var/spool/postfix/private/auth {
        mode = 0666
        user = postfix
        group = postfix
      }
    }
    
    #Права пользователя vmail к квотам
    service dict {
      unix_listener dict {
        mode = 0660
        user =  vmail
        group = vmail
        }
      }
    

    10-ssl.conf

    #Использовать ssl принудительно (попытки использовать авторизацию без sll будут запрещены)
    ssl = required
    
    #Пути до сертификатов
    ssl_cert = </etc/ssl/foo-cert.pem
    ssl_key = </etc/ssl/foo-key.pem
    ssl_ca = </etc/ssl/demoCA/cacert.pem
    
    #Какой необходимо использовать протокол
    ssl_min_protocol = TLSv1.2
    

    15-lda.conf

    quota_full_tempfail = no
    lda_mailbox_autosubscribe = yes
    protocol lda {
     # В данной строке указан модуль sieve, который будет перенаправлять спам в папку спам
      mail_plugins = $mail_plugins sieve quota
    }
    

    90-plugin.conf

    #Необходимо указать каталог в котором будут правила для переноса спам писем в каталог "СПАМ", также необходимо данному каталогу выставить права chown -R vmail:vmail
    #В данном каталоге скомпилируется файл для переброса спама в каталог "СПАМ"
    plugin {
      #setting_name = value
      sieve = /usr/local/etc/dovecot/conf.d/def/default.sieve
    }
    

    auth-sql.conf.ext

    #Файлы с настройками доступа к базе MYSQL
    passdb {
      driver = sql
    
      # Path for SQL configuration file, see example-config/dovecot-sql.conf.ext
      args = /usr/local/etc/dovecot/dovecot-sql.conf.ext
    }
    
    userdb {
      driver = sql
      args = /usr/local/etc/dovecot/dovecot-sql.conf.ext
    }
    

    Spamassassin


    «Конфиг» spamassassin имеет такой вид, но что то мне подсказывает данных настрое не достаточно, просьба помочь с данных «конфигом»:

    local.cf

    rewrite_header Subject *****SPAM*****
    report_safe 0
    required_score 5.0
    use_bayes 1
    bayes_auto_learn 1
    ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
    endif # Mail::SpamAssassin::Plugin::Shortcircuit
    

    Также необходимо произвести обучение на письмах с спамом и без него:

    sa-learn --spam /path/spam/folder
    sa-learn --ham /path/ham/folder
    

    Дополнительно


    В данном разделе укажу настройки firewall на основе pf, добавим pf в автозапуск и укажем файл с правилами:

    sysrc pf_enable="YES"
    sysrc pf_rules="/etc/0.pf"
    

    Создадим файл с правилами:

    ee /etc/0.pf
    

    И добавим в него правила:

    #Данный параметр(не фильтровать интерфейс lo0) обязательно необходимо указывать первым, или он не сработает
    set skip on lo0
    
    #Настроим доступ к необходимым портам пользователям deovecot, postfix, root
    pass in quick proto { tcp, udp } from any to any port {53,25,465,587,110,143,993,995} user {dovecot,postfix,root} flags S/SA modulate state
    pass out quick proto { tcp, udp } from any to any port {53,25,465,587,110,143,993,995} user {dovecot,postfix,root}
    
    #разрешить любой исходящий трафик для пользователя root
    pass out quick proto {tcp,udp} from any to any user root
    
    #Разрешить заходить на вэб интерфейс
    pass in quick proto tcp from any to any port 80 flags S/SA modulate state
    
    #SSH
    pass in quick proto tcp from any to any port 22 flags S/SA modulate state
    
    #Разрешить доступ в сеть пользователям clamav и spamd 
    pass out quick proto {tcp,udp} from any to any user {clamav,spamd}
    
    #DNS и ICMP
    pass out quick proto {tcp,udp} from any to any port=53 keep state
    pass out quick proto icmp from any to any
    
    block from any to any fragment
    block from any to any
    block all
    

    Запустить pf можно командой:

    service pf start
    

    Тестирование


    Для тестирования всех возможных подключений(STARTTLS, SLL) можно использовать клиент для мобильных устройств(в моём случаи для ios) «МойОфис Почта», в данном приложении есть множество параметров для настройки подключений к почтовому серверу.

    Для тестирования spaassasin используем сигнатуру GTUBE, в письмо добавьте строку:

    XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
    

    Если всё корректно, то письмо будет помечено спамом и соответственно перемещено в папку спам.

    Для тестирования антивируса необходимо послать письмо с текстовым файлом, в данном файле будет последовательность EICAR:

    X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
    

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

    tail -f /var/log/maillog
    

    Также для корректного тестирования отправки почты на внешние почтовые ящики(например на yandex.ru, mail.ru, gmail.com и т.д.) необходимо прописать обратную зону DNS(PTR запись), проделать это можно путём обращения в Ваш провайдер(если у Вас конечно не собственный DNS сервер).

    Вывод


    Может конечно показаться, что почтовый сервер довольно сложная вещь, но если разобраться то это совсем не так, потратив немного времени на конфигурацию можно получить довольно функциональный почтовый сервер, с защитой от спама и вирусов.

    P.S. Если планируете «копипастить» с комментариями, то необходимо добавить пользователя root(и тем кому это необходимо) в логи класс russian:

    pw usermod root -L russian
    

    После этих действий русские символы будут корректно отображаться.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 48

      0
      У вас не хватает memcached в настройках для mysql (без него большие очереди будут жутко тормозить), также можно включить APC. Как раз на днях поднимал почтовый сервер для отправок 400к сообщений в сутки, скорость работы стала актуальной (64гб памяти, 8 ядер, ссд).
        0
        Ещё OpenDKIM надо бы прикрутить.
          0
          Позвольте немного критики после беглого прочтения.
          1. Spamassassin, clamav-milter, postgrey, а так же opendkim, opendmarc, policyd-spf и прочее сейчас успешно заменяются Rspamd (mail/rspamd). Интеграция с Postfix — 2 строчки в main.cf.
          2. В самоподписном сертификате нет смысла, когда доступен Let's Encrypt. Для FreeBSD есть отличный порт security/dehydrated.
          3. Для интеграции Postfix и Dovecot предпочтительней использовать LMTP вместо LDA. Как написано в документации: «because it's somewhat easier to configure (especially related to permissions) and gives better performance».
          4. У вас задействован submission одновременно и в Postfix (master.cf) и в Dovecot (10-master.conf), при этом submission на стороне Dovecot не настроен (20-submission.conf). Если решите оставить Dovecot, то не забудьте, что и Postfix и Dovecot поддерживают расширение XCLIENT — необходимо для корректной работы фильтров.
            0
            143, 110 порты прекрасно все работает, видимо Вы не в курсе про STARTTLS и почему я установил порт postfix-sasl.
              0
              Данный вопрос снят, изначально не заметил у вас ssl=required. А mail/postfix-sasl в вашей конфигурации не нужен, так как «Dovecot SASL is always built in».
            –3
            Почитал аж слёзу взмахнул, кто-то до сих пор еще почтовые серверы настраивает? есть же в гугле, яндексе и прочих привязка домена для почты, достаточно только днс записи настроить.
              +5

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

                +2

                Или просто гугл вдруг решает вас побанить. Прецеденты были.

                  0
                  И для этого даже не обязательно самим косячить, несколько жалоб и вуаля
                0

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

                  0
                  Из всех крупных компаний в которых был ранее трудоустроен только в билайне видел почту через ad, сейчас в ОТПБанк устроен, почта не через ad постоянно ввожу логин пароль(международная компания), так что такая схема очень распространена в крупных конторах. Можно поподробней про спам рассылки, я что то не доглядел, анонимная авторизация отключена, почту без авторизации не отправить!
                    –1

                    Боюсь представить организацию на 500-1000 пользователей где админ заводит все аккаунты ко всем службам для нового пользователя руками.

                      0
                      Надо же понимать, что филиалы в разных городах присутствуют(и не во всех них так много народу), в каждом городе есть админы, чаще всего не один и не каждый день на работу кто тот устраивается, учетные записи всегда необходимо заводить(в тот же AD). Создать пользователя в postfixadmin, назначить квоту и включить в группу рассылки занимает меньше минуты.
                        –1

                        А ещё завести а жире, конфе, Гите, Дженкинсе, и куче других мест. Вот и занятие для админа на пол дня. А ещё настроить настроить политики, и заставлять пользователя ротировать пароль.


                        Или можно настроить 1 раз фрееипу и заводить все учётки за пол минуты. Так что скорее дело только в лени и кривых руках.

                0

                Интересно, как все это сделать распределенным и отказоустойчивым.

                  –2

                  Ну для начала выкинуть фряху. Серьезно как будто на 10 лет назад вернулся пока читал статью.


                  Лсинх плюс коросинк с репликой, вот тебе и отказоустойчивость.


                  Распределенность уже другой вопрос, хотя возникает вопрос а зачем? Обычно для ненагруженной почты это не надо.


                  Если есть нужда повыделываться то в целом вообще никто не мешает запихать все в по родам, прикрутить цеф и запихать это кубер. Тут тебе и масштабируемость и отказоустойчивость.


                  С бд только вопросы будут. Но масштабируемость баз это отдельная от приложений тема.

                    0
                    Лсинх плюс коросинк с репликой, вот тебе и отказоустойчивость.

                    Я глупый программист, и не знаю, что это такое. По каким ключевым словам гуглить?


                    Распределенность уже другой вопрос, хотя возникает вопрос а зачем? Обычно для ненагруженной почты это не надо.

                    У меня есть несколько почти бесплатных коробок, аптайм каждой из которых довольно далёк от 99.99%, и прилегают они на день-два-три периодически. Хочется получать доступ, даже когда какие-то из коробок лежат.

                      –1

                      lsyncd — позволит синронизировать файлы между серверами.
                      mysql — поднимаем репликацию
                      pacemaker/corosync — позволяет сделать "плавающий" ip между серверами. что бы если один грохнится на другой пошли запросы.


                      Чуть подробнее
                      https://habr.com/ru/company/infobox/blog/252751/
                      https://habr.com/ru/post/56702/
                      https://habr.com/ru/post/107837/

                        +1
                        Все это можно реализовать встроенными средствами FreeBSD, настроить синхронизацию между двумя серверами занимает пару минут, а потом настроить правило перенаправления подключений клиентов, если основной сервер недоступен.
                          0
                          Поддерживаю.
                          Хотя у давкотовской репликации бывают небольшие закидоны. Но максимум что я наблюдал — иногда восстанавливаются только что удаленные письма.
                            –2

                            Можно сделать что угодно. Только фряха все равно не нужна.

                              0
                              На вкус и цвет…
                                –1

                                Просто надо идти в ногу со временем. А фряха пошла своим путем без поддержки современных тредов.


                                Когда увижу нормальную поддержку докера/кубера/цефа на фряхе, то признаю свою неправоту.


                                А так я ее в проде уже лет 5 как не встречал. И вакансий на нее нет кроме дремучего Легаси. Вопрос зачем ставить умерающую систему с маленьким комьюнити?

                                  +1
                                  Докер и кубернетс прям вот везде нужен?
                                  А для чего?
                                  Для быстрого развертывания, виртуализации итд?
                                  Во фряхе есть джейлы и bhyve.
                                  Для автоматизации cbsd и ansible.
                                  Если ктото не встречал — это не значит что ее нет.
                                    –1

                                    Есть, назовите 5-10 крупных it компаний в РФ кто бы эти технологии и фряху использовал.


                                    Можно и генту в прод вкорячить при желании. И самому ос написать и весь софт. Вопрос нахрена и кто это будет админить когда ты уволишься/помрешь?

                                      +1

                                      Как в РФ не знаю. В мире есть коммерческие продукты построенные на FreeBSD, которые активно продаются и развиваются. Из того с чем сталкивался сам: Dell EMC Isilon (Scale-out NAS сторадж, с масштабированием до 250 нод и сотен петабабайт в кластере с поддержкой NAS протоколов, Hadoop и т.д.), Dell Compelent SC (mid-range сторадж).
                                      Netapp в своих стораджах использует Freebsd, насколько просачивалась информация.
                                      Но вам возможно будут ближе Sony PlayStation последних поколений, а также Netflix, которые активно используют Freebsd в своих продуктах.
                                      Так что зря вы фряху хороните, только по той причине, что она вам чем-то не угодила.

                                        –1

                                        И какое отношение прошивка закрытыых железок имеют к серверным ос?


                                        Тут то все просто, на linux их не сделать. Gun Лицензия не позволит закрывать.


                                        Вы именно про инсталляции серверов под Фрей расскажите в крупных компаниях.

                                          0

                                          Вас опять куда-то не туда потянуло. Вы тут распинались про FreeBSD — мертва. Я вам постарался показать, что это не совсем так. В том числе потому что крупные международные корпорации выбирают ее в качестве базовой OS для своих коммерческих продуктов. А для того, что бы знать, что используется в крупных российских компаниях нужно быть внутри их IT подразделений как минимум, так как раскрывать свою внутреннюю инфраструктуру никто не спешит. Ну и как вариант, тот же Netflix для вас видимо не особо крупная компания и highload-а у них нет? А они в общем-то стримят на весь мир с FreeBSD, судя по информации из открытых источников (https://archive.fosdem.org/2019/schedule/event/netflix_freebsd/). И по факту получается, что через Freebsd генерируется порядка 15% общемирового трафика.


                                          Я к тому, что не стоит слишком радикально высказываться про продукт, который вам не достаточно хорошо известен. У всех свои ниши. Хотя у молодежи все обычно черно-белое и без полутонов :). Но с возрастом чаще проходит, чем не проходит.

                                            –1

                                            Она мертва как серверная ось.


                                            Жива как заготовка под вендорные продукты где нужно закрывать свои исходники. Потому что под эти продукты не годится ОС с GNU лицензией.


                                            Эти же вендоры не дадут её сдохнуть окончательно, и будут поддерживать труп вливанием бабла. Но и вырасти её в что то нормальное не дадут ибо им это нафиг не надо. Она им нужна просто как заготовка, а не как готовый продукт.


                                            Тот же нетфликс как серверную ось использует linux микросервисы в докере во всю, а не вами любимом джейл. Это открытая инфа, о которой они на всех конференциях рассказывают.


                                            Т.е. как я и сказал изначально "фряха неактуальна в 2019 кроме специфичных задач."


                                            При этом заметь те что вы пытаетесь доказать что фряха впереди планеты всей. На примере того что её используют как исходник для прошивки ps4. Офигенное достижение для ОС, которая лет 10-15 назад стояла на каждом втором сервере если не на большом числе серверов. Например раньше тот же Яндекс на неё успешно сидел. И свалил он с неё не просто так.


                                            И да виновата в том числе лицензия, когда ей может пользоваться кто хочет. А вот делится исходниками и наработками не обязан. Если gnu/linux развивается, то фряха стагнирует.

                                              0
                                              При этом заметь те что вы пытаетесь доказать что фряха впереди планеты всей.

                                              Это вы где прочитали? Или сами придумали?

                                                –1

                                                Ну так вы пытаетесь доказать что её надо зачем то в прод тащить. Вопрос зачем, если эта ось не является лучшей?


                                                При этом пытаетесь это доказать на примере того что её используют как прошивку для NAS, приставок и т.д. в очень кастомном виде.


                                                Какой то странный пример для аргументации "давайте использовать эту ось в проде" не находите?


                                                Кстати на многих промышленных железках и банкоматах используется windows 95 и windows XP. Это не говорит о том что 95 и XP винда хорошая, актуальная и современная ось, которую надо накатывать в прод.

                                                  0

                                                  Ок, то есть сами придумали. И продолжаете фантазировать на эту тему.


                                                  Я лишь писал, что у всех свои ниши. И FreeBSD в проде тоже есть, там где она оказалась уместнее других. И не более того. А утверждение, что "мертва" не имеет под собой достаточных оснований. Только и всего.

                                                    –1

                                                    Основание что она нигде не используется в проде как серверверная ось, при этом лет 15 назад использовалась везде, уже не принимается?


                                                    Яндекс linux
                                                    рамблер linux
                                                    баду linux
                                                    киви linux
                                                    хабр поднят на linux
                                                    джет брейнс linux
                                                    майл.ру linux
                                                    вконтакт linux
                                                    авито linux


                                                    Давайте такой же список на фряху, если она жива. А не рассказывайте про прошивки на её основе для приставок.

                                                      0

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


                                                      И если уж начать иронизировать, то судя по статье как минимум FreeBSD есть в продакшене у ее автора :). Это не плохо и не хорошо. Просто по каким-то причинам или стечению обстоятельств ему так удобнее.

                                                        –2

                                                        То что пару фриков использует какую то ось, не говорит что она жива.
                                                        Как и сказал можно и самому написать ось, но нафига?


                                                        Ещё раз дайте список из головы 5-10 компаний кто её использует. Я вот влегкую сказал кто linux юзает. Могу даже примерно вспомнить про некоторых кто из них юзает deb а кто centos.


                                                        А по поводу "что было на самом деле 15 лет назад."
                                                        Я к сожалению не настолько молод что бы не мог об этом сказать. И лично застал время когда было засилие фряхи. Скажу больше я ещё и участвовал и миграциях с неё на линух в разных компаниях, по тем или иным причинам. И постепенно избавлялся от серверов со фряхой.


                                                        Например в firstvds, Или могу рассказать про панель ispmager и vdsmanager от ispsystem которая была раньше заточена под фряху с jail и как они они перешли linux.


                                                        Но это уже скорее тема для беседы под пивко.

                                                          0
                                                          То что пару фриков использует какую то ось, не говорит что она жива.

                                                          Надеюсь вы это не про себя :).


                                                          Список есть в комментариях выше, но так как мы с вами похоже вошли в цикл, то желаю вам всего хорошего и поменьше впадать в крайности :).
                                                          За сим откланиваюсь из этого треда.

                                                            –1

                                                            Списка компаний там нет. Там есть пара продуктов где фряха используется как прошивка.


                                                            Ну и зачем было лезть в спор. Если вы не можете признать что не правы или аргументировать свое мнение?


                                                            При этом лично я против фряхи вообще ничего не имею. Мне в целом пофиг какая там ОС используется. Но меня бесит когда люди приходят и костылят какую то странную фигню, ради того что бы что то доказать. Вместо того что бы использовать нормальные общепринятые решения. Потому что потом при устройстве на работу с этой фигней приходится разбираться и обычно все переделывать.


                                                            И когда на хабре начинают говорить "давайте сделаем какой то велосипед, потому что мне нравится эта ось" то это бесит ещё больше.

                                    0
                                    ДОКЕР на FreeBSD? Вы шутите, на FreeBSD есть jail(причем также является частью системы)!
                                      –1

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


                                      Поэтому выбравшего этот путь ждёт судьба самурая одиночки. Когда нужно будет ходить по граблям и писать свои костыли и велосипеды, а не человека который может взять готовые решения из бест практика.

                                      0
                                      Просто надо идти в ногу со временем. А фряха пошла своим путем без поддержки современных тредов.

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


                                      Тогда как, говорят, во фрибсд до сих пор всё просто, понятно и тупо, как колесо (но это как раз хорошо).


                                      Но я говорю как программист и пользователь. Что там как в хайлоаде, вакансиях и тому подобном, понятия не имею.


                                      А свои домашние сервачки для себя лучше держать на том, к чему ты привык. Я гентушник, и у меня CI/жаббер/етц на генте.

                                        –1

                                        Ну для себя другой вопрос. А для работы важно сделать быстро и надежно, для этого нужно комьюнити и готовые решения. + Это должно быть более менее стандартно.


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

                                0
                                Плавающий ип в данном случае тоже не совсем подходит. Лучше haproxy настроить, гораздо функциональнее будет.
                                  –1

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


                                  Или с помощью dns или как то ещё. но суть в том что точку отказа в любом случае убирать нужно.

                                  0

                                  Спасибо за ссылки и ключевые слова. Как-нибудь уже надо собраться и сделать хотя бы как резервную почту.

                                0
                                Не согласен. фряха вполне хорошая система.
                                Реплицировать давкот сторонними инструментами, да еще и как простые файлы — так себе идея.
                                  –1

                                  100% рабочее решение и отлично работающее. Нет смысла городить что то сложное с релеями, хопрокси и и.д., когда можно сделать просто.


                                  А фряха неактуальна в 2019 кроме специфичных задач. И почтовик явно не такая задача.

                                    0
                                    «фряха неактуальна» — а мужики то не знают.
                                    Чем она не устраивает?
                                0
                                Ну как минимум haproxy и репликация в dovecot-е
                                К сожалению давкот реплицирует узлы только попарно.

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое