LINUX.ORG.RU
ФорумAdmin

Знатокам Postfix. Одновременная проверка по двум параметрам.

 


0

1

Суть:

Есть динамическая табличка в sql формате (login{логин юзера},allowed_ip{с каких ip адресов он может отправлять}).

Есть postfix в котором проверяется по этой таблице возможность отправки.

Но в настройках проверяется только ОДИН параметр, т.е. если проверяется хост отправителя - то это ip|fqdn, если это адрес отправителя - то user@domain.com.
Вариант последовательной проверки двумя check'ами не годится - поскольку ip может взять из одной записи, а логин из другой записи.
Есть ли вариант одновременной проверки по двум параметрам, в данном случае по логину и ip адресу?

★★★★★

Думаю можно создать карту проверяющую по двум параметрам (запрос вида select * from tbl_name where username='vasya' and ip='8.8.8.8').
Вот только не могу вспомнить где задаётся какие данные будут переданы в карту

MrClon ★★★★★
()
Ответ на: комментарий от DonkeyHot

Отдельная цепочка проверки для некоторых писем? Не думаю что это подходящий инструмент, ведь тут не две независимые проверки, а по сути одна проверка по двум параметрам (такой-то юзернэйм с такого-то адреса).

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Пример куска конфига:

smtpd_restriction_classes = internal_only
internal_only = check_recipient_access hash:/etc/postfix/conf/internal_only, reject

smtpd_sender_restrictions =
        reject_non_fqdn_sender,
        check_sender_access hash:/etc/postfix/conf/sender_access
        permit_sasl_authenticated,
        permit_mynetworks,
        reject_unknown_sender_domain,
        permit
pinkbyte@web /etc/postfix $ cat /etc/postfix/conf/sender_access
campus.local            internal_only
.campus.local           internal_only
pinkbyte@web /etc/postfix $ cat /etc/postfix/conf/internal_only
campus.local    OK

На выходе - чуваки из @campus.local и поддоменов не смогут отправлять письма за пределы доменов, указанных в internal_only.

Чуваки из остальных доменов в эту проверку не подпадают. Как видишь все проходят по одной и той же цепочке проверок, но кто-то подпадает под определенные условия, кто-то - нет

Я думаю как это сделать для твоего случая ты сообразишь :-)

Pinkbyte ★★★★★
()
Ответ на: комментарий от Pinkbyte

У меня никакого случая нет, у меня и так всё шикарно, «случай» у ТСа. И в его случае, если я всё правильно понял, к каждому юзернэйму прилагается IP с которого этому юзернэйму можно логиниться.
restriction_classes хороши когда есть несколько группы писем для которых нужно применять разные проверки (про «отдельную цепочку проверки» я погорячился). Но тут другой случай.

MrClon ★★★★★
()
Ответ на: комментарий от Pinkbyte

как это реализовать - понятно, но слишком уж муторно. Это же получается для каждого юзера сооружать свой класс в котором прописывать конкретный sql запрос в который подставляешь и фиксированное имя пользователя и уже переменный его IP.

smtpd_restriction_classes = masha_class,vanja_class,dasha_class
masha_class = check_sender_access mysql:/etc/postfix/conf/masha_only, reject
vanja_class = check_sender_access mysql:/etc/postfix/conf/vanja_only, reject
dasha_class = check_sender_access mysql:/etc/postfix/conf/dasha_only, reject


smtpd_sender_restrictions =
        reject_non_fqdn_sender,
        check_sender_access hash:/etc/postfix/conf/sender_access
        permit_sasl_authenticated,
        permit_mynetworks,
        reject_unknown_sender_domain,
        permit

 $ cat /etc/postfix/conf/sender_access
10.0.0.0/8              OK
*                       masha_class,vanja_class,dasha_class

 $ cat /etc/postfix/conf/masha_only
query=SELECT IF(login is not NULL;'OK';'REJECT') AS ACCESS FROM users_ip WHERE login="masha@mydomain.com" AND ip="%s"

 $ cat /etc/postfix/conf/vanja_only
query=SELECT IF(login is not NULL;'OK';'REJECT') AS ACCESS FROM users_ip WHERE login="vanja@mydomain.com" AND ip="%s"

 $ cat /etc/postfix/conf/dasha_only
query=SELECT IF(login is not NULL;'OK';'REJECT') AS ACCESS FROM users_ip WHERE login="dasha@mydomain.com" AND ip="%s"
Это же офигеешь от одного вида. К тому же и классы тогда нафик не нужны, можно множественным
check_sender_access mysql:/etc/postfix/conf/*_only
обойтись

Atlant ★★★★★
() автор топика
Ответ на: комментарий от MrClon

к каждому юзернэйму прилагается IP с которого этому юзернэйму можно логиниться

совершенно верно.
Причина сего банальна. Есть аппаратура умеющая только POP3 и простой SMTP без авторизации. IP-серые и динамические. Она стоит по местам и связывается только по GSM. Соорудил свою реализацию аутентификации через POP3-before-SMTP через запись в mysql, осталось только закрыть лишний доступ отправки любой почты через IP-аппаратуры.

Atlant ★★★★★
() автор топика
Ответ на: комментарий от Atlant

Ээээ, погоди, я не понял - юзер должен иметь права отправлять письма только с определенных ip?

Ну типа так:

имя ip
вася 1.1.1.1
вася 1.1.2.2
петя 3.3.3.3

ну и с определенных адресов не делать такую проверку?

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

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

юзер должен иметь права отправлять письма только с определенных ip

Да, это так. Чуть выше я описал зачем сиЁ нужно.

подключить класс как эту таблицу

По сути sql-таблица уже есть. Не понятно как отфильтровать по двум параметрам одновременно.

Atlant ★★★★★
() автор топика
Ответ на: комментарий от Pinkbyte

так это та же самая ситуация, последовательная проверка по одному параметру, потом по другому.

Условно говоря

struct
{
  string ip;
  string login;
} REC;
REC users[]=[('10.0.0.1','sasha@foma.ru'),('10.0.0.2','masha@foma.ru')];

// Если проверять по по классам
if (input_user_login in users.login)
{
  if (input_user_ip in users.ip)
    return Ok;
  else 
    return reject;
}
 return reject;

// А вот это - проверка которую я хочу.
foreach(user in users)
{
  if (input_user_login = user.login) && (input_user_ip = user.ip)
  return Ok;
}
return Reject;

Atlant ★★★★★
() автор топика
Ответ на: комментарий от Atlant

В постфиксе со сложной логикой бяда, это вам не экзим, но я его все равно люблю :)

А в сложных случаях я пишу свой фильтр на перле с любой извращенной логикой. Оно берет на вход инфу о письме и выдает вердикт. Маны тут http://www.postfix.org/SMTPD_POLICY_README.html

blind_oracle ★★★★★
()
Последнее исправление: blind_oracle (всего исправлений: 1)
Ответ на: комментарий от blind_oracle

а это интересный вариант, спасибо за наводку. Попробую что нибудь соорудить.

Atlant ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.