Установка почтового сервера Postfix и Dovecot на Debian 10 Buster

Недавно разбирался как поднять почтовый сервер на Postfix в связке с Dovecot, для памяти опишу как поднять такой сервер на Debian 10. Все действия ниже будут выполняться от root.

 

Настройка DNS записей

# Добавляем DNS-записи для вашего почтового сервера:

@           MX  10  mail.example.com.
mail        A   192.168.1.10

 

Настройка системы

# Задаем имя системы (mail) в файле (/etc/hostname):

echo mail > /etc/hostname

# Указываем в файле (/etc/hosts) строку содержащую IP-адрес с полным доменным именем (FQDN).

127.0.0.1       localhost
192.168.1.10    mail.example.com mail
ИНФОРМАЦИЯ: В приведенном выше примере 192.168.1.10 — это IP-адрес машины, mail — это имя локального хоста, а mail.example.com это полное доменное имя.

 

Настройка MySQL

Данные о пользователях почтового сервера (адреса электронной почты), доменах и псевдонимах будут хранится в базе данных MySQL.

 

# Устанавливаем MySQL сервер.

apt-get install mariadb-server -y

# Выполняем базовую настройку безопасности MySQL сервера и входим на сервер.

mysql_secure_installation

mariadb

 

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

CREATE DATABASE postfix;
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'postfix';
GRANT SELECT ON postfix.* TO 'postfix'@'localhost';
FLUSH PRIVILEGES;

# Переключаемся на созданную базу данных, для создания необходимых таблиц.

use postfix;

# Создаем таблицу для доменов, которые будут получать почту:

CREATE TABLE `virtual_domains` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
);

# Создаем таблицу для всех адресов электронной почты и паролей:

CREATE TABLE `virtual_users` (
  `id` int(11) NOT NULL auto_increment,
  `domain_id` int(11) NOT NULL,
  `password` varchar(106) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`),
  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
);

Читать далее

Установка библиотеки JSON-C из исходников на Debian 10 Buster

# Устанавливаем необходимые пакеты зависимостей. Все действия ниже будут выполняться от root.

apt-get install gcc g++ make cmake pkg-config git doxygen valgrind -y

# Скачиваем исходник (оф. репозиторий json-c — https://github.com/json-c/json-c#installprereq), раскаковываем его и переходим в распакованный каталог.

cd /opt
git clone https://github.com/json-c/json-c.git

cd json-c/
mkdir build && cd build

# Конфигурирование сборки.

../cmake-configure --prefix=/usr

# Собираем и устанавливаем пакет.

make && make test
make install

Читать далее

Установка Python 3.9 из исходников на Debian 10 Buster

# Устанавливаем необходимые пакеты зависимостей. Все действия ниже будут выполняться от root.

apt-get update && apt-get upgrade -y
apt-get install apt-get install gcc g++ make libffi-dev libnss3-dev libssl-dev zlib1g-dev

# Скачиваем исходник, раскаковываем его и переходим в распакованный каталог (на момент написания статьи версия 3.9.14).

cd /opt/
wget https://www.python.org/ftp/python/3.9.14/Python-3.9.14.tgz
tar -zxvf Python-3.9.14.tgz
cd Python-3.9.14

# Выполняем конфигурирование.

mkdir build && cd build
../configure --prefix= --enable-optimizations

# Собираем и устанавливаем пакет.

make
make install

Читать далее

Установка ClamAV из исходников на Debian 10 Buster

# Устанавливаем необходимые пакеты зависимостей. Все действия ниже будут выполняться от root.

apt-get install -y gcc g++ make pkg-config valgrind check libbz2-dev libcurl4-openssl-dev libjson-c-dev libmilter-dev libncurses5-dev libpcre2-dev libssl-dev libxml2-dev zlib1g-dev

# Создаем сервисный аккаунт от которого будут работать службы (freshclam, clamd).

groupadd clamav && useradd -g clamav -s /bin/false -c "Clam Antivirus" clamav

 

# Скачиваем исходник, раскаковываем его и переходим в распакованный каталог (на момент написания статьи LTS версия 0.103.7).

cd /opt

wget https://www.clamav.net/downloads/production/clamav-0.103.7.tar.gz
tar -zxvf clamav-[ver].tar.gz
cd clamav-[ver]
ИНФОРМАЦИЯ: оф. страница https://www.clamav.net/downloads не доступна из РФ, поэтому скачиваем исходник через VPN.

 

# Создаем «build» подкаталог и переходим в него.

mkdir build && cd build
ИНФОРМАЦИЯ: Это позволит легко удалить файлы сборки, если что-то пойдет не так и потребуется перенастроить и повторить попытку.

 

# Конфигурирование сборки.

../configure --prefix=/usr --sysconfdir=/etc/clamav --with-dbdir=/var/lib/clamav --with-libjson=/usr/lib/x86_64-linux-gnu/libjson-c.a --enable-milter
ИНФОРМАЦИЯ: Разработчики рекомендуют уставноку со статической библиотекой json-c  (—with-libjson-static), но для этого необходима установленная libjson-c версии 0.15 или новее.

Статья как установить актуальную версию библиотеки json-c — https://sysos.ru/?p=735

 

# Собираем и устанавливаем пакет.

make
make check VG=1
make install

Читать далее

Установка Let’s Encrypt SSL-сертификата в Zimbra Collaboration 8.X.

На тот случай когда по тем или иным причинам нет возможности купить сертификат, мы разберем как выпустить и установить Let’s Encrypt SSL-сертификат в Zimbra Collaboration 8.X..

 

Установим пакет для запросов сертификатов Let’s Encrypt:

apt-get install certbot -y

 

Перед тем как выпустить сертификат, выполним тестовый выпуск сертификата :

certbot certonly --dry-run --standalone -d mail.contoso.com

Если все хорошо и ошибок нет, то выпускаем сертификат:

certbot certonly --standalone -d mail.contoso.com

В процессе будет запрошен email администратора (указываем свой) и пара вопросов на которые отвечаем утвердительно.

Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): admin@contoso.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

 

Переходим в каталог letsencrypt с нашим доменом (/etc/letsencrypt/live/$DOMAIN/), скачаем корневые сертификаты от Let’s Encrypt и сформируем корректную цепочку сертификатов, чтобы Zimbra ее приняла:

cd /etc/letsencrypt/live/$DOMAIN/

wget -4 -O /etc/letsencrypt/live/$DOMAIN/isrgrootx1.pem https://letsencrypt.org/certs/isrgrootx1.pem.txt
wget -4 -O /etc/letsencrypt/live/$DOMAIN/letsencryptauthorityx3.pem https://letsencrypt.org/certs/letsencryptauthorityx3.pem.txt

cat /etc/letsencrypt/live/$DOMAIN/isrgrootx1.pem > /etc/letsencrypt/live/$DOMAIN/zimbra_chain.pem
cat /etc/letsencrypt/live/$DOMAIN/letsencryptauthorityx3.pem >> /etc/letsencrypt/live/$DOMAIN/zimbra_chain.pem
cat /etc/letsencrypt/live/$DOMAIN/chain.pem >> /etc/letsencrypt/live/$DOMAIN/zimbra_chain.pem

Читать далее

Шифрование по ГОСТ Р 34.10-2012 в OpenSSL 1.1.1 на Debian 10 Buster

Опишу для памятки как реализовать поддержку шифрования по ГОСТ Р 34.10-2012 (GOST2012) в OpenSSL 1.1.1 на Debian 10 Buster.

Реализация криптоалгоритмов российского ГОСТа для OpenSSL — https://github.com/gost-engine/engine

 

Устанавливаем необходимые зависимости для сборки пакетов:

apt-get install g++ gcc make

 

Установка OpenSSL

Скачиваем исходники, распаковываем их:

wget https://www.openssl.org/source/openssl-1.1.1p.tar.gz
tar -zxvf openssl-1.1.1p.tar.gz
cd openssl-1.1.1p

Собираем пакет и устанавливаем его:

./config --prefix=/usr/ssl --openssldir=/usr/ssl
make all
make install
cd ..

Вносим изменения чтобы по умолчанию использовалась установленная версия:

rm /usr/bin/openssl
ln -s /usr/ssl/bin/openssl /usr/bin/openssl
echo "/usr/ssl/lib" >> /etc/ld.so.conf.d/ssl.conf
ldconfig

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

openssl version -v
OpenSSL 1.1.1p  21 Jun 2022

 

Установка Cmake

Для корректной сборки gost-engine, установим последнюю (на момент написания статьи) версию cmake.

 

Устанавливаем необходимые зависимости:

apt-get install git libssl-dev

Скачиваем исходники, распаковываем их:

wget https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2.tar.gz
tar -zxvf cmake-3.23.2.tar.gz
cd cmake-3.23.2

Собираем пакет и устанавливаем его:

./bootstrap --prefix=/usr
make
make install
cd ..

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

cmake --version
cmake version 3.23.2

Читать далее

Исправление истекшего срока действия ключа public key для packages.sury.org на Debian 10 Buster.

В один прекрасный момент при попытке обновить пакеты php через репозиторий packages.sury.org получил ошибку недействительного публичного ключа для packages.sury.org^

Нет доверия сертификату для «packages.sury.org». ОШИБКА: Срок действия сертификата «packages.sury.org» истёк.

apt-get update

Hit:1 http://deb.debian.org/debian buster InRelease
Hit:2 http://security.debian.org/debian-security buster/updates InRelease
Hit:3 http://deb.debian.org/debian buster-updates InRelease
Get:4 https://packages.sury.org/php buster InRelease [6837 B]
Err:4 https://packages.sury.org/php buster InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B188E2B695BD4743
Hit:5 https://repo.zabbix.com/zabbix/5.4/debian buster InRelease
Reading package lists... Done
W: GPG error: https://packages.sury.org/php buster InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B188E2B695BD4743
E: The repository 'https://packages.sury.org/php buster InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

Чтобы это исправить, выполняем команды ниже:

sudo rm -rf /etc/apt/trusted.gpg.d/php.gpg
sudo apt-key del B188E2B695BD4743
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

Для проверки обновляем данные по репозиториям:

apt-get update

 

В случае если в ходе обновления ключей возникают ошибки, то скорей всего какой то из ниже пакетов отсутствует в системе:

apt-get install -y gnupg2 ca-certificates lsb-release apt-transport-https

Читать далее

Как удалить пакет после «make install» в deb-like Linux системах.

Столкнулся с таким вопросом — как удалить пакет собранный из исходников и установленный make install.

Для памятки оставлю для метода как это сделать, все ниже действия производится на Debian 10 (более чем уверен что все описанное ниже будет применимо для всех deb-like Linux систем).

 

Метод #1 (make uninstall)

В случае если каталог сборки не был удален, то можно попробовать выполнить удаление, командой:

cd $SOURCE_DIR 
sudo make uninstall

В случае если каталог сборки был удален, то можно загрузить его по новой, выполнить сборку (make) и удалить пакет методом #2.

 

Метод #2 (install_manifest.txt)

Если файл install_manifest.txt существует в вашем исходном каталоге, он должен содержать имена файлов каждого отдельного файла, созданного установкой.

Сначала проверяем список файлов и время их обновления:

cd $SOURCE_DIR 
sudo xargs -I{} stat -c "%z %n" "{}" < install_manifest.txt

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

 

Если все в порядке, то собираем файлы в один каталог для удаления:

cd $SOURCE_DIR 
mkdir deleted-by-uninstall
sudo xargs -I{} mv -t deleted-by-uninstall "{}" < install_manifest.txt

Читать далее

Установка chan_sccp на Asterisk 18 + FreePBX на Debian 10.

Для памятки опишу как установить модуль chan_sccp в FreePBX на базе Asterisk 18.

Описывать конфиги и настройку не буду (по крайней мере на момент написания статьи), вся исчерпывающая информация тут — https://github.com/chan-sccp

 

Устанавливаем необходимые для успешной сборки пакеты и скачиваем chan_sccp:

apt-get install git build-essential make install-headers -y

cd /opt/
git clone https://github.com/chan-sccp/chan-sccp.git chan-sccp
cd /opt/chan-sccp

Посмотрим какая версия Asterisk установлена, чтобы для нее сконфигурировать chan_sccp:

asterisk -rx "core show version"

Конфигурируем, компилируем и устанавливаем:

./configure --with-asterisk-version=18.7
make
make install

 

После установки обязательно отключаем модуль chan_skinny.so и включаем chan_sccp.so в GUI FreePBX в модули Asterisk.

Читать далее

Не доставляются письма lmtp — Not delivering message with duplicate Message-ID. Zimbra Collaboration 8.X.

В работе использую Piler в связке с Zimbra Collaboration и обнаружился интересный момент, что при восстановлении письма из Piler, оно не появляется в пользовательском ящике, при этом в логе mailbox.log фигурирует сообщение:

2022-06-15 11:45:08,794 INFO  [LmtpServer-260] [ip=10.0.13.46;] lmtp - Delivering message: size=37579 bytes, nrcpts=1, sender=no-reply@piler.сontoso.local, msgid=<348759297.2300854.1655279223734.JavaMail.zimbra@mail.сontoso.com>
2022-06-15 11:45:08,794 INFO  [LmtpServer-260] [name=test@сontoso.com;mid=89;ip=10.0.13.46;] lmtp - Not delivering message with duplicate Message-ID <348759297.2300854.1655279223734.JavaMail.zimbra@mail.сontoso.com>

 

Это случается когда LMTP получает одно и то же сообщение для одного и того же пользователя дважды за короткий промежуток времени, он удаляет вторую копию — все это происходит в памяти. Сервер сохранит это количество пар Получатель — Идентификатор сообщения в карте FIFO (first in, first out), отбрасывая любые дубликаты, которые он видит. Это можно отключить, выполнив команду:

su - zimbra -c "zmprov mcf zimbraMessageIdDedupeCacheSize 0"
ИНФОРМАЦИЯ. Для нормальной работы значение zimbraMessageIdDedupeCacheSize по умолчанию равно 3000.

 

Отобразить текущее значение, можно командой:

su - zimbra -c "zmprov gcf zimbraMessageIdDedupeCacheSize"

Читать далее