Поиск пользователя Dovecot не выполняется при использовании формата username@domain

У меня Dovecot v2.0.11 установлен на сервере FreeBSD, и поиск пользователя по входящим адресам электронной почты не выполняется, но поиск пользователей системы успешен.

Dovecot настроен для использования системными пользователями, поэтому мой dovecot.conf имеет

 userdb {
  driver = passwd
}

а также

passdb {
  driver = passwd
}

У меня включена авторизация отладки.

Например, у меня есть пользователь с именем webmaster, и использование пользователя doveadm для "webmaster" работает следующим образом:

#doveadm user webmaster
userdb: webmaster
  system_groups_user: webmaster
  uid       : 1020
  gid       : 1020
  home      : /home/webmaster

Однако использование пользователя doveadm для поиска webmaster@myregisteredname.com завершается неудачно следующим образом:

# doveadm user webmaster@myregisteredname.com
userdb lookup: user webmaster@myregisteredname.com doesn't exist

Это приводит к тому, что webmaster@myregisteredname.com получает входящую почту с ошибкой "неизвестный пользователь".

Вот ошибка, зарегистрированная в /var/log/maillog:

Apr 16 20:13:35 www dovecot: auth: passwd(webmaster@myregisteredname.com): unknown user

Вот ошибка, зарегистрированная в /var/log/debug.log:

Apr 16 20:13:35 www dovecot: auth: Debug: master in: USER       1       webmaster@myregisteredname.com  service=doveadm
Apr 16 20:13:35 www dovecot: auth: Debug: passwd(webmaster@myregisteredname.com): lookup
Apr 16 20:13:35 www dovecot: auth: Debug: master out: NOTFOUND  1

Пользователи и их домашние каталоги были импортированы с другого сервера, и пользователи были настроены с помощью инструмента vipw. Я уверен, что есть кое-что, что я пропустил в импорте, который не "связывает" системного пользователя с поиском dovecot.

Есть идеи о том, что это может быть?

РЕДАКТИРОВАТЬ: Используя советы BillThor, я обновил dovecot.conf следующим образом:

#doveconf -n passdb userdb
passdb {
  args = username_format=%n
  driver = passwd
}
userdb {
  args = username_format=%n
  driver = passwd
}

Однако теперь пользователь doveadm не работает по-другому:

#doveadm user webmaster@pantronx.com
doveadm(root): Error: userdb lookup(webmaster@myregisteredname.com): Disconnected unexpectedly
doveadm(root): Fatal: userdb lookup failed for webmaster@myregisteredname.com

И это больше не работает для пользователей без домена:

#doveadm user webmaster
doveadm(root): Error: userdb lookup(webmaster): Disconnected unexpectedly
doveadm(root): Fatal: userdb lookup failed for webmaster

Когда я получаю вышеупомянутые сообщения, следующее находится в /var/log/maillog:

Apr 17 17:30:02 www dovecot: auth: Fatal: passdb passwd: Unknown setting: username_format=%u
Apr 17 17:30:02 www dovecot: master: Error: service(auth): command startup failed, throttling

5 ответов

Решение

Идентификаторы в dovecot, использующие passdb, не включают домен. ИД пользователя, который должен использовать пользователь, является локальной частью, а не полным адресом электронной почты.

Проверки, которые проходят и терпят неудачу, работают как ожидалось. настройка auth_username_format=%n прежде чем определение базы данных пароля работает. Домен не проверен, хотя.

Я использую Ubuntu Server 12.04 и попробовал вышеуказанные решения. Тем не менее, я обнаружил, что самый простой и легкий способ был в 10-auth.conf установить

auth_username_format = %n

Я использую PAM для аутентификации, которая используется по умолчанию в Ubuntu 12.04.

auth_username_format = %n

разбивает виртуальные домены на одном сервере, лучше использовать условное (должно работать с версии 2.2.33)

(см.: https://doc.dovecot.org/configuration_manual/config_file/config_variables/ )

я использую:

auth_username_format=%{if;%d;eq;hostname.startdedicated.de;%Ln;%Lu}

который работает нормально. Однако вы можете использовать %n вместо %Ln и %u вместо %Lu, если вы используете имена пользователей в верхнем или нижнем регистре. измените имя хоста.startdedicated.de на полное имя хоста вашего сервера.

Я подозреваю, что Dovecot 2.1 либо сломал это решение, либо изменил ожидаемое поведение.

Я проследил ту же ошибку авторизации для userdb:

userdb {
  driver = passwd
}

Когда локальный пользователь (не виртуальный) получает электронную почту через exim->lmtp, он включает домен. Определение auth_username_format=%Ln исправляет локальную доставку, но нарушает виртуальную доставку. Предлагаемое исправление добавления args = username_format, похоже, игнорируется:

userdb {
  driver = passwd
  args = username_format=%n
}

и журналы включают в себя предупреждение

Apr  4 11:24:57 moe dovecot: auth: Warning: userdb passwd: Move templates args to override_fields setting

Интересно, что использование passwd-файла работает, но auth недоволен тем, что файл passwd принадлежит root.

userdb {
  driver = passwd-file
  args = username_format=%n /etc/passwd
}

Apr  4 11:26:12 moe dovecot: auth: Error: passwd-file /etc/passwd: User root has invalid UID '0'
Apr  4 11:26:12 moe dovecot: auth-worker(6855): Error: passwd-file /etc/passwd: User root has invalid UID '0'

passwd-file: Unknown setting: username_formatДля меня причиной было дополнительное пространство:

passdb {
  driver = passwd-file
  args = scheme=SHA256-CRYPT **extra-space-here**username_format=%u /etc/dovecot/users
}

то есть у меня было два пробела между CRYPT и uesrname.

Другие вопросы по тегам