Каков правильный формат файла postfix sasl password database map?

можно запросить postfix, чтобы получить информацию для входа sasl для его сервера ретрансляции из базы данных. Затем у меня есть этот сервер ретрансляции, который получает ту же самую информацию для входа.

откуда у нас этот формат конфигурационного файла, чтобы правильно принести?

мы знаем эту информацию:

  1. доменное имя реле.
  2. имя пользователя почтового ящика.
  3. доменное имя на сервере postfix (может быть более чем один.)

теперь текстовый файл, содержащий только пароли, будет отформатирован следующим образом (в строке), предполагая mailbox посылает от domain2 С помощью пароля mailpass:

smtp.relay.tld mailbox@domain2.tld:mailpass

Я проверил, что метод открытого текстового файла работает для определенного пользователя и пароля в базе данных. Теперь я хочу использовать a .cf файл для подключения к базе данных.

дана таблица доменов такой1:

+----+----------+-------------+----------+
| id | username |   domain    | password |
+----+----------+-------------+----------+
|  1 | mailbox  | domain2.tld | mailpass |
+----+----------+-------------+----------+

In общий, такой файл был бы отформатирован так;

user = sqluser
password = dbpass
hosts = localhost
dbname = maildb
query = SELECT password FROM accounts WHERE username = '%u' AND domain = '%d'

Я не уверен, что именно поставить в параметре "query". Официальная документация на него довольно плохая: в ней говорится, что вы можете настроить с помощью базы данных sql, она не указывает, как вообще, никаких конкретных примеров не приводится.

теперь я попытался использовать наивный подход; создайте запрос, который просто возвращает значение точно так же, как строка в текстовом файле. Я также попытался вернуть различные подмножества линия, без успеха. Каждая попытка просто создает ошибку" доступ запрещен".

1: я знаю, что хранение паролей фактического пользователя в базе данных таким образом является плохая идея. Пароли, используемые здесь, просто для связи между двумя определенными серверами.

причиной использования базы данных является сочетание переносимости и масштабируемости. Е. Г. МФЛ домена хочет использовать несколько почтовых серверов, или перейти к другому поставщику услуг электронной почты. Причина не просто использовать один пароль, чтобы иметь возможность отделить проблемы (каждый пользователь имеет отдельный пароль реле настроен, который они сами не знают, но постфиксный пользователь на каждом почтовом сервере знает, глядя в определенной таблице базы данных. Это механизм, сравнимый с keystone openstack, хотя и гораздо менее сложный).

еще немного покопаться: включение ведения журнала уровня L4 и просмотр транскрипта соединения сервера, это кажется, никогда не отправляет сообщение AUTH (так что даже не выясняет, как "найти" пользователя). Следующие сообщения могут быть найдены в журнале почты (с доменными именами и т. д. отредактировано);

postfix/smtp[6494]: maps_find: smtp_sasl_password_maps: smtp.relay.tld: not  found
postfix/smtp[6494]: maps_find: smtp_sasl_password_maps: smtp.relay.tld:587:  not found
postfix/smtp[6494]: smtp_sasl_passwd_lookup: no auth info found 
(sender=`user@domain.tld', host=`smtp.relay.tld')

тем не менее, выполнение этой команды:

postmap -q user@domain.tld mysql:/etc/postfix/mysql-map.cf

производит

smtp.relay.tld user@domain.tld:mailpass 

другими словами, конфигурация работает, но postfix программа делает какой-то странный запрос, чтобы выудить пароль из базы данных, а его нигде нет указано, что это на самом деле, и не регистрируется.

9
задан aphid
23.11.2022 18:55 Количество просмотров материала 3483
Распечатать страницу

2 ответа

необходимы две вещи:

первый вариант smtp_sender_dependent_authentication = yes должно быть включено в главном конфигурационном файле postfix (обычно /etc/postfix/main.cf). Без этой опции сервер будет искать только на основе доменного имени хоста ретрансляции, которое было бы тем же для каждого пользователя.

во-вторых, правильный запрос должен выглядеть так:

query = SELECT CONCAT(username, "@", domain, ":", password) FROM accounts \
        WHERE username = '%u' AND domain = '%d'

Примечание: конфигурационные файлы не поддерживают многострочный таким образом; поэтому удалите \ и newline

1
отвечен aphid 2022-11-25 02:43

просто делаю дикое предположение (я не смешивал Postfix & SQL), но вот с чего бы я начал:

  1. "локальная часть" адреса электронной почты не становится автоматически "имя пользователя" для проверки подлинности ретрансляции. Так хоть базы данных они оба идентичны, Postfix не может сделать это предположение автоматически, поэтому поле имени пользователя должен быть возвращен в любом случае.

  2. все Постфиксные таблицы поиск выполняется аналогичным образом: один ввод приводит к одному выходу, а ядро Postfix фактически не заботится о том, поддерживает ли конкретный сервер таблицы несколько столбцов или нет. Я думаю, что он ожидает одну строку и анализирует его одинаково во всех случаях.

согласно пункту № 2, Если в таблице хранятся открытым текстом mailbox@domain2.tld:mailpass, тогда SQL запрос должен быть и возвращает один столбец отформатирован таким же образом. Поэтому я бы попробовал это:

query = SELECT CONCAT(username, ":", password) FROM accounts WHERE username = '%u' AND domain = '%d'

но если это не так, то два отдельных столбца должны работать:

query = SELECT username, password FROM accounts WHERE username = '%u' AND domain = '%d'
0
отвечен grawity 2022-11-25 05:00

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх