Почтовый сервер с хранением данных в PostgreSQL

в 19:35, , рубрики: Серверное администрирование

В статье с кучей копипасты рассматривается настройка сервера электронной почты, построенного на базе связки exim и dbmail с хранением данных в postgreSQL.

Введение

Вообще имеется работающий сервер на базе Postfix+dovecot+postgrey с красивой управлялкой на Postfixadmin. Пашет, справляется, хотя иногда письма то ли теряет, то ли выкидывает. Но постепенно на сервер по той или иной причине стали добавляться иные да разные приложения, к почте отношения имеющие более чем никакие. Они и не мешают, но и ни к месту тоже. Отчего решение поменять, исправить сложившееся положение дел зрело зело давно. Были мысли устроить Майдан и дело с концом, только их пришлось придать анафеме с последующим забвением.
Начались размышления и прикидывания различных вариантов с учётом специфики предстоящей работы сервера: он будет заслан совсем весь в демилитаризованную зону, при этом должен стойко переносить тяготы и лишения почтовой службы на просторах интернета. Как показали обзоры творящегося с помощью утилиты PSAD и сбора статистики с ASA5505 любопытных на посканировать порты и охочих до разных атак пруд пруди. Помимо этого требовалось гибкое и разнообразное управление почтовым трафиком: что-то отсеивать ещё до обработки, а какие почтовые сообщения припускать несмотря ни на что, и при необходимости управлять очередью. И конечно же всегда быть готовым к тому что либо ломанут, либо система откажет в самый интересный момент, как следствие возможность временного резервного развёртывания хотя бы на коленке должна быть заложена изначально.
Вариант с Postfix казался неплохим, особенно когда включены все reject-ы и параллельно запущен SPF. Ни спама, ни забот, ни хлопот. Только пользователи почему-то не разделяли эту радость. Загадочные люди… Им от некоторых важных организаций почему-то перестали приходить письма. Не знаю, мне всё приходило.
Dovecot — быстрый, гибкий и безопасный MDA. Казалось бы какого вам ещё надо? Вот только гложила каверзная идея попробовать хранить почту в базе данных, чтобы потом SQL-распросами проводить небольшое расследование работы почтового сервиса, к тому же виделись пара плюсов (понимаю, что призрачных): в случае чего проще будет развернуть из дампа базы данных, в случае другого чего, когда к системе может быть получен доступ посторонних, добраться до почтовых файлов будет сложнее, т. к. они хранятся в баде данных. Понимаю, что аргументация слабовата и наивна.
В качестве СУБД виднелась PostgreSQL. Причинами тому большая гибкость настроек, которую давали конфигурационные файлы, нравилась функция autovacuum, интересно было нововведение как интеграция с надстройкой безопасности SELinux.
Начались поиски, изучение и наброски конфигурации будущего сервера, муки поиска, творческие изыскания — всё как положено. В ходе происков попалась интересная статья, которая укрепила первоначальные умыслы.

1 Предварительная настройка операционной системы

1.1 Сетевые настройки

Операционная система (CentOS 6.4 x 64) была установлена в минимальном варианте (ну не пошёл kickstart ни в какую). Поэтому ручками доделываю всё требуемое.
Сетевые настройки сводятся к редактированию файла /etc/sysconfig/network-scripts/ifcfg-eth0:

Содержимое файла ifcfg-eth0

DEVICE=eth0 
HWADDR=04:6D:F4:А0:22:72 
TYPE=Ethernet 
UUID=5bdf71a7-ce8a-899b-a533-ac14fza52za5 
ONBOOT=yes 
NM_CONTROLLED=yes 
BOOTPROTO=static 
IPADDR=192.168.0.2 
NETMASK=255.255.255.0 
IPV6INIT=no 
DNS=192.168.0.254 
GATEWAY=192.168.0.1

Файл /etc/hosts отредактировал к следующему виду:

127.0.0.1       localhost 
192.168.0.2  wow.test.com    wow

Файл /etc/sysconfig/network привёл к виду:

NETWORKING=yes 
HOSTNAME=wow 
GATEWAY=192.168.0.254

Применение настроек:

/etc/init.d/network restart

Хотя лучше «ребутнуть» так кашерней.
Для небольшого тюнинга сетевой подсистемы в файл /etc/sysctl.conf добавил строки:

echo "net.ipv4.conf.all.accept_redirects = 0" >> /etc/sysctl.conf
echo "net.ipv4.conf.default.accept_redirects = 0" >> /etc/sysctl.conf
echo "net.ipv4.tcp_timestamps = 0" >> /etc/sysctl.conf
echo "net.ipv4.ip_default_ttl = 128" >> /etc/sysctl.conf
echo "net.ipv4.icmp_ratelimit = 70" >> /etc/sysctl.conf
echo "kernel.perf_event_paranoid = 2" >> /etc/sysctl.conf
echo "kernel.perf_event_max_sample_rate= -1" >> /etc/sysctl.conf

Для применения изменений:

sysctl -p

На случай некорректного выключения (куда же без этого?) автоматическая проверка файловой системы при загрузке:

echo "AUTOFSCK_TIMEOUT=5" > /etc/sysconfig/autofsck
echo "AUTOFSCK_DEF_CHECK=yes" >> /etc/sysconfig/autofsck

Может излишняя забота о RAID-массиве — в файле /etc/sysconfig/raid-check указал какие проверять и в случае чего восстанавливать устройства:

CHECK_DEVS="md0 md1" 
REPAIR_DEVS="md0 md1"

1.2 Установка дополнительных репозиториев

Поскольку систему надо держать в актуальном состоянии (а так как она будет находится под прессом внезапностей из интернета, то это ещё архи важно) да и некоторые приложения не имеются на официальном сайте, то доустанавливаю дополнительные репозитории:

yum install centos-release-cr
rpm -ivh http://dl.atrpms.net/el6Server-x86_64/atrpms/stable/atrpms-repo-6-7.el6.x86_64.rpm
rpm -ivh ftp://ftp.muug.mb.ca/mirror/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh ftp://ftp.pbone.net/mirror/elrepo.org/elrepo/el6/x86_64/RPMS/elrepo-release-6-5.el6.elrepo.noarch.rpm
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -ivh http://repo.openfusion.net/centos6-x86_64/openfusion-release-0.6.2-1.of.el6.noarch.rpm

Создаю файл репозитория /etc/yum.repos.d/linuxtech.repo следующего содержания:

Содержимое файла linuxtech.repo

[linuxtech-release]
name=LinuxTECH.NET el6 production repo
baseurl=http://pkgrepo.linuxtech.net/el6/release/
enabled=1
gpgcheck=1
gpgkey=http://pkgrepo.linuxtech.net/el6/release/RPM-GPG-KEY-LinuxTECH.NET

Теперь можно обновить систему:

yum clean all
yum update

Для настройки программ и контроля за системой установил следующие пакеты:

yum install telnet pax sgpio sdparm policycoreutils-python setools-libs-tcl setools-console selinux-policy-targeted iotop

1.3 Изменение настроек ssh-сервера

По-мелочи подправлен конфигурационный файл демона ssh (/etc/ssh/sshd_config) — запрещён по протоколу ssh доступ суперпользователю и ещё чуть-чуть немного:

Содержимое файла sshd_config


Port 22 
#AddressFamily any 
ListenAddress 127.0.0.1 
ListenAddress 192.168.0.2 

# Disable legacy (protocol version 1) support in the server for new 
# installations. In future the default will change to require explicit 
# activation of protocol 1 
Protocol 2 

# HostKey for protocol version 1 
#HostKey /etc/ssh/ssh_host_key 
# HostKeys for protocol version 2 
#HostKey /etc/ssh/ssh_host_rsa_key 
#HostKey /etc/ssh/ssh_host_dsa_key 

# Lifetime and size of ephemeral version 1 server key 
KeyRegenerationInterval 1h 
ServerKeyBits 4096 

# Logging 
# obsoletes QuietMode and FascistLogging 
SyslogFacility AUTH 
SyslogFacility AUTHPRIV 
LogLevel INFO 

# Authentication: 

LoginGraceTime 2m 
PermitRootLogin no 
#StrictModes yes 
#MaxAuthTries 6 
#MaxSessions 10 

RSAAuthentication yes 
PubkeyAuthentication yes 
AuthorizedKeysFile	.ssh/authorized_keys 
#AuthorizedKeysCommand none 
#AuthorizedKeysCommandRunAs nobody 

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts 
RhostsRSAAuthentication no 
# similar for protocol version 2 
HostbasedAuthentication no 
# Change to yes if you don't trust ~/.ssh/known_hosts for 
# RhostsRSAAuthentication and HostbasedAuthentication 
#IgnoreUserKnownHosts no 
# Don't read the user's ~/.rhosts and ~/.shosts files 
IgnoreRhosts yes 

# To disable tunneled clear text passwords, change to no here! 
#PasswordAuthentication yes 
PermitEmptyPasswords no 
PasswordAuthentication yes 

# Change to no to disable s/key passwords 
#ChallengeResponseAuthentication yes 
ChallengeResponseAuthentication no 

# Kerberos options 
#KerberosAuthentication no 
#KerberosOrLocalPasswd yes 
#KerberosTicketCleanup yes 
#KerberosGetAFSToken no 
#KerberosUseKuserok yes 

# GSSAPI options 
GSSAPIAuthentication no 
#GSSAPIAuthentication yes 
#GSSAPICleanupCredentials yes 
#GSSAPICleanupCredentials yes 
#GSSAPIStrictAcceptorCheck yes 
#GSSAPIKeyExchange no 

# Set this to 'yes' to enable PAM authentication, account processing, 
# and session processing. If this is enabled, PAM authentication will 
# be allowed through the ChallengeResponseAuthentication and 
# PasswordAuthentication.  Depending on your PAM configuration, 
# PAM authentication via ChallengeResponseAuthentication may bypass 
# the setting of "PermitRootLogin without-password". 
# If you just want the PAM account and session checks to run without 
# PAM authentication, then enable this but set PasswordAuthentication 
# and ChallengeResponseAuthentication to 'no'. 
#UsePAM no 
UsePAM yes 

# Accept locale-related environment variables 
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES 
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT 
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE 
AcceptEnv XMODIFIERS 

#AllowAgentForwarding yes 
#AllowTcpForwarding yes 
#GatewayPorts no 
X11Forwarding no 
#X11Forwarding yes 
#X11DisplayOffset 10 
#X11UseLocalhost yes 
#PrintMotd yes 
#PrintLastLog yes 
#TCPKeepAlive yes 
#UseLogin no 
#UsePrivilegeSeparation yes 
#PermitUserEnvironment no 
#Compression delayed 
#ClientAliveInterval 0 
#ClientAliveCountMax 3 
#ShowPatchLevel no 
#UseDNS yes 
#PidFile /var/run/sshd.pid 
MaxStartups 2:70:10 
#PermitTunnel no 
#ChrootDirectory none 

# no default banner path 
#Banner none 

# override default of no subsystems 
##Subsystem	sftp	/usr/libexec/openssh/sftp-server 

# Example of overriding settings on a per-user basis 
#Match User anoncvs 
#	X11Forwarding no 
#	AllowTcpForwarding no 
#	ForceCommand cvs server

Для применения изменений:

/etc/init.d/sshd restart

Установка и настройка PostgreSQL 9.3

2.1 Установка сервера баз данных PostgreSQL 9.3

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

rpm -ivh http://yum.pgrpms.org/9.3/redhat/rhel-6-x86_64/pgdg-centos93-9.3-1.noarch.rpm

Установка сервера базы данных:

yum install postgresql93-server

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

etc/init.d/postgresql-9.3 initdb
/etc/init.d/postgresql-9.3 start

Добавляю в автозапуск:

chkconfig --level 235 postgresql-9.3 on

2.2 Настройка базы данных PostgreSQL 9.3

Задаю пароль для системного пользователя postgres:

passwd postgres

Задаю пароль для пользователя postgres (не системного) в базе данных:

su postgres
psql -U postgres
ALTER USER postgres with encrypted password '<наш новый пароль>';
q

Файл /var/lib/pgsql/9.3/data/pg_hba.conf приводёл к виду:

Содержимое файла pg_hba.conf

# TYPE  DATABASE        USER            ADDRESS                 METHOD 

# "local" is for Unix domain socket connections only 
local   all             all                                             md5 
# IPv4 local connections: 
host    all             all             127.0.0.1/32            md5 
host    all             all             <ip admin mashins>/32    md5 
host    all             all             10.0.0.0/8                reject 
host    all             all             172.16.0.0/16          reject 
host    all             all             169.254.0.0/16        reject 
# IPv6 local connections: 
host    all             all             ::1/128                     reject

Файл /var/lib/pgsql/9.3/data/postgresql.conf можно наизменять посерьёзней (файл по размерам приличный поэтому приводятся строки, в которых были изменения). Диезами (#...#) отмечены коментарии к изменяемым параметрам:

Содержимое файла postgresql.conf

listen_addresses = 'localhost, 192.168.0.2'  # what IP address(es) to listen on; 
                                                   # comma-separated list of addresses; 
                                                   # defaults to 'localhost', '*' = all 
                                                   # (change requires restart) 
port = 5432                               # (change requires restart) 
max_connections = 144         # Между прочим, это не просто максимальное количество подключённых к базе  
                                                   # в один момент клиентов, этот параметр, как следствие, ещё будет задавать 
                                                   # общее потребление ресурсов всей БД в целом.#
unix_socket_directories = '/var/run/postgresql'	 # comma-separated list directories.#
unix_socket_permissions = 0777       # begin with 0 to use octal notation
bonjour = off			# advertise server via Bonjour

# - Security and Authentication - 
authentication_timeout = 1min           # 1s-600s 
ssl = off                               # (change requires restart) 
password_encryption = on

shared_buffers = 1024MB 		#Размер общей памяти БД. В классическом понимании, память у каждого процесса в системе своя. PostgreSQL в запущенном виде представляет собой множество процессов, взять одни только подключения, например. И, понятное дело, для уменьшения накладных расходов, надо сделать часть используемой ими памяти общей для всех процессов БД. Для этого ядро представляет в виде ram-диска особый вид памяти - Shared Memory. Собственно данный параметр регламентирует размер блока Shared Memory, который PostgreSQL запросит у ядра. Рекомендуется делать 1/4 размера оперативной памяти.#

max_prepared_transactions = 128 	#Есть такое понятие - отложенная транзакция. В оригинале все транзакции проходят две стадии: подготовка запроса и выполнение. Состояние посередине и называется отложенной транзакцией. Занимают память и блокировки, как следствие.#

work_mem = 2MB			#А это совсем просто - максимальный размер использования ОЗУ для каждого подключения в отдельности (без учёта общей памяти). 2- 3 мегабайт должно хватать для Web-приложений и DBMail.#

maintenance_work_mem = 128MB	#То же самое, но для служебных приложений, типа autovacuum'а. Не имеет смысл делать больше, чем 256 мегабайт.#

fsync = on			#Данный параметр отвечает за сброс данных
 из кэша на диск при завершении транзакций. Если установить его значение fsync = off то данные не будут записываться на дисковые накопители сразу после завершения операций. Поскольку БД сильно юзаться не будет, поди не числодробилку ваяем, да и с оборудованием может всякое случиться (а оно случится обязательно), поэтому пусть будет небольшая перестраховка.#

full_page_writes = on		#Если этот параметр включен, сервер PostgreSQL пишет весь контент каждой страницы диска в WAL во время первого изменения этой страницы после контрольной точки. Это необходимо, поскольку если в процессе записывания страницы произойдет системный сбой, на диске может оказаться страница, в которой смешаны старые и новые данные. Изменения на уровне строк данных, которые обычно хранятся в WAL, может быть не достаточно для восстановления страницы после системного сбоя.#

checkpoint_segments = 5 		#По всей базе данных расставляются служебные контрольные точки, или через определённое время, или через определённый объём записанной информации. В данном случае отмечается через какое количество данных база ставит отметку, закрывая период между отметками. Закрытие периода требует времени на обсчёт, и может замедлять запись. Возможно сильно, так что при высоких темпах записи, надо ставить большее значение. Каждая единица - 16 мегабайт. То есть в нашем случае, на первых порах, база ставит отметку через каждые 128 мегабайт. Со временем надо обязательно проверить темп записи точек! Очень полезны при диагностики логи, как обычно#

checkpoint_timeout = 15min	#Всё тоже самое, но относительно времени простоя. Я так думаю, что если за 10 минут не набралось 128 мегабайт данных, то ничего ужасного в замедлении обработки запросов к базе при закрытии отметки не будет. Так что, на первое время, это - оптимальное значение.#

checkpoint_completion_target = 0.7 		#О, это очень интересный параметр! Он отмечает рубеж заполнения лимита, при котором начинается предварительное закрытие точки! Чем больше - тем позже начнём считать, и эффективней будем размазывать место между отметками. Чем ниже - тем быстрей будет закрывать точку. Полезно, для упреждения потерь на закрытие точки.#

random_page_cost = 4.0 		#Планировщику ресурсов PostgreSQL полезно знать задержку при работе с дисковой памятью. Данное значение вполне соответствует SATAII диску.#

effective_cache_size = 2048MB	#Самая большая задержка для БД - чтение и запись с диска, особенно при сложных операциях. Чем больший кеш мы сможем иметь, тем реже будем обращаться к диску. Рекомендуется использовать значение равное 1/2 объёма оперативной памяти.#

default_statistics_target = 500	#Стандартное значение данного параметра - 100. Максимальное - 10000. А сам параметр отвечает за частоту сбора информации планировщиком о состоянии таблиц в БД, дабы облегчить в дальнейшим обработку сложных запросов. Значение 500, как мне кажется, полностью покроет и потребности DBMail и любого Web-приложения, если только речь идёт не о соц. сети. Кроме того, подобной деятельностью занимается так же autovacuum.#

log_destination = 'syslog'	            # Куда писать сообщения.#

logging_collector = off		# Выключить. Положено включать только для «This is used when logging to stderr».#

log_min_messages = warning	# Минимум, с которого начинать писать.#

log_checkpoints = on 		# Записывать контрольные точки.#

log_connection = on		# Журналирование подключений. Если будет много сообщений о подключении основных программ, можно отключить. А так интересно, кто ещё интересуется. PSAD показал, что любопытных много.#

log_line_prefix = 'user=%u, db=%d, host=%h'	         # Приставки к журнальным сообщениям, для упрощения разбора полёта.#

autovacuum = on 		#Без этого, ИМХО, жить нельзя. Представьте себе, что кто-то вместо ваших приложений оптимизирует таблицы и вычищает мусор и вообще держит БД в порядке. Разве оно может быть не надо? Это, конечно же, не отменяет того, что если базу использовать выключив мозг, то тогда ничего не спасёт.#

autovacuum_max_workers = 5	#Думаю, что этого будет вполне достаточно. Особенно на первое время. Задаёт максимальное количество параллельных процессов для autovacuum.#

autovacuum_naptime = 1h	#Итак, предполагаю проводить autovacuum каждый час. Чаще, как мне кажется, не имеет смысла. Благо анализ таблиц делает и сам PostgreSQL достаточно часто теперь.#

Примечание. Тема с русскими комментами взята отсюда и отсюда. Содержимое файла postgresql.conf может быть ещё подкорректировано из личный усмотрений с предпочтениями и заблуждений.
Как видно из начала конфигурационного файла postgresq.conf файл сокета будет находиться не в обычной директории /tmp, а совсем в другой. Основная причина — поднять безопасность. В политиках SELinux FC (file context) для Postgresql есть подходящая для этих целей, даже очень, только почему-то вообще задействованная совсем:

semanage fcontext -l | grep postgresql | grep var_run
/var/run/postgresql(/.*)?       all files          system_u:object_r:postgresql_var_run_t:s0

Создаю требуемую директорию и задаю для неё контекст SELinux:

mkdir /var/run/postgresql
semanage fcontext -a -t postgresql_var_run_t "/var/run/postgresql(/.*)?"
chcon -R -u system_u /var/run/postgresql
restorecon -R -v /var/run/postgresql

Чтобы настройки возымели действо:

/etc/init.d/postgresql-9.1 restart

Теперь можно заняться созданием пользователя и самой почтовой базы данных:

su postgres
psql -U postgres 

Password for user postgres:<пароль пользователя postgres в БД>

CREATE USER <пользователь БД почты> with encrypted password '<и его пароль>';
CREATE DATABASE <название БД почты> WITH OWNER <пользователь БД почты>;
GRANT ALL ON DATABASE <название БД почты> TO <пользователь БД почты>;
q

Разрешение на подключение МТА и MDA к базе данных:

setsebool -P allow_user_postgresql_connect on

3 Установка и настройка MDA Dbmail

Установка довольно проста:

yum install dbmail

Далее потребуется сгенерировать сертификат TLS (пару ключей), иначе dbmail будет ругаться при запуске и не совсем стабильно работать:

openssl req -new -newkey rsa:2048 -x509 -days 365 -nodes -keyform PEM -keyout /etc/pki/tls/private/wow.test.com.pem -outform PEM -out /etc/pki/tls/certs/wow.test.com.pem

Программа генерации ключей запросит заполнить поля:

Country Name (2 letter code) [XX]:RU 
State or Province Name (full name) []:West region    
Locality Name (eg, city) [Default City]:SPT 
Organization Name (eg, company) [Default Company Ltd]:List ltd 
Organizational Unit Name (eg, section) []:For_all 
Common Name (eg, your name or your server hostname) []:wow.test.com
Email Address []:support@ test.com

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

usermod -a -G mail dbmail

Также изменить права доступа для файлов сертификатов контекст SELinux:

chmod 440 /etc/pki/tls/private/wow.test.com.pem
chown root:mail /etc/pki/tls/private/wow.test.com.pem
chcon -u system_u /etc/pki/tls/private/wow.test.com.pem
restorecon -v /etc/pki/tls/private/wow.test.com.pem
chmod 440 /etc/pki/tls/certs/wow.test.com.pem
chown root:mail /etc/pki/tls/certs/wow.test.com.pem
chcon -u system_u /etc/pki/tls/certs/wow.test.com.pem
restorecon -v /etc/pki/tls/certs/wow.test.com.pem

Конфигурационный файл /etc/dbmail.conf приводится к такому виду:

Содержимое файла dbmail.conf

# (c) 2000-2006 IC&S, The Netherlands 
# 
# Configuration file for DBMAIL 

[DBMAIL] 
# 
# Database settings 
# 

# 
# Supported drivers are mysql, postgresql, sqlite. 
# 
driver               = postgresql 

# 
# Supported drivers are sql, ldap. 
# 
authdriver           = sql 

# 
# Host for database, set to localhost if database is on 
# the same host as dbmail and you want to use a local 
# socket for connecting. 
# 
host                 = localhost

# 
# If you want to use TCP/IP for connecting to the database, 
# and have the database running on a non-standard port. 
# 
#sqlport              = 5432 

# 
# When using a local socket connection to the database, fill 
# in the path to the socket here (e.g. /var/run/mysql.sock). 
# 
sqlsocket            = /var/run/postgresql

# 
# Database username. 
# 
user                 = pigeon 

# 
# Database password. 
# 
pass                 = wesdf

# 
# Database name. 
# 
#db                   = /var/lib/dbmail/dbmail.db 
db = dovecote 

# 
# Number of database connections per threaded daemon 
# This also determines the size of the worker threadpool 
# 
max_db_connections   = 144 

# 
# Table prefix. Defaults to "dbmail_" if not specified. 
# 
table_prefix         = dbmail_   
 

# 
# encoding must match the database/table encoding. 
# i.e. latin1, utf8 
encoding             = utf8 

# 
# messages with unknown encoding will be assumed to have 
# default_msg_encoding 
# i.e. iso8859-1, utf8
default_msg_encoding = utf8

# 
# Postmaster's email address for use in bounce messages. 
# 
postmaster           = support@test.com

# 
# Sendmail executable for forwards, replies, notifies, vacations. 
# You may use pipes (|) in this command, for example: 
# dos2unix|/usr/sbin/sendmail  works well with Qmail. 
# You may use quotes (") for executables with unusual names. 
# 
sendmail              = /usr/sbin/sendmail 

# 
# 
# The following items can be overridden in the service-specific sections. 
# 
# 

# 
# Logging via stderr/log file and syslog 
# 
# Logging is broken up into 8 logging levels and each level can be indivually turned on or off. 
# The Stderr/log file logs all entries to stderr or the log file. 
# Syslog logging uses the facility mail and the logging level of the event for logging. 
# Syslog can then be configured to log data according to the levels. 
# 
# Set the log level to the sum of the values next to the levels you want to record. 
#   1 = Emergency 
#   2 = Alert 
#   4 = Critical 
#   8 = Error 
#  16 = Warning 
#  32 = Notice 
#  64 = Info 
# 128 = Debug 
# 256 = Database -> Logs at debug level 
# 
# Examples:   0 = Nothing 
#            31 = Emergency + Alert + Critical + Error + Warning 
#           511 = Everything 
# 
file_logging_levels       = 31 
# 
syslog_logging_levels     = 127 

# 
# Generate a log entry for database queries for the log level at number of seconds of query execution time. 
# 
query_time_info       = 10 
query_time_notice     = 20 
query_time_warning    = 30 

# 
# Throw an exception is the query takes longer than query_timeout seconds 
query_timeout         = 300 

# 
# Root privs are used to open a port, then privs 
# are dropped down to the user/group specified here. 
# 
effective_user        = dbmail 
effective_group       = dbmail 

# 
# The IPv4 and/or IPv6 addresses the services will bind to. 
# Use * for all local interfaces. 
# Use 127.0.0.1 for localhost only. 
# Separate multiple entries with spaces ( ) or commas (,). 
# 
bindip                  = 127.0.0.1	# IPv4 only - all IP's 
#bindip                = 0.0.0.0,::	# IPv4 and IPv6 - all IP's (BSD) 


# 
# Idle time allowed before a connection is shut off. 
# 
timeout               = 480 

# 
# Idle time allowed before a connection is shut off if you have not logged in yet. 
# 
login_timeout         = 72
 
# 
# If yes, resolves IP addresses to DNS names when logging. 
# 
resolve_ip            = yes 

# 
# If yes, keep statistics in the authlog table for connecting users 
# 
authlog               = yes 

# 
# logfile for stdout messages 
# 
logfile               = /var/log/dbmail/dbmail.log 

# 
# logfile for stderr messages 
# 
errorlog              = /var/log/dbmail/dbmail.err 

# 
# directory for storing PID files 
# 
pid_directory         = /var/run/dbmail

# 
# directory for locating libraries (normally has a sane default compiled-in) 
# 
library_directory       = /usr/lib64/dbmail 

# 
# SSL/TLS certificates 
# 
# A file containing a list of CAs in PEM format 
tls_cafile            = /etc/pki/tls/certs/wow.test.com.pem

# A file containing a PEM format certificate 
tls_cert              = /etc/pki/tls/certs/wow.test.com.pem

# A file containing a PEM format RSA or DSA key 
tls_key               = /etc/pki/tls/private/wow.test.com.pem

# A cipher list string in the format given in ciphers(1) 
tls_ciphers           = AES
 
# hashing algorithm. You can select your favorite hash type 
# for generating unique ids for message parts. 
# 
# for valid values check mhash(3) but minus the MHASH_ prefix. 
#  
# if you ever change this value run 'dbmail-util --rehash' to 
# update the hash for all mimeparts. 
# 
# examples: MD5, SHA1, SHA256, SHA512, TIGER, WHIRLPOOL 
# 
hash_algorithm = SHA1 


[LMTP] 
port                  = 24                 
bindip              = localhost
socket		    = /var/run/dbmail/lmtpd.sock

[POP] 
port                  = 110 
tls_port            = 995 
bindip              = 192.168.0.2

# You can set an alternate banner to display when connecting to the service 
banner =  Dovecot pop3 server is ready 

# 
# If yes, allows SMTP access from the host IP connecting by POP3. 
# This requires addition configuration of your MTA 
# 
pop_before_smtp       = no 


[IMAP] 
# You can set an alternate banner to display when connecting to the service 
banner = Dovecot imap server is ready 
 
# 
# Port to bind to. 
# 
port                   = 143                
tls_port              = 993 
bindip                = 192.168.0.2

# 
# IMAP prefers a longer timeout than other services. 
# 
timeout               = 4800 

# 
# If yes, allows SMTP access from the host IP connecting by IMAP. 
# This requires addition configuration of your MTA 
# 
imap_before_smtp      = no 

# 
# during IDLE, how many seconds between checking the mailbox 
# status (default: 30) 
# 
# idle_timeout          = 30 

# 
# Provide a CAPABILITY to override the default 
# 
# capability 		= IMAP4 IMAP4rev1 AUTH=LOGIN ACL RIGHTS=texk 
# NAMESPACE CHILDREN SORT QUOTA THREAD=ORDEREDSUBJECT UNSELECT 
# IDLE 

# Send '* STATUS "mailbox" (MESSAGES x RECENT x UNSEEN x NEXTUID x)' 
# for all subscribed mailboxes during IDLE (default: no) 
# note: EXPERIMENTAL (and most likely disabled in the code) 
# 
# idle_status           = yes 


[SIEVE] 
# 
# Port to bind to. 
# 
port                  = 2000 
#tls_port              = 
bindip                = localhost
 
[DELIVERY] 
# 
# Run Sieve scripts as messages are delivered. 
# 
SIEVE                 = yes 

# 
# Use 'user+mailbox@domain' format to deliver to a mailbox. 
# 
SUBADDRESS            = yes 

# 
# Turn on/off the Sieve Vacation extension. 
# 
SIEVE_VACATION        = yes 

# 
# Turn on/off the Sieve Notify extension 
# 
SIEVE_NOTIFY          = no

# 
# Turn on/off additional Sieve debugging. 
# 
SIEVE_DEBUG           = no 


# Use the auto_notify table to send email notifications. 
# 
AUTO_NOTIFY           = no 
 
# 
# Use the auto_reply table to send away messages. 
# 
AUTO_REPLY            = no 

# 
# Defaults to "NEW MAIL NOTIFICATION" 
# 
#AUTO_NOTIFY_SUBJECT        =    

# 
# Defaults to POSTMASTER from the DBMAIL section. 
# 
#AUTO_NOTIFY_SENDER        =   
# If you set this to 'yes' dbmail will check for duplicate 
# messages in the relevant mailbox during delivery using 
# the Message-ID header 
# 
suppress_duplicates	= no 

# end of configuration file

Чтобы программа заработала, создан каталог /var/run/dbmail/ с правами доступа dbmail:dbmail:

mkdir /var/run/dbmail/; chown dbmail:dbmail /var/run/dbmail/
chcon -u system_u /var/run/dbmail/
restorecon -v /var/run/dbmail/ 
mkdir /var/log/dbmail/
chcon -u system_u /var/log/dbmail/
restorecon -v /var/log/dbmail/

Файл настройки ротации логов dbmail исправлен к следующему виду:

Содержимое файла /etc/logrotate.d/dbmail.conf

/var/log/dbmail/dbmail.log {
    missingok
    notifempty
    create 0600 root root
}

/var/log/dbmail/dbmail.err {
    missingok
    notifempty
    create 0600 root root
    postrotate
       for pid in `ls /var/run/dbmail/dbmail-*.pid`; do kill -HUP `cat $pid` &> /dev/null; done
    endscript
}

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

su postgres
psql -U <пользователь почтовой БД> -h localhost <почтовая БД> 
< /usr/share/doc/dbmail-3.0.2/sql/postgresql/create_tables.pgsql
Password for user post:

Проверка правильности настроек:

dbmail-util -av

Если в ответ никакой ругани не последовало (всё Maintenance done. No errors found), то можно и запускать dbmail, иначе придётся искать ошибку (ошибки):

for i in dbmail-imapd dbmail-lmtpd dbmail-pop3d dbmail-timsieved; do /etc/init.d/$i restart; done

Проверка работы dbmail:

netstat -tapn |grep dbmail
tcp  0  0 192.168.0.2:110    0.0.0.0:*     LISTEN   1869/dbmail-pop3d   
tcp  0  0 192.168.0.2:143    0.0.0.0:*     LISTEN   1698/dbmail-imapd   
tcp  0  0 127.0.0.1:2000      0.0.0.0:*     LISTEN   1883/dbmail-timsiev 
tcp  0  0 127.0.0.1:24         0.0.0.0:*     LISTEN   1856/dbmail-lmtpd   
tcp  0  0 192.168.0.2:993    0.0.0.0:*     LISTEN   1698/dbmail-imapd   
tcp  0  0 192.168.0.2:995    0.0.0.0:*     LISTEN   1869/dbmail-pop3d 

Базу данных почты желательно периодически очищать средствами утилит dbmail. Для этого в планировщик заданий cron добавлен запуск dbmail-util. В файл /etc/crontab добавлены задания:

20  21  *  *  * root dbmail-util -dy 2>&1 > /dev/null
30  21  *  *  * root dbmail-util -py 2>&1 > /dev/null
40  21  *  *  * root dbmail-util -ty 2>&1 > /dev/null

Командой «dbmail-util -dy» прочитанные письма, имеющие в базе данных статус 2, помечаются на удаление, т. е. статус становится 3. Далее командой «dbmail-util -py» удаляются все письма со статусом 3. Командой «dbmail-util -ty» проверяется целостность базы, т. е. из таблиц удаляются не связанные записи.
Стоит ещё изменить файл конфигурации /etc/sysconfig/dbmail к виду:

Содержимое файла /etc/sysconfig/dbmail

LOGFILE=/var/log/dbmail/dbmail.log 
UTIL_OPTS=-M -a -y

Продолжение последует.

Автор: bARmaleyKA

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js