В статье с кучей копипасты рассматривается настройка сервера электронной почты, построенного на базе связки exim и dbmail с хранением данных в postgreSQL.
Вообще имеется работающий сервер на базе Postfix+dovecot+postgrey с красивой управлялкой на Postfixadmin. Пашет, справляется, хотя иногда письма то ли теряет, то ли выкидывает. Но постепенно на сервер по той или иной причине стали добавляться иные да разные приложения, к почте отношения имеющие более чем никакие. Они и не мешают, но и ни к месту тоже. Отчего решение поменять, исправить сложившееся положение дел зрело зело давно. Были мысли устроить Майдан и дело с концом, только их пришлось придать анафеме с последующим забвением.
Начались размышления и прикидывания различных вариантов с учётом специфики предстоящей работы сервера: он будет заслан совсем весь в демилитаризованную зону, при этом должен стойко переносить тяготы и лишения почтовой службы на просторах интернета. Как показали обзоры творящегося с помощью утилиты PSAD и сбора статистики с ASA5505 любопытных на посканировать порты и охочих до разных атак пруд пруди. Помимо этого требовалось гибкое и разнообразное управление почтовым трафиком: что-то отсеивать ещё до обработки, а какие почтовые сообщения припускать несмотря ни на что, и при необходимости управлять очередью. И конечно же всегда быть готовым к тому что либо ломанут, либо система откажет в самый интересный момент, как следствие возможность временного резервного развёртывания хотя бы на коленке должна быть заложена изначально.
Вариант с Postfix казался неплохим, особенно когда включены все reject-ы и параллельно запущен SPF. Ни спама, ни забот, ни хлопот. Только пользователи почему-то не разделяли эту радость. Загадочные люди… Им от некоторых важных организаций почему-то перестали приходить письма. Не знаю, мне всё приходило.
Dovecot — быстрый, гибкий и безопасный MDA. Казалось бы какого вам ещё надо? Вот только гложила каверзная идея попробовать хранить почту в базе данных, чтобы потом SQL-распросами проводить небольшое расследование работы почтового сервиса, к тому же виделись пара плюсов (понимаю, что призрачных): в случае чего проще будет развернуть из дампа базы данных, в случае другого чего, когда к системе может быть получен доступ посторонних, добраться до почтовых файлов будет сложнее, т. к. они хранятся в баде данных. Понимаю, что аргументация слабовата и наивна.
В качестве СУБД виднелась PostgreSQL. Причинами тому большая гибкость настроек, которую давали конфигурационные файлы, нравилась функция autovacuum, интересно было нововведение как интеграция с надстройкой безопасности SELinux.
Начались поиски, изучение и наброски конфигурации будущего сервера, муки поиска, творческие изыскания — всё как положено. В ходе происков попалась интересная статья, которая укрепила первоначальные умыслы.
Операционная система (CentOS 6.4 x 64) была установлена в минимальном варианте (ну не пошёл kickstart ни в какую). Поэтому ручками доделываю всё требуемое.
Сетевые настройки сводятся к редактированию файла /etc/sysconfig/network-scripts/ifcfg-eth0:
Файл /etc/hosts отредактировал к следующему виду:
Файл /etc/sysconfig/network привёл к виду:
Применение настроек:
Хотя лучше «ребутнуть» так кашерней.
Для небольшого тюнинга сетевой подсистемы в файл /etc/sysctl.conf добавил строки:
Для применения изменений:
На случай некорректного выключения (куда же без этого?) автоматическая проверка файловой системы при загрузке:
Может излишняя забота о RAID-массиве — в файле /etc/sysconfig/raid-check указал какие проверять и в случае чего восстанавливать устройства:
Поскольку систему надо держать в актуальном состоянии (а так как она будет находится под прессом внезапностей из интернета, то это ещё архи важно) да и некоторые приложения не имеются на официальном сайте, то доустанавливаю дополнительные репозитории:
Создаю файл репозитория /etc/yum.repos.d/linuxtech.repo следующего содержания:
Теперь можно обновить систему:
Для настройки программ и контроля за системой установил следующие пакеты:
По-мелочи подправлен конфигурационный файл демона ssh (/etc/ssh/sshd_config) — запрещён по протоколу ssh доступ суперпользователю и ещё чуть-чуть немного:
Для применения изменений:
Для установки можно скачать необходимый пакет с сайта, либо сразу установить пакет репозитория:
Установка сервера базы данных:
Инициализирование и запуск базы данных:
Добавляю в автозапуск:
Задаю пароль для системного пользователя postgres:
Задаю пароль для пользователя postgres (не системного) в базе данных:
Файл /var/lib/pgsql/9.3/data/pg_hba.conf приводёл к виду:
Файл /var/lib/pgsql/9.3/data/postgresql.conf можно наизменять посерьёзней (файл по размерам приличный поэтому приводятся строки, в которых были изменения). Диезами (#...#) отмечены коментарии к изменяемым параметрам:
Примечание. Тема с русскими комментами взята отсюда и отсюда. Содержимое файла postgresql.conf может быть ещё подкорректировано из личный усмотрений с предпочтениями и заблуждений.
Как видно из начала конфигурационного файла postgresq.conf файл сокета будет находиться не в обычной директории /tmp, а совсем в другой. Основная причина — поднять безопасность. В политиках SELinux FC (file context) для Postgresql есть подходящая для этих целей, даже очень, только почему-то вообще задействованная совсем:
Создаю требуемую директорию и задаю для неё контекст SELinux:
Чтобы настройки возымели действо:
Теперь можно заняться созданием пользователя и самой почтовой базы данных:
Разрешение на подключение МТА и MDA к базе данных:
Установка довольно проста:
Далее потребуется сгенерировать сертификат TLS (пару ключей), иначе dbmail будет ругаться при запуске и не совсем стабильно работать:
Программа генерации ключей запросит заполнить поля:
Для корректной работы с сертификатами, необходимо добавить пользователя dbmail в группу mail:
Также изменить права доступа для файлов сертификатов контекст SELinux:
Конфигурационный файл /etc/dbmail.conf приводится к такому виду:
Чтобы программа заработала, создан каталог /var/run/dbmail/ с правами доступа dbmail:dbmail:
Файл настройки ротации логов dbmail исправлен к следующему виду:
Теперь можно создать почтовую базу данных:
Проверка правильности настроек:
Если в ответ никакой ругани не последовало (всё Maintenance done. No errors found), то можно и запускать dbmail, иначе придётся искать ошибку (ошибки):
Проверка работы dbmail:
Базу данных почты желательно периодически очищать средствами утилит dbmail. Для этого в планировщик заданий cron добавлен запуск dbmail-util. В файл /etc/crontab добавлены задания:
Командой «dbmail-util -dy» прочитанные письма, имеющие в базе данных статус 2, помечаются на удаление, т. е. статус становится 3. Далее командой «dbmail-util -py» удаляются все письма со статусом 3. Командой «dbmail-util -ty» проверяется целостность базы, т. е. из таблиц удаляются не связанные записи.
Стоит ещё изменить файл конфигурации /etc/sysconfig/dbmail к виду:
Продолжение последует.
Введение
Вообще имеется работающий сервер на базе 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://ift.tt/1lAyQKi
rpm -ivh http://ift.tt/1h0DAIz
rpm -ivh http://ift.tt/1lAyR0A
rpm -ivh http://ift.tt/1fY6w3I
rpm -ivh http://ift.tt/1lAySBS
Создаю файл репозитория /etc/yum.repos.d/linuxtech.repo следующего содержания:
Содержимое файла linuxtech.repo
[linuxtech-release]
name=LinuxTECH.NET el6 production repo
baseurl=http://ift.tt/1h0DAID
enabled=1
gpgcheck=1
gpgkey=http://ift.tt/1lAySSe
Теперь можно обновить систему:
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://ift.tt/1lAyR0F
Установка сервера базы данных:
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
Продолжение последует.
This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.