FreeBSD의 postfix+비둘기장+mysql

소개

오랫동안 메일 서버에 대해 공부하고 싶었지만 이제서야 접하게 되었고, 정확한 정보를 많이 찾을 수 없어서 최대한 자세하게 출판물을 쓰기로 했습니다. 이 간행물에서는 postfix, dovecot, mysql, postfixadmin뿐만 아니라 spamassassin, clamav-milter(메일 서버용 clamav의 특수 버전), postgrey 및 스팸을 스팸 폴더(dovecot)로 전송할 가능성에 대해서도 설명합니다. -비둘기 구멍).

훈련

우선 작업에 필요한 패키지를 설치해 보겠습니다. (postfix, dovecot 및 dovecot-pigeonhole은 포트에서 설치해야 하며 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

PHP가 Apache에서 작동하고 postfixadmin이 올바르게 작동하는 데 필요한 줄을 httpd.conf에 추가하는 것을 잊지 마십시오:

<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 스크립트(이 스크립트에서 생성하는 비밀번호는 alter user 명령을 사용하여 mysql에서 생성해야 함)를 실행하고 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를 다시 시작하고 /usr/local/www/apache24/data/postfixadmin-3.2 디렉터리에 template_c 디렉터리를 만들고 소유자 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 키를 누르면 스크립트에서 인증서 암호를 생성하라는 메시지가 표시되고 인증서 생성에 대한 표준 질문이 표시됩니다. .

다음으로, 개인 키(비밀번호 없음)와 서명되지 않은 공개 키 인증서를 생성해야 합니다(조직 단위 이름(예: 섹션) []은 위에서 생성된 인증서에 지정된 것과 달라야 합니다).

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 "configs"가 구성됩니다.

사용자 v메일

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

접미사, 비둘기장, 비둘기장-비둘기집

이전에 작성한 것처럼 포트에서 애플리케이션 데이터를 수집하고 명령을 실행하여 포트를 다운로드하고 압축을 풉니다.

portsnap fetch extract

포트의 압축을 푼 후 dovecot 디렉터리로 이동하여 포트를 구성하고(mysql 지원을 확인해야 함) 빌드를 실행합니다(BATCH=yes는 설치 중에 make에게 질문하지 않도록 지시합니다).

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

postfix 및 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을 실행하기 전에 "configs"를 복사하십시오.

 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";
}

"구성"

이 섹션에서는 주석이 포함된 "configs"의 예를 제공할 것입니다. spamassassin의 "config"만 의심됩니다. 네트워크에서 올바른 설명을 찾지 못했기 때문입니다(기본적으로 "config"를 그대로 두었습니다). 추가하세요. spamassassin을 구성하는 가장 좋은 방법에 대한 의견입니다.

후위

첫 번째 단계는 데이터베이스에서 사용자, 도메인, 할당량을 가져오는 파일을 만드는 것입니다. 다음 파일과 필요한 파일을 저장할 디렉터리를 만듭니다.

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

해당 파일의 내용은 다음과 같습니다.
릴레이_도메인.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.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
}

인증-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 "config"는 다음과 같지만 구성 데이터가 충분하지 않다는 메시지가 표시됩니다. "config" 데이터에 대한 도움을 주십시오.

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

추가

이 섹션에서는 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) "MyOffice Mail"을 사용할 수 있습니다. 이 애플리케이션에는 메일 서버에 대한 연결을 설정하기 위한 많은 매개변수가 있습니다.

spaassasin을 테스트하려면 GTUBE 서명을 사용하고 문자에 다음 줄을 추가하세요.

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

모든 것이 정확하면 해당 편지는 스팸으로 표시되고 그에 따라 스팸 폴더로 이동됩니다.

바이러스 백신을 테스트하려면 텍스트 파일과 함께 편지를 보내야 합니다. 이 파일에는 EICAR 시퀀스가 ​​포함됩니다.

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

편지는 당연히 외부 사서함에서 보내야 합니다.
실시간으로 로그를 보려면 다음을 실행하세요.

tail -f /var/log/maillog

또한 외부 사서함(예: yandex.ru, mail.ru, gmail.com 등)으로 메일 전송을 올바르게 테스트하려면 역방향 DNS 영역(PTR 레코드)을 등록해야 합니다. 귀하의 공급자(물론 자체 DNS 서버가 없는 경우).

출력

물론 메일 서버는 다소 복잡한 것처럼 보일 수도 있지만 살펴보면 전혀 사실이 아닙니다. 구성에 약간의 시간을 투자하면 다음과 같이 상당히 기능적인 메일 서버를 얻을 수 있습니다. 스팸 및 바이러스로부터 보호합니다.

PS 주석을 "복사하여 붙여넣기"하려면 러시아어 클래스 로그에 루트 사용자(및 필요한 사용자)를 추가해야 합니다.

pw usermod root -L russian

이 단계를 수행하면 러시아어 문자가 올바르게 표시됩니다.

출처 : habr.com

코멘트를 추가