воскресенье, 29 декабря 2019 г.

Решение проблемы с SSL/TLS в Sylpheed

На рабочем компьютере решил обновить Debian с релиза Stretch до Buster и столкнулся с проблемой: при попытке проверить почту Sylpheed на POP3-сервере вылетает окно с ошибкой:

Если попытаться запустить Sylpheed через окно терминала, можно увидеть чёть больше подробностей:
$ sylpheed 

(sylpheed:7387): LibSylph-WARNING **: 15:42:26.003: SSL_connect() failed with error 1, ret = -1 (error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol)


(sylpheed:7387): LibSylph-WARNING **: 15:42:26.003: can't start TLS session.


(sylpheed:7387): LibSylph-WARNING **: 15:42:26.004: [15:42:26] Сбой сокета.
Как видно, POP3-сервер не поддерживает требуемую версию протокола SSL/TLS.

В прошлом мне уже приходилось разбираться с подобной проблемой при отправке уведомлений из Zabbix на сервер Jabber: Пересборка libiksemel для решения проблемы JABBER tls handshake failed в Zabbix. В этот раз я попробовал пойти тем же путём, установил утилиту командной строки gnutls-cli-debug и воспользоваться ей для проверки возможностей Jabber-сервера.

Устанавливаем пакет gnutls-bin:
# apt-get install gnutls-bin
Вызываем утилиту для получения списка возможностей Jabber-сервера:
$ gnutls-cli-debug -p 995 mail.server.ru
Утилита выводит следующую информацию:
GnuTLS debug client 3.6.7
Checking mail.server.ru:995
                        whether we need to disable TLS 1.2... no
                        whether we need to disable TLS 1.1... no
                        whether we need to disable TLS 1.0... no
                        whether %NO_EXTENSIONS is required... no
                               whether %COMPAT is required... no
                             for TLS 1.0 (RFC2246) support... yes
                             for TLS 1.1 (RFC4346) support... no
                                  fallback from TLS 1.1 to... TLS 1.0
                             for TLS 1.2 (RFC5246) support... no
                             for TLS 1.3 (RFC8446) support... no
|<1>| FFDHE groups advertised, but server didn't support it; falling back to server's choice
                       TLS1.2 neg fallback from TLS 1.6 to... TLS1.0
                                     for HTTPS server name... unknown
                               for certificate chain order... sorted
                  for safe renegotiation (RFC5746) support... yes
                    for encrypt-then-MAC (RFC7366) support... no
                   for ext master secret (RFC7627) support... no
                           for heartbeat (RFC6520) support... no
                       for version rollback bug in RSA PMS... no
                  for version rollback bug in Client Hello... no
            whether the server ignores the RSA PMS version... no
whether small records (512 bytes) are tolerated on handshake... yes
    whether cipher suites not in SSL 3.0 spec are accepted... yes
whether a bogus TLS record version in the client hello is accepted... yes
         whether the server understands TLS closure alerts... yes
            whether the server supports session resumption... no
                      for anonymous authentication support... no
|<1>| FFDHE groups advertised, but server didn't support it; falling back to server's choice
                      for ephemeral Diffie-Hellman support... yes
|<1>| FFDHE groups advertised, but server didn't support it; falling back to server's choice
                        for RFC7919 Diffie-Hellman support... no
                   for ephemeral EC Diffie-Hellman support... no
                             for curve SECP256r1 (RFC4492)... no
                             for curve SECP384r1 (RFC4492)... no
                             for curve SECP521r1 (RFC4492)... no
                                for curve X25519 (RFC8422)... no
                      for AES-GCM cipher (RFC5288) support... no
                      for AES-CCM cipher (RFC6655) support... no
                    for AES-CCM-8 cipher (RFC6655) support... no
                      for AES-CBC cipher (RFC3268) support... yes
                 for CAMELLIA-GCM cipher (RFC6367) support... no
                 for CAMELLIA-CBC cipher (RFC5932) support... yes
                     for 3DES-CBC cipher (RFC2246) support... yes
                  for ARCFOUR 128 cipher (RFC2246) support... yes
            for CHACHA20-POLY1305 cipher (RFC7905) support... no
                                       for MD5 MAC support... yes
                                      for SHA1 MAC support... yes
                                    for SHA256 MAC support... no
                     for max record size (RFC6066) support... no
                for OCSP status response (RFC6066) support... no
Сервер POP3 не поддерживает новейшие версии протокола TLS1.2 и TLS1.1, но поддерживает TLS1.0. Видимо почтовый клиент пытается использовать более безопасную версию протокола и не соглашается на TLS1.0.

Решение проблемы несколько затянулось, т.к. первоначально я пошёл по ложному следу. Попробовал удалить сначала пакет openssl, а потом libgnutls30. Пакет sylpheed попадал в список удаляемых пакетов лишь во втором случае. На самом деле sylpheed зависел не от библиотеки libgnutls30, а от библиотеки libssl1.1. Для изменения настроек OpenSSL, которые используются по умолчанию, оказалось достаточно поправить файл /etc/ssl/openssl.cnf.

В файле были прописаны такие настройки:
[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2
Для того, чтобы sylpheed успешно подключился к почтовому серверу, оказалось достаточно поменять минимальный требуемый протокол, вот так:
[system_default_sect]
MinProtocol = TLSv1.0
CipherString = DEFAULT@SECLEVEL=2

воскресенье, 22 декабря 2019 г.

Использование quilt для подготовки заплат

В прошлом я уже описывал несколько заплаток, которые накладываю на Zabbix для решения различных проблем:
Кроме этих описанных заплаток имеется ещё несколько специфичных заплаток, которые сделаны для интеграции Zabbix со сторонними системами и нигде не описаны, т.к. вряд-ли кого-то заинтересуют.

Кроме того, накладывать заплатки приходится не только на сам Zabbix, но и на связанные с ним библиотеки:
Правки приходится делать в разных пакетах, не только связанных непосредственно с Zabbix, из-за чего я даже завёл репозиторий для доработанных пакетов. В заметке Создание своего репозитория Debian при помощи aptly можно найти ещё несколько примеров доработанных пакетов, доработке некоторых из которых были посвящены отдельные заметки.

Количество специфичных заплаток для Zabbix, с которыми приходится работать, со временем только увеличивается. Если aptly помогает упорядочить работу с большим количеством нестандартных пакетов, то quilt помогает упорядочить работу с большим количеством заплаток одного и того же пакета.

quilt формирует из заплаток стек, позволяя легко вносить обновления в любую из заплаток стека. Для обновления заплатки, погребённой под более поздними, можно отменить изменения, вносимые в исходный код заплатками, лежащими сверху, внести изменения в исходный код, обновить текущую заплатку, а потом снова наложить на код все вышележащие заплатки.

Ниже кратко описаны основные команды quilt, которые могут пригодиться для управления заплатками.

Создаём новую заплатку:
$ quilt new patch permit-edit-maintainances
Добавляем в заплатку файлы, которые собираемся менять:
$ quilt add frontends/php/maintenance.php
$ quilt add frontends/php/include/classes/api/services/CMaintenance.php
Посмотреть список файлов, содержимое которых будет отслеживаться в заплате, можно при помощи команды:
$ quilt files
Чтобы изменения в файлах не отслеживались в заплате, можно воспользоваться такой командой:
$ quilt remove config.guess config.sub database/mysql/create.sql database/postgresql/create.sql database/sqlite3/create.sql
Редактируем файлы:
$ vim frontends/php/maintenance.php
$ vim frontends/php/include/classes/api/services/CMaintenance.php
Посмотреть получившуюся заплатку можно при помощи следующей команды:
$ quilt diff
Сохранить получившуюся заплатку в каталог debian/patches можно при помощи следующей команды:
$ quilt refresh
Список всех заплаток можно посмотреть при помощи команды:
$ quilt series
Текущая редактируемая заплата в выведенном списке будет подсвечена.

При необходимости редактировать не последнюю заплатку, можно перемещаться по списку заплат. Для перемещения по списку на предыдущую заплату можно воспользоваться командой:
$ quilt pop
Для применения текущей заплаты и для перехода к следующей по списку можно воспользоваться командой:
$ quilt push

воскресенье, 15 декабря 2019 г.

OpenSMTPd как локальный SMTP-ретранслятор

В прошлом я писал заметки Postfix как локальный SMTP-ретранслятор и Postfix как локальный SMTP-ретранслятор во FreeBSD, в которых описывал настройку Postfix для пересылки писем администратору системы.

К списку самых распространённых полноформатных SMTP-серверов для Unix, в который входят Sendmail, Exim, Postfix и, с некоторой натяжкой, qmail, присоединился ещё один - OpenSMTPd. Этот сервер был разработан в рамках проекта OpenBSD и по архитектуре напоминает Postfix и qmail: он тоже состоит из нескольких отдельных взаимодействующих друг с другом процессов.

OpenSMTPd появился в репозиториях Debian и я решил попробовать настроить его в качестве замены Postfix из указанных выше статей. Первым делом установим OpenSMTPd из пакетов:
# apt-get install opensmtpd
Приводим файл конфигурации /etc/smtpd.conf к следующему виду:
listen on lo

table aliases file:/etc/aliases
table secrets file:/etc/secrets

accept from local for local virtual <aliases> deliver to mbox
accept from local for any relay via tls+auth://user@mail.server.net:25 auth  as "user@server.net"
В файл /etc/aliases прописываем переадресации для получателей писем:
postmaster: root
root: admin@domain.tld
В файл /etc/secrets прописываем пароли для учётных записей:
user password
Имя user должно совпадать с указанным в URL релея tls+auth://user@mail.server.net:25.

Поменяем права доступа к созданным файлам:
# chown root:root /etc/aliases /etc/secrets /etc/smtpd.conf
# chmod u=rw,go=r /etc/aliases /etc/smtpd.conf
# chmod u=rw,go= /etc/secrets
Проверить правильность файла конфигурации можно при помощи следующей команды:
# smtpd -n
Запускаем почтовый сервер:
# systemctl restart opensmtpd
При редактировании файлов, указанных в опциях table, нужно сообщить об изменении демону, чтобы он перечитал содержимое таблиц. Например, после редактирования таблицы aliases нужно воспользоваться такой командой:
# smtpctl update table aliases
К сожалению, пока что в OpenSMTPd нельзя менять тему писем таким же образом, как это было описано в заметке Смена темы письма в Postfix. У Postfix простой файл конфигурации, но большое количество настроек, взаимодействующих между собой неочевидным образом. В этом плане OpenSMTPd выглядит достойной альтернативой, т.к. сочетает простоту и наглядность настройки с безопасной архитектурой.

Использованные материалы: