Установка и настройка Docker + Docker Compose + Postfix + OpenDKIM на Debian в VScale для отправки e-mail с подписью
Одно из самых распространенных требований к новому веб-приложению – отправка почтовых уведомлений пользователям. Транзакционные письма для регистрации, подтверждения действий, восстановления пароля и другие важные сообщения требуют успешного прохождения спам-фильтров.
Популярные почтовые серверы имеют свои алгоритмы спам-фильтрации. Очень часто это: проверка содержимого, анализ статистики получения подобных писем другими пользователями, ограничение приема писем с неизвестных IP адресов. Но главное, что объединяет все популярные почтовые серверы — это проверка отправителя письма по SPF записям, проверка подлинности DKIM подписи и следование DMARC правилам. Все это зависит от корректной настройки на нашей стороне, а успешное прохождение этих проверок существеннее всего повышает вероятность доставки. В то время как добавление соответствующих TXT записей для SPF и DMARC проверок достаточно тривиальная задача, то для реализации подписи писем с помощью DKIM требуется установка и настройка дополнительных пакетов. В этой статье описывается решение этой задачи средствами OpenDKIM и Postfix для подписи сообщений и демонстрируется использование Docker и Docker Compose для организации работы изолированных и зависимых сервисов.
Чтобы приступить, создайте сервер Debian Jessie на VScale, зарегистрируйте ключ и подключитесь по ssh.
Установка Docker
Как можно заметить, в панели VScale уже есть готовое приложение Docker под Ubuntu. Если вы хотите использовать Ubuntu, то можете просто поднять готовый сервер с Docker и пропустить этот шаг.
Обновляем индекс пакетов:
apt-get update
Устанавливаем зависимости:
apt-get install apt-transport-https ca-certificates
Добавляем ключ, необходимый для apt-обновлений из dockerproject.org:
apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
Добавляем источник dockerproject.org:
printf "deb https://apt.dockerproject.org/repo debian-jessie main\n" > /etc/apt/sources.list.d/docker.list
Обновляем индекс снова:
apt-get update
Проверяем добавление источника:
apt-cache policy docker-engine
В подходящих источниках должен быть только:
https://apt.dockerproject.org/repo/ debian-jessie/main amd64 Packages
Устанавливаем docker-engine:
apt-get install docker-engine
Установка docker-compose для управления несколькими контейнерами
Устанавливаем curl для получения последней версии из github:
apt-get install curl
Загружаем на данный момент актуальную версию docker-compose 1.9.0:
curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Устанавливаем права на исполнение:
chmod +x /usr/local/bin/docker-compose
Проверяем версию:
docker-compose --version
Конфигурация docker-compose
Создаем директорию для размещения конфигурации
mkdir -p /www/dc-mail
Создаем файл конфигурации docker-compose.yml и редактируем его в вашем любимом редакторе, например, так:
nano /www/dc-mail/docker-compose.yml
version: '2'
services:
mail-relay:
build:.
context: ./mail-relay
args:
- POSTFIX_MYNETWORKS=127.0.0.1
ports:
- "25:25"
depends_on:
- mail-dkim
mail-dkim:
build:
context: ./mail-dkim
args:
- DKIM_DOMAIN=example.com
- DKIM_SELECTOR=mail
- DKIM_INTERNAL=127.0.0.1
expose:
- "8891"
Мы объявляем 2 сервиса mail-relay и mail-dkim. В первом будет запущен демон Postfix, пропускающий все письма через OpenDKIM, работающий в mail-dkim.
Измените значения аргументов на свои:
- POSTFIX_MYNETWORKS — IP адрес сервера или подсеть, с которого/которой разрешено получать письма, например, адрес вашего бэкенда.
- DKIM_DOMAIN – домен вашего приложения, письма от которого должны быть подписаны.
- DKIM_SELECTOR – название селектора, может быть оставлен как есть.
- DKIM_INTERNAL – тот же IP адрес отправителя или подсеть.
Конфигурация также содержит параметр ports у mail-relay, указывающий, что порт 25 будет доступен извне и параметр expose 8891 у mail-dkim, открывающий доступ к порту OpenDKIM для сервиса mail-relay.
Конфигурация сервисов Docker
Создаем директорию для сервиса mail-dkim:
mkdir -p /www/dc-mail/mail-dkim
Создаем и редактируем файл Dockerfile:
nano /www/dc-mail/mail-dkim/Dockerfile
FROM debian:jessie
ENV DEBIAN_FRONTEND noninteractive
# Выставляем временную зону
RUN echo Europe/Moscow | tee /etc/timezone
RUN dpkg-reconfigure --frontend noninteractive tzdata
ARG DKIM_DOMAIN
ARG DKIM_SELECTOR
ARG DKIM_INTERNAL
# Устанавливаем зависимости и rsyslog для логов. apt-get update намеренно находится вместе с install для предотвращение использования кэша
RUN apt-get update && apt-get install -y opendkim opendkim-tools openssl rsyslog
# Создаем ключи и добавляем конфигурацию OpenDKIM, создаем лог файл. Также выводим на экран открытый ключ для добавления в TXT запись нашего домена.
RUN \
mkdir /etc/opendkim/ && \
opendkim-genkey -D /etc/opendkim/ -d $DKIM_DOMAIN -s $DKIM_SELECTOR && \
cat /etc/opendkim/$DKIM_SELECTOR.txt && \
printf "\
KeyTable file:/etc/opendkim/keytable \n\
SigningTable file:/etc/opendkim/signingtable \n\
InternalHosts file:/etc/opendkim/internal \n\
Canonicalization relaxed/relaxed \n\
LogWhy yes \n\
X-Header yes \n\
SyslogSuccess yes \n" >> /etc/opendkim.conf && \
printf "$DKIM_INTERNAL\n" >> /etc/opendkim/internal && \
printf "$DKIM_SELECTOR._domainkey.$DKIM_DOMAIN $DKIM_DOMAIN:$DKIM_SELECTOR:/etc/opendkim/$DKIM_SELECTOR.private\n" >> /etc/opendkim/keytable && \
printf "* mail._domainkey.$DKIM_DOMAIN\n" >> /etc/opendkim/signingtable && \
printf "SOCKET=\"inet:8891@0.0.0.0\"\n" >> /etc/default/opendkim && \
touch /var/log/mail.log
# Разрешаем читать ключ только владельцу
RUN chown opendkim /etc/opendkim/$DKIM_SELECTOR.private && \
chmod 600 /etc/opendkim/$DKIM_SELECTOR.private
# Команда для старта сервиса. OpenDKIM использует rsyslog для выдачи логов, поэтому запускаем и его
CMD service rsyslog start && service opendkim start && tail -f /var/log/mail.log
Создаем директорию для сервиса mail-relay:
mkdir -p /www/dc-mail/mail-dkim
Создаем и редактируем файл Dockerfile:
nano /www/dc-mail/mail-relay/Dockerfile
FROM debian:jessie
ENV DEBIAN_FRONTEND noninteractive
RUN echo Europe/Moscow | tee /etc/timezone
RUN dpkg-reconfigure --frontend noninteractive tzdata
ARG POSTFIX_MYNETWORKS
RUN apt-get update && apt-get install -y postfix rsyslog
# Конфигурация postfix для обработки писем через opendkim и создание лог-файла
RUN \
postconf -e "mydestination = localhost" && \
postconf -e "mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 $POSTFIX_MYNETWORKS" && \
postconf -e milter_default_action=accept && \
postconf -e milter_protocol=2 && \
postconf -e smtpd_milters=inet:mail-dkim:8891 && \
postconf -e non_smtpd_milters=inet:mail-dkim:8891 && \
touch /var/log/mail.log
CMD service rsyslog start && service postfix start && tail -f /var/log/mail.log
Сборка образов и создание контейнеров
Запускаем сборку и стартуем наши сервисы. Во время сборки mail-dkim будет выведен открытый ключ, который нужно скопировать и вставить в соответствующую TXT запись вашего домена:
cd /www/dc-mail/ && docker-compose up
Если всё успешно запустилось и ошибок нет, нажимаем Ctrl-C и переходим к настройке автозапуска.
Автозапуск контейнеров в конфигурации docker-compose
Создаем и редактируем файл запуска в init.d. Команды к сервису start|stop будут передаваться в docker-compose:
nano /etc/init.d/dc-mail
#! /bin/sh
# /etc/init.d/dc-mail
### BEGIN INIT INFO
# Provides: dc-mail
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: dc-mail
# Description: docker-compose mail
### END INIT INFO
PATH=/sbin:/bin
DAEMON=/usr/local/bin/docker-compose
CHDIR=/www/mail
test -x $DAEMON || exit 0
cd $CHDIR && $DAEMON $@
Данный скрипт нуждается в дополнении по вашим требованиям.
Регистрируем сервис:
update-rc.d dc-mail defaults
Запускаем:
service dc-mail start
Проверяем состояние
Переходим в директорию docker-compose:
cd /www/dc-mail/
Смотрим процессы:
docker-compose ps
Смотрим логи:
docker-compose logs
Полное описание команд и параметров конфигурации — тема для отдельной статьи. Все необходимое есть в очень подробном виде на официальном сайте Docker.
Заключение
В результате мы имеем набор сервисов, который обеспечивает высылку транзакционных писем с подписью. Это существенно повысит вероятность доставки ваших сообщений получателям и поможет подтвердить подлинность вашего письма в случае возникновения различных споров. Отдельно стоит отметить, что это не способ бесконтрольной отправки спама, ведь вы можете подписать только принадлежащий вам домен и тем самым, наоборот, защищаете свой домен от использования в спам рассылках и фишинге.
Отправляйте свои сообщения правильно, чтобы не пришлось просить клиентов проверять папку SPAM. Также не забудьте настроить политики DMARC и SPF.
В статье использованы материалы официальных руководств:
- Docker - https://docs.docker.com/
- Postfix - http://www.postfix.org/
- OpenDKIM - http://www.opendkim.org/
tglnkDocker
Войдите в службу, чтобы оставить комментарий.
Комментарии
1 комментарий