Commit 366420ce authored by Vitaly Lipatov's avatar Vitaly Lipatov

memory: add lesson on cyrus-imapd / SASL restart on ALT

parent 70eeb184
......@@ -79,3 +79,4 @@
- [lesson_etcnet_hooks.md](lesson_etcnet_hooks.md) — etcnet ifup/ifdown хуки в `/etc/net/ifaces/<iface>/`, для зависимых интерфейсов (GRE поверх ppp0)
- [lesson_divserver_telemt_mtproxy.md](lesson_divserver_telemt_mtproxy.md) — divserver: telemt MTProxy на `0.0.0.0:443` через gre1 к 217.177.44.55 (обход блокировок Telegram)
- [lesson_dhcp_8net_dynamic_range.md](lesson_dhcp_8net_dynamic_range.md) — dhcp.office: 8/24 имеет динамический пул 8.100–8.254, 0/24 — 0.160–0.199; статика ставить вне
- [lesson_cyrus_sasl_restart.md](lesson_cyrus_sasl_restart.md) — cyrus-imapd на ALT: `serv restart` НЕ работает, нужен `systemctl restart`; SASL auxprop кэширует `sql_select` на процесс; `Hoffice` в defaultdomain — НЕ трогать; симлинк в `/var/spool/imap/domain/` опасен с autocreate
---
name: Cyrus IMAP — рестарт и кэш SASL-конфига
description: Как правильно перезапускать cyrus-imapd на ALT и почему SASL-конфиг не подхватывается без рестарта
type: reference
originSessionId: cd021fb1-adae-4fce-a705-d4739f6aa62c
---
## Рестарт cyrus-imapd на mail.etersoft.ru
`cyrus-imapd` на ALT — это **SysV init-скрипт** (`/etc/rc.d/init.d/cyrus-imapd`), обёрнутый systemd-sysv-generator.
**`serv restart cyrus-imapd` НЕ работает корректно** — выполняет лишь `systemd-sysv-install is-enabled`, master-процесс не перезапускается. При этом `systemctl status` показывает «active since Xs ago» — врёт. Проверять реальный uptime через `ps -p $(cat /var/run/cyrus-master.pid) -o etime`.
**Правильно:** `systemctl restart cyrus-imapd` напрямую.
## SASL auxprop кэширует sql_select на уровне процесса
Воркеры `imapd` из пула cyrus-master живут **долго** (наблюдал 9+ дней). SASL auxprop SQL-плагин читает `/etc/sasl2/Cyrus.conf` ОДИН РАЗ при инициализации процесса. Поэтому изменения `sql_select` в `/etc/sasl2/Cyrus.conf` или `/etc/sasl2/smtpd.conf` **не действуют** для старых воркеров — только для свежих форков.
Признак того, что воркер старый: в `/var/log/mail/all` для несуществующего пользователя пишет `authentication failure: checkpass failed` (старый запрос «нашёл» юзера) вместо корректного `user not found: checkpass failed`.
**Лечение:** `systemctl restart cyrus-imapd` после правки SASL-конфигов.
## Опасность симлинков в /var/spool/imap/domain/
На mail.etersoft.ru: `/var/spool/imap/domain/e/etersoft.ru -> /var/spool/imap/domain/o/office.etersoft.ru` (алиас на уровне ФС).
Cyrus идентифицирует ящики по имени в **mboxlist БД**, а НЕ по пути. Если пользователь логинится как `user@etersoft.ru`, а в mboxlist есть только `user@office.etersoft.ru` — Cyrus считает это новым юзером, срабатывает `autocreate_inbox` и **затирает существующие** `cyrus.header`/`cyrus.index` в спул-каталоге через симлинк. Файлы сообщений на диске сохраняются, но IMAP их «не видит» (пустой ящик в Roundcube).
Лечение конкретного ящика: `su - cyrus -s /bin/bash -c '/usr/lib/cyrus/reconstruct -r user/USER@office.etersoft.ru'` — пересобирает индекс из сообщений.
Профилактика: SASL-фикс в `sql_select` (убрать OR-клаузу, разрешающую логин `*@etersoft.ru` через подстановку пароля от `*@office.etersoft.ru`). Применено 2026-04-27 в `/etc/sasl2/Cyrus.conf` и `/etc/sasl2/smtpd.conf`. Backup: `/root/tmp/claude/sasl-backup-20260427-1351/`.
## Hoffice в defaultdomain — НЕ ТРОГАТЬ
`defaultdomain: Hoffice.etersoft.ru` в `/etc/imapd.conf` — намеренный «typo», префикс `H` гарантирует, что domain не совпадёт с доменом логина и Cyrus не будет стрипить домен из userid перед SASL. Менять на `office.etersoft.ru` — сломает аутентификацию.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment