The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"OpenNews: postfix + pam патч"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Разговоры, обсуждение новостей (Public)
Изначальное сообщение [Проследить за развитием треда]

"OpenNews: postfix + pam патч"
Сообщение от opennews on 23-Апр-03, 21:56 
Патч реализующий поддержку проверки наличия пользователя, на начальном этапе почтовой сессии (local_recipient_maps), через PAM для postfix.

URL: http://d.scn.ru/proj/postfix/
Новость: http://www.opennet.ru/opennews/art.shtml?num=2373

Cообщить модератору | Наверх | ^

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "postfix + pam патч"
Сообщение от Michael Tokarev on 23-Апр-03, 21:56 
Эмм, хорошие...  Во-первых, это всё-таки не auth'торизация, а проверка наличия аккаунта.  Для этого в общем-то уже есть нормальный local_recipient_maps, с возможностью использовать свои map'ы (ну не radius, понятное дело).  Есть nss "поддерживаемый" out of the box.  Кстати, если local_recipient_maps вернёт, что user exists, но его реально нет, то local(8) всё равно не сможет его доставить, так что nss всё равно нужен, и посему от dict_pam толку никакого не будет.

Вот если действительно хочется модуль уметь подключать, тогда нужно просто доделать dict_tcp и повесить свой демоночек для ответов на запросы, и уже туда пихать всё что захочется (только не PAM, я вас умоляю...;)

Cообщить модератору | Наверх | ^

2. "postfix + pam патч"
Сообщение от Andrew Baznikin email on 24-Апр-03, 05:25 
Ответ Michael Tokarev.
Была задача сделать проверку наличия пользователя через RADIUS, что было сделано с минимальными трудозатратами. Использовать для этих целей dict_tcp - это значит 1) написать сетевой уровень - сокеты там всякие 2) написать работу с RADIUS-сервером (не спорю, по времени это заняло бы даже меньше времени - ведь написал бы я его на любимом Perl, используя старые наработки, но это было бы менее универсально..). Была сначала сделать dict_radius, но была отвергнута. Есть готовый pam_radius, зачем делать лишнюю работу? К тому же это будет более универсально - используется вся мощь PAM, с его chain'ами, и пр. и пр.

"Во-первых, это всё-таки не auth'торизация, а проверка наличия аккаунта" - совершенно верно. dict_pam передает в PAM только имя пользователя (читай - email) и название сервиса.

"для этого в общем-то уже есть нормальный local_recipient_maps, с возможностью использовать свои map'ы" - я и сделал "свой map".

"...то local(8) всё равно не сможет его доставить" - в качестве maildrop используется cyrus-imapd, который так же смотрит в RADIUS - есть ли такой пользователь. Если есть, а у него нет ящика, он его создаст (патч пишу сейчас).

"Есть nss "поддерживаемый" out of the box." - это что за зверь?
grep -Ri nss ./src/* - no result.

Cообщить модератору | Наверх | ^

3. "postfix + pam патч"
Сообщение от poige email on 24-Апр-03, 10:44 
В твоем патче есть строка такая с

  strdup(...) // FIXME

(если не ошибаюсь).

причем, речь идет о memory leak, который "просит" чтобы его пофиксили.
Если код хотя бы раз вызывается при каждой проверке, то работающий у ISP почтовик, "откусит" немало мозгов, по идее.

/poige
--
http://www.morning.ru/~poige/

Cообщить модератору | Наверх | ^

4. "postfix + pam патч"
Сообщение от Andrew Baznikin email on 24-Апр-03, 11:01 
>В твоем патче есть строка такая с
>
>  strdup(...) // FIXME
>
>причем, речь идет о memory leak, который "просит" чтобы его пофиксили.

Спасибо за комментарий .)
int converse(int n, const struct pam_message **msg,
            struct pam_response **resp, void *data) {
/* ... */
    resp[i]->resp = strdup(msg[i]->msg); /* FIXME */
/* ... */
}

Утечки здесь нет, т.к. буфер, в который производится копирование (resp) инициализируется PAM, им же он и освобождается. Т.е. это - проблемы негров .)

Cообщить модератору | Наверх | ^

5. "postfix + pam патч"
Сообщение от poige email on 24-Апр-03, 18:36 
>>причем, речь идет о memory leak, который "просит" чтобы его пофиксили.
>
>Спасибо за комментарий .)
>int converse(int n, const struct pam_message **msg,

>    resp[i]->resp = strdup(msg[i]->msg); /* FIXME */

>Утечки здесь нет, т.к. буфер, в который производится копирование (resp) инициализируется PAM,
>им же он и освобождается. Т.е. это - проблемы негров .)

Я не уверен на все 100 %, что называется, так как, в текстах PAM-модулей часто встречается такая работа с данными (strdup()), а детального описания интерфейса (API), в котором было бы написано кто, что и как выделяет/освобождает, я не нашел. Однако, там же (в текстах) встречается и проверка на то, что память действительно выделена, причем, если этого не произошло, то выполняется "откат", освобождая все, что успели получить до этого. В твоем патче такого нет:

+    for (i = 0; i < n; ++i) {
+        resp[i]->resp_retcode = 0;
+        resp[i]->resp = strdup(msg[i]->msg); // FIXME
+    }
+
+    return (PAM_SUCCESS);

Если ты брал готовый (чужой) кусок кода, то следовало обратить внимание на его готовность к "реальной жизни", ибо он там *специально* отмечен комментарием.

/poige
--
http://www.morning.ru/~poige/

Cообщить модератору | Наверх | ^

6. "postfix + pam патч"
Сообщение от Andrew Baznikin email on 25-Апр-03, 05:57 
>Я не уверен на все 100 %, что называется, так как, в
>текстах PAM-модулей часто встречается такая работа с данными (strdup()), а детального
>описания интерфейса (API), в котором было бы написано кто, что и
>как выделяет/освобождает, я не нашел. Однако, там же (в текстах) встречается
>и проверка на то, что память действительно выделена, причем, если этого
>не произошло, то выполняется "откат", освобождая все, что успели получить до
>этого. В твоем патче такого нет:
>
>+    for (i = 0; i < n; ++i)
>{
>+        resp[i]->resp_retcode = 0;
>+        resp[i]->resp = strdup(msg[i]->msg); // FIXME
>+    }
>+
>+    return (PAM_SUCCESS);
>
>Если ты брал готовый (чужой) кусок кода, то следовало обратить внимание на
>его готовность к "реальной жизни", ибо он там *специально* отмечен комментарием.

Пример converse я взял из доки к pam (/usr/share/doc/en/articles/pam/pam-sample-conv.html). Вот кусок из оригинала:
    resp[i]->resp = strdup(buf);
    if (resp[i]->resp == NULL)
      goto fail;
Далее по коду примера, resp нигде не освобождается.
А что касается коментария - его я поставил для себя, так я отмечаю места к которым нужно вернуться для возможного улучшения. В этом патче converse служит исключительно заглушкой.

Cообщить модератору | Наверх | ^

7. "postfix + pam патч"
Сообщение от poige email on 25-Апр-03, 11:55 
>Пример converse я взял из доки к pam (/usr/share/doc/en/articles/pam/pam-sample-conv.html). Вот кусок из
>оригинала:
>    resp[i]->resp = strdup(buf);
>    if (resp[i]->resp == NULL)
>      goto fail;
>Далее по коду примера, resp нигде не освобождается.
>А что касается коментария - его я поставил для себя, так я

Гм. Так в примере-то есть проверка значения strdup(), а у тебя она лишь в "// FIXME" превратилась. :)

>отмечаю места к которым нужно вернуться для возможного улучшения.
>В этом патче converse служит исключительно заглушкой.

По сути, почти ничего не меняет. Если *ожидается*, что код там ни разу не будет выполнен, то лучше влепить там "аварийный выход". Есть хорошее правило -- "лучше лишний стоп, чем лишний ляп". Однако, в данном случае, функция  converse() вызывается, все же, верно? PAM не слишком-то простая штука, чтобы просто к ней относиться. В этом свете мнение Michael Tokarev насчет использования TCP-сервиса выглядит достаточно разумно. Я думаю, что можно было обойтись и без dict_tcp + своего "демона" -- просто использовать libradius для "dict_radius", к примеру.

"
1) написать сетевой уровень - сокеты там всякие 2) написать работу с RADIUS-сервером (не спорю, по времени это заняло бы даже меньше времени - ведь написал бы я его на любимом Perl, используя старые наработки, но это было бы менее универсально..)
"

1-е сделать правильнее проще, так документации несравнимо больше и неоднозначностей меньше... 2-е можно было бы сделать на том же C, используя libradius, которая присутствует во FreeBSD.

Конечно, цель определяет калибр, как говорится:

"Была задача сделать проверку наличия пользователя через RADIUS, что было сделано с минимальными трудозатратами."

С одной стороны PAM добавляет гибкости (с еще одним уровнем абстракции), но он служит для целей аутентификации, в принципе, а не для поиска "ЕСТЬ ЛИ ТАКОЙ LOGIN?". В твоем решении, нужно специальным образом настраивать сам RADIUS-сервер (чтобы не обращал внимания на неправильность пароля), то есть, back end, в общем случае, поэтому ценность прикручивания к "картам" postfix'а возможности "выйти на любой аутентификатор" (посредством PAM) сомнительна.

/poige
--
http://www.morning.ru/~poige/

Cообщить модератору | Наверх | ^

Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру