Как настроить DKIM и SPF в Postfix

Краткая инструкция по настройке DKIM/SPF для домена example.com. Нужно это для того, чтобы снизить вероятность попадания в спам писем, отправляемых с вашего сервера.

Установим opendkim и mailutils

apt-get update
apt-get install opendkim opendkim-tools mailutils

Теперь перейдём непосредственно к настройке. Для настройки SPF необходимо создать TXT-запись следующего вида:

Хост        Указатель                    TTL
@           v=spf1 ip4:server_ip ~all    3600

server_ip — IP-адрес вашего почтового сервера, который отправляет письма.
~all означает, что письмо, которое не прошло проверку, будет отклонено.

Теперь настроим DKIM

mkdir /etc/postfix/dkim/

Создаём ключи ключи для домена example.com:

opendkim-genkey -D /etc/postfix/dkim/ -d example.com -s mail

После выполнения последней команды в каталоге /etc/postfix/dkim/ появится пара ключей — публичный и приватный для домена example.com:

Установим права на приватный ключ:

chmod 600 /etc/postfix/dkim/example.com.private

Поменяем владельца каталога:

chown -R opendkim /etc/postfix/dkim/

В опции в файле /etc/opendkim.conf необходимо внести следующие правки:

Syslog yes
Mode sv
KeyTable file:/etc/postfix/dkim/keytable
SigningTable file:/etc/postfix/dkim/signingtable

Mode sv — режим подписи и проверка подписей
KeyTable — список ключей
SigningTable — соответствие доменов и подписывающих их ключей

В файле /etc/postfix/dkim/keytable указываем данные о приватных ключах для доменов в формате имя_ключа домен:селектор:/путь/до/ключа

mail._domainkey.example.com example.com:mail:/etc/postfix/dkim/example.com.private

В файле /etc/postfix/dkim/signingtable указываются домены, которые необходимо подписывать в формате домен имя_ключа:

example.com mail._domainkey.example.com

В /etc/default/opendkim необходимо указать сокет, на котором будет opendkim. Другие настройки можно закомментировать:

SOCKET="inet:8891@localhost"

Добавляем в /etc/postfix/main.cf:

milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

Перезапускаем postfix и opendkim:

systemctl restart postfix
systemctl restart opendkim

Теперь осталось настроить DNS.

В панели управления доменом создаём TXT-запись следующего вида:

Запись                      Содержимое                               TTL
mail._domainkey             v=DKIM1; h=sha256; k=rsa; p=MII...QAB    3600

Содержимое строки p=MII…QAB берём из файла /etc/postfix/dkim/example.com.txt.

После обновления DNS, всё должно заработать.

Как проверить, что всё сделано правильно? Для проверки можно отправить тестовое сообщение на свой почтовый ящик с помощью утилиты mail:

"test message" | mail -aFrom:mail@example.com my_email@google.com

В заголовках полученного сообщения проверки SPF и DKIM должны выполниться успешно:

spf=pass
dkim=pass

Также проверить DKIM можно с помощью утилиты opendkim-testkey:

opendkim-testkey -d example.com -s mail -vvv -k /etc/opendkim/keys/mail.private

opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: checking key 'mail._domainkey.example.com'
opendkim-testkey: key not secure
opendkim-testkey: key OK

Таким образом мы получаем настроенный DKIM, что позволяет письмам доходить до получателя, а не сразу улетать в спам. 🙂

Исправляем ошибку с сертификатами для сайта Сбербанка

Краткая инструкция, как вернуть безопасный доступ к сайту Сбербанка.

Несколько дней назад заходя на сайт Сбербанка (нынче Сбер) пользователи сторонних браузеров столкнулись с проблемой небезопасного соединения в браузерах Chrome, Firefox и прочих. Произошло это по причине того, что теперь сертификат Сбербанка подписан российским удостоверяющим центром, а в перечисленных браузерах его корневого сертификата нет. Для решения проблемы можно использовать Яндекс.Браузер, а можно добавить сертификаты в свой браузер.

Например, я пользуюсь браузером Brave. Его и будем «приводить в чувства». 🙂

1. Заходим на сайт Госуслуг — https://www.gosuslugi.ru/crt. Прокручиваем страницу чуть ниже, находим кнопки «Скачать корневой сертификат» и «Скачать выпускающий сертификат«. Жмём их и получаем два файла:

russian_trusted_root_ca.cer
russian_trusted_sub_ca.cer

2. Заходим в настройки Brave: Setting -> Privacy and security. Выбираем Manage certificates, вкладку Authorities и импортируем скачанные сертификаты.

3. Вы великолепны! У вас снова работает безопасное соединение с сайтом Сбера.

По аналогии решается проблема в других браузерах. Всем удачи и безопасного серфинга в интернете. 🙂

Автозапуск упавшего сервиса в systemd

Достаточно часто бывает необходимость не позволять сервисам падать «наглухо», а рестартовать их в случае аварийного завершения. Systemd позволяет это сделать достаточно просто.

Рассмотрим в качестве примера древний сервис php5-fpm:

systemctl status php5-fpm.service
● php5-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/lib/systemd/system/php5-fpm.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2021-06-30 10:14:55 MSK; 12h ago
  Process: 9349 ExecStartPre=/usr/lib/php5/php5-fpm-checkconf (code=exited, status=0/SUCCESS)
 Main PID: 9354 (php5-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 499, slow: 0, Traffic: 0req/sec"
    Tasks: 6 (limit: 4700)
   Memory: 857.9M
   CGroup: /system.slice/php5-fpm.service
           ├─ 9354 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
           ├─ 9357 php-fpm: pool web19
           ├─ 9358 php-fpm: pool web19
           ├─ 9359 php-fpm: pool www
           ├─ 9360 php-fpm: pool www
           └─20671 php-fpm: pool www

Открываем на редактирование файл /lib/systemd/system/php5-fpm.service и видим обычное содержимое:

[Unit]
Description=The PHP FastCGI Process Manager
After=network.target

[Service] 
Type=notify
PIDFile=/var/run/php5-fpm.pid
ExecStartPre=/usr/lib/php5/php5-fpm-checkconf
ExecStart=/usr/sbin/php5-fpm --nodaemonize --fpm-config /etc/php5/fpm/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

В случае некорректного завершения его работы, он не перезапустится автоматически и сайты, которые он ещё обслуживает, будут недоступны. Чтобы сервис перезапустился автоматически, нужно в секцию Unit добавить следующий строки:

StartLimitIntervalSec=500
StartLimitBurst=5

А в секцию Service добавить:

Restart=on-failure
RestartSec=5s

После добавления нужно заставить systemd перечитать конфиги:

systemctl daemon-reload

И теперь, если сервис вдруг остановится по незапланированным причинам, в течение 5 секунд он будет перезапущен. Попыток рестарта сервиса будет 5 в течение 500 секунд и если все эти попытки закончатся неудачей, дальнейших попыток перезапуска не будет. Этого времени должно хватить сисадмину, чтобы среагировать на проблему вручную. 🙂

a2dp-sink profile connect failed

После очередного обновления системы перестали работать беспроводные наушники. Подключаться пытаются, но безуспешно. Начал разбираться, что пошло не так. 🙂

Для начала пересобрал и обновил модуль. Ошибок стало меньше, но наушники всё так же не хотели подключаться, в логах была ошибка:

bluetoothd[xxxx]: src/service.c:btd_service_connect() a2dp-sink profile connect failed for XX:XX:XX:XX:XX:XX: Protocol not available

Проблема решилась добавлением в конфиг pulseaudio /etc/pulse/default.pa загрузки модуля module-bluez5-discover:

load-module module-bluez5-discover

Перезапускаем PulseAudio:

killall pulseaudio

Подключаем наушники, в логах не видим ошибок — всё прошло успешно. 🙂

Скрипт автоматизированной компиляции ядра Linux — теперь на GitHub

Скрипт автоматизированной компиляции ядра Linux из одноимённой записи переполз в GitHub — https://github.com/alex-clumsy/linuxkernelbuilder. Также он подвергся дополнительным изменениям, которые, как мне думается, пошли ему на пользу. И в целом, я решил немного выйти из тени и поделиться своими наработками. Вдруг кому-то будут полезны. 🙂