Squid eDir

Обсуждение технических вопросов по продуктам Novell под Linux, а также *nix систем

Сообщение Андрей Тр. aka RH » 15 сен 2006, 16:20

Александр Читалкин писал(а):Андрею: таблица этих подключений netware-специфичная вещь? А если в сети нет серверов netware, а скажем, только OES - каким образом можно определить соответствие loggeduser<->ip?
Честно говоря - не знаю, я не программер ( тем более под Новелл ). Но подозреваю, что это не так сложно - я видел немало софта, который пользуется подобного рода информацией ( правда, все больше под Нетваре - для OES, который Линукс, пока еще не видел - речь про чисто новелловских клиентов ). Наверное, это все есть в SDK .. где-то в API на девелопер.новелл.сом. А что, такие таблицы могут быть "неспецифичными", т.е. на них есть какой-то стандарт ?
Даешь отдельный раздел по ZENworks ... :bad-words: .. и печати !
Аватара пользователя
Андрей Тр. aka RH
 
Сообщения: 3937
Зарегистрирован: 18 июн 2002, 11:27

Сообщение Александр Читалкин » 15 сен 2006, 16:31

А что, такие таблицы могут быть "неспецифичными", т.е. на них есть какой-то стандарт ?

"Подключения к серверу" как к таковому не бывает, вернее, понятие очень расплывчатое. Бывает подключение к его службам. И мы можем попросить у какой-либо службы инфу о том, какие пользователи к ней в данный момент подключены. В netware возможно есть, у кого спрашивать, и есть службы, к которым существует подключение, пока пользователь работает с сервером вообще. В линуксе может быть по-другому, поэтому и интересуюсь :) Если, например, клиент поддерживает c ndsd постоянное tcp соединение, тогда попытаться определить его ip возможно и в линуксе.
Последний раз редактировалось Александр Читалкин 15 сен 2006, 17:09, всего редактировалось 1 раз.
Аватара пользователя
Александр Читалкин
 
Сообщения: 112
Зарегистрирован: 13 ноя 2002, 23:29
Откуда: Москва

Сообщение Андрей Тр. aka RH » 15 сен 2006, 16:54

Александр Читалкин писал(а):"Подключения к серверу" как к таковому не бывает, вернее, понятие очень расплывчатое.
Вероятно, в данном случае речь про NCP сервер. А в Линуксе понятие "сервер" и вправду очень расплывчатое. Но, поскольку на OES который Линукс NCP сервер тоже есть, то, очевидно, и там такая таблица должна существовать.

Одной из проблем при таком способе является необходимость наличия данного пользователя в таблице коннектов конкретного сервера ( по которой предполагается вести проверку адреса ). А добиться этого можно лишь если пользователь был аутентифицирован на этом сервере - т.е. обратился к нему за каким-то ресурсом. Что в сети с несколькими серверами, понятное дело, негарантировано. Если только этот ресурс не выделяется 100% пользователям при их логине - например, домашний каталог.
Даешь отдельный раздел по ZENworks ... :bad-words: .. и печати !
Аватара пользователя
Андрей Тр. aka RH
 
Сообщения: 3937
Зарегистрирован: 18 июн 2002, 11:27

Сообщение Александр Читалкин » 15 сен 2006, 17:22

А кстати, вот этот атрибут в центре внимания - networkAddress - его значения устанавливает кто? Novell Client на машине пользователя? Или NCP служба на сервере?
Аватара пользователя
Александр Читалкин
 
Сообщения: 112
Зарегистрирован: 13 ноя 2002, 23:29
Откуда: Москва

Сообщение Андрей Тр. aka RH » 15 сен 2006, 18:01

Я сомневаюсь, что кто-то вне самого Новелла сможет четко ответить на этот вопрос. Опять же лично мне кажется, что его устанавливает "сервер" ( NCP ? ), клиент вообще вряд ли занимается установкой каких-либо атрибутов пользователя. Отсюда, например http://support.novell.com/docs/Tids/Sol ... 99118.html вытекает ( на мой взгляд ), что его устанавливает "сервер" по событию от клиента NDS Finish Login.
Даешь отдельный раздел по ZENworks ... :bad-words: .. и печати !
Аватара пользователя
Андрей Тр. aka RH
 
Сообщения: 3937
Зарегистрирован: 18 июн 2002, 11:27

Сообщение Иван Левшин aka Ivan L. » 17 сен 2006, 12:54

Андрей Тр. aka RH писал(а):Я сомневаюсь, что кто-то вне самого Новелла сможет четко ответить на этот вопрос.

Жди Костю - думаю, ему все еще есть что сказать.
Иван Левшин aka Ivan L.
 
Сообщения: 2378
Зарегистрирован: 05 июн 2002, 18:36
Откуда: Новомосковск, Тул. обл.

Сообщение Константин Ошмян » 18 сен 2006, 13:29

Александр Читалкин писал(а):По поводу ClientTrust и его "однозначной надежности", которой, подозреваю, там нет и никогда не было, как и у всех аналогов. Смотрим линуксовый сурс такого аналога этой программы для аутентификации на бордере.
[...]
Что мы имеем? А имеем мы сервер
[...]
А может и нет.
Ознакомиться с исходниками и самой программой-демоном можно здесь: http://sourceforge.net/projects/cl4others/
"Живёт волшебник может быть, а может быть - и нет" :)

Посмотрел я на исходники того "аналога этой программы". :?
Впечатления остались, как бы это помягче сказать... весьма смешанные. Основной вопрос, оставшийся после просмотра, был такой: "А это вообще у кого-нибудь работает??" :shock:

Т.е. какие-то здравые мысли и некоторые намётки там есть; но похоже, что проект не доведён до логического завершения и давно заброшен, а по уровню программирования - как посредственная лабораторка (даже не курсовик). По крайней мере, в глаза бросаются следующие вещи:
  • Обнуление буфера ctbody длиной MAX_MSG (вскоре после комментария /* init buffer */) - при том, что места под этот буфер выделяется на 8 байт меньше:
    Код: Выделить всё
    char *ctbody=(char *)malloc(MAX_MSG-8);
    Такое должно сразу же приводить к аварийному снятию программы по SEG_VIOLATION.
  • Номер коннекшена к серверу так никуда и не передаётся (в отправляемом пакете всегда нулевой).
  • Какие-то совершенно непонятные манипуляции в функциях strmid и strrnul (вдобавок с двойным выделением памяти и неосвобождением её) - при том, что результат в итоге так нигде и не используется. Видимо, автор изначально хотел честно обрабатывать передаваемые Бордером данные (имя/контекст сервера, имя дерева), а потом плюнул на это и решил требовать нужные данные в командной строке; да ещё с условием предварительного монтирования тома этого сервера.
Иван Левшин aka Ivan L. писал(а):Жди Костю - думаю, ему все еще есть что сказать.
Это про меня? :oops:
Или про Константина Матвеева?
Аватара пользователя
Константин Ошмян
 
Сообщения: 972
Зарегистрирован: 13 авг 2002, 21:36
Откуда: Рига

Сообщение Иван Левшин aka Ivan L. » 18 сен 2006, 14:01

Константин Ошмян писал(а):
Иван Левшин aka Ivan L. писал(а):Жди Костю - думаю, ему все еще есть что сказать.
Это про меня? :oops:
Или про Константина Матвеева?

Про тебя :) Сорри за фамильярность.
Иван Левшин aka Ivan L.
 
Сообщения: 2378
Зарегистрирован: 05 июн 2002, 18:36
Откуда: Новомосковск, Тул. обл.

Сообщение Константин Ошмян » 18 сен 2006, 19:18

Иван Левшин aka Ivan L. писал(а):
Константин Ошмян писал(а):
Иван Левшин aka Ivan L. писал(а):Жди Костю - думаю, ему все еще есть что сказать.
Это про меня? :oops:
Или про Константина Матвеева?

Про тебя :) Сорри за фамильярность.
Да нет, ничего - всё нормально :)

Что же касается вопроса про networkAddress, то Андрей (ака Тр.) уже привёл ссылку на TID, к которому мне добавить нечего. Обидно только - получается, что если перегружался Primary-сервер, то у всех его пользователей этот атрибут будет очищен. :cry:

В свою очередь - Sorry всем за некоторые мои неточности в описании работы ClientTrust-а. А именно: претензия номер два
Константин Ошмян писал(а):Номер коннекшена к серверу так никуда и не передаётся (в отправляемом пакете всегда нулевой).
- снимается.

Посмотрел сейчас на свои записи по этому поводу, освежил в памяти некоторые TID-ы на эту тему (ни в одном не расписано подробно, но в некоторых дано описание в общих чертах - например, TID-ы 10023517, 10060170, 10013820) и некоторые другие источники - потому уточняю; вдруг кому пригодится.
  • Достаточно красиво (кратко и ёмко) сказано об этом в сентябрьском выпуске Appnotes за 2003-й год:
    With SSO, the proxy does not actually authenticate the user. It verifies that the user already had an authenticated connection through the Novell Client. Therefore, SSO is not really an authentication method, but a way to avoid redundant authentication.

    With Single Sign-On, the user logs in to the tree containing the BorderManager servers and runs CLNTRUST.EXE. When the BorderManager server receives a request from a browser and determines that SSO authentication is required, it contacts the CLNTRUST module running on the workstation. If the client is not authenticated to the tree, SSO fails. If the client is authenticated to the tree but not connected to the BorderManager server, the Novell Client locates the server and makes an "open service connection" request to it through NCP. If the workstation already has an NCP connection to the BorderManager server or is able to create one, it sends an NCP service request extension request code 37, which contains a 4-byte identification number. BorderManager verifies that the client sending the NCP extension is the same one that it sent the SSO request to, and SSO succeeds.
  • Номер коннекшена КлиентТрастом напрямую Бордеру таки не передаётся. Был не прав. Погорячился. Каюсь.
  • От Бордера КлиентТрасту передаётся UDP-пакет, в котором первые 16 байт представляют собой четыре 4-байтовых поля в следующем порядке:
    1. идентификатор того, что это - запрос: сигнатура 0x11111111 (пресловутые десятичные "17" в каждом байте);
    2. ReqNo - номер запроса;
    3. ReqLen - длина запроса в байтах, если начинать считать с 4-го поля (т.е. следущего за этим);
    4. NCPExtNum - номер, полученный Бордером при регистрации его на сервере в качестве "слушателя" NCPExtension-запросов.
  • Последующие байты запроса содержат имя дерева/сервера/контекста в виде строки в формате unicode, примерно так:
    Код: Выделить всё
    \TESTTREE\TestOrg\TestOU\TEST-SERVER
    Никакого ограничителя в конце строки нет, просто её длина - (ReqLen-4) байтов.
  • ClientTrust отвечает Бордеру коротким 8-мибайтовым пакетом, в котором вторые 4 байта содержат ReqNo из запроса, а первые 4 байта - одну из двух сигнатур: 0x22222222 (OK, десятичные "34") либо 0x33333333 (ERROR, десятичные "51" - если подключения к дереву нет). Больше от КлиентТраста Бордеру вообще ничего не передаётся!
  • Уже после этого КлиентТраст обращается к Новелловскому клиенту - как было сказано, вызывает функцию NCP с кодом 37 (0x25 - NCP Extension), передавая ей буфер длиной 8 байтов, который содержит два 4-байтовых поля: NCPExtNum и ReqNo (в исходниках cl4others зачем-то передаётся 10-байтовый буфер, заполненный несколько своеобразно);
  • Бордер, предварительно зарегистрировавший на сервере себя в качестве "слушателя" NCPExtension-запросов, получает данный запрос, после чего сравнивает его с тем что послал, а затем выполняет всю оставшуюся работу по идентификации пользователя (видимо, вместе с NCP-запросом он "видит" и номер коннекшена к серверу, после чего выбирает из таблицы соединений имя пользователя).
  • В самом деле, теоретически можно обмануть Бордер, перенаправив свой 3024-й порт UDP на другую машину, на которой работает другой пользователь - жертва. Особенно в случае, когда жертва имеет подключение к серверу с Бордером по протоколу IPX, Бордеру будет довольно трудно распознать такого рода атаку (но это всё в теории, на практике я этого не проверял).
Ну и вывод из всего этого - малоутешительный: несмотря на то, что теоретически можно сделать как аналог КлиентТраста для не-Windows платформ, так и программу, работающую с КлиентТрастом аналогично Бордеру (например, в качестве хелпера для Сквида), - делать всё это можно лишь при определённых условиях, да у написание всего этого - задача довольно муторная; и всё равно - решение будет хоть и интересным, но недостаточно универсальным и надёжным. Что не отменяет возможности написания своего аналога КлиентТраста, лишённого этих недостатков; но это будет уже другая история :D
Аватара пользователя
Константин Ошмян
 
Сообщения: 972
Зарегистрирован: 13 авг 2002, 21:36
Откуда: Рига

Сообщение Андрей Тр. aka RH » 19 сен 2006, 07:49

Константин Ошмян писал(а):вывод из всего этого - малоутешительный: несмотря на то, что теоретически можно сделать как аналог КлиентТраста для не-Windows платформ, так и программу, работающую с КлиентТрастом аналогично Бордеру (например, в качестве хелпера для Сквида), - делать всё это можно лишь при определённых условиях, да у написание всего этого - задача довольно муторная; и всё равно - решение будет хоть и интересным, но недостаточно универсальным и надёжным. Что не отменяет возможности написания своего аналога КлиентТраста, лишённого этих недостатков
"Аналог" КТ для не-Windows платформ ( или это только для NLD ? ) вроде имеется :
http://support.novell.com/docs/Readmes/ ... 72281.html
Novell BorderManager 3.8 Support Pack 4 (September 23, 2005 )
..
2.0 Whats New in this Build
..
3. Client Trust SSO:
Proxy SSO (clntrust) is now available for the
Novell Linux Desktop (NLD) platform.This requires
the Netware client for NLD.

3.5 Proxy SSO on Novell Linux Desktop(NLD)

The Novell BorderManager 3.8.4 installation
copies clntrust.tar file into sys:/public folder
of the BM Server.

3.0 Installation
..
To enable proxy SSO on NLD,

1. Extract the clntrust.tar file into a folder
using the command tar -xvf clntrust.tar.
2. Run clntrust.
Ensure that the Novell Client for Linux is
loaded on NLD before running clntrust.

Вдобавок http://www.novell.com/coolsolutions/feature/16315.html и http://www.novell.com/coolsolutions/tip/15611.html ( вторая, кстати - By Craig Johnson; обратите внимание на ссылку в п.1 на another one available that was not created by Novell :) ).
Даешь отдельный раздел по ZENworks ... :bad-words: .. и печати !
Аватара пользователя
Андрей Тр. aka RH
 
Сообщения: 3937
Зарегистрирован: 18 июн 2002, 11:27

Сообщение Александр Читалкин » 21 сен 2006, 12:54

О чем и речь, Константин, о чем и речь :D Как я уже и предпологал, вывод относительно всех этих _трастов_демонов_ етц. малоутешителен. Кстати, с чего вы взяли что
Код: Выделить всё
char *ctbody=(char *)malloc(MAX_MSG-8);

сразу даст повод для SIGSEGV? Вовсе нет. SIGSEGV случиться, если будет произведена попытка доступа к содержимому ctbody по смещению, большему чем MAX_MSG-8, imho.
И еще момент - вот ваша фраза:
видимо, вместе с NCP-запросом он "видит" и номер коннекшена к серверу, после чего выбирает из таблицы соединений имя пользователя
.
В таком случае, пользователь этот должен быть подключен к службе NCP того сервера, на котором работат бордер, непосредственно? А если это не так? И как быть в случае *nix систем?
Аватара пользователя
Александр Читалкин
 
Сообщения: 112
Зарегистрирован: 13 ноя 2002, 23:29
Откуда: Москва

Сообщение Константин Ошмян » 25 сен 2006, 18:32

Приветствую, Александр!
Александр Читалкин писал(а):Кстати, с чего вы взяли что
Код: Выделить всё
char *ctbody=(char *)malloc(MAX_MSG-8);
сразу даст повод для SIGSEGV? Вовсе нет. SIGSEGV случиться, если будет произведена попытка доступа к содержимому ctbody по смещению, большему чем MAX_MSG-8, imho.
Не сразу, немного позже. Я, собственно, именно это и имел в виду, когда перед этим говорил:
Константин Ошмян писал(а):Обнуление буфера ctbody длиной MAX_MSG (вскоре после комментария /* init buffer */) - при том, что места под этот буфер выделяется на 8 байт меньше
Вот код этого обнуления (расположенный вскоре после комментария /* init buffer */) :
Код: Выделить всё
memset(ctbody,0x0,MAX_MSG);
Функция memset как раз и производит этот "доступ к содержимому ctbody". Места было выделено (MAX_MSG-8 ), а используются все MAX_MSG.
Александр Читалкин писал(а):И еще момент - вот ваша фраза:
Константин Ошмян писал(а):видимо, вместе с NCP-запросом он "видит" и номер коннекшена к серверу, после чего выбирает из таблицы соединений имя пользователя
В таком случае, пользователь этот должен быть подключен к службе NCP того сервера, на котором работат бордер, непосредственно? А если это не так? И как быть в случае *nix систем?
Во-первых, я же писал:
Константин Ошмян писал(а):Бордер в запросе к ClientTrust-у передаёт имя своего сервера и дерева, а также контекст сервера; ClientTrust же проверяет (через Client32), есть ли у пользователя подключение к этому дереву вообще и серверу в частности. При необходимости/возможности (подключение к дереву - есть, к серверу - нет) - делается Unlicensed-подключение серверу.
Во-вторых, оговорка "видимо" тоже снимается :D - я нашёл описание этих самых NCP Extensions, после чтения которого сомнений не осталось. Более того, зарегистрировавший NCP Extension модуль (т.е. NLM на сервере NetWare) имеет возможность не только иметь информацию о NCP-Connection-е от клиента (через который пришло обращение к этому экстеншену), но и получать уведомления в случае изменения состояния этого коннекшена (пользователь отлогинился, соединение убили и т.п.). Т.е. теоретически ничто (кроме отсутствия опыта написания NLM-ов) не мешает написать для того же Сквида модуль, совместимый со стандартным КлиентТрастом и работающий на NetWare: регистрируем себе NCP-Extension, после чего по запросу от Сквидовского хелпера с IP-адресом клиента возвращаем имя залогиненного там пользователя (ведя у себя таблицу соответствия "IP<->UserName", определяя UserName по описанной выше технологии и вычёркивая из этой таблицы по изменению состояния коннекшена). Сквидовский хелпер при этом мог бы быть совсем тупым - просто разбирать командную строку или конфиг. файл для обнаружения имени или IP-адреса сервера NetWare, на котором такой модуль загружен, и номера порта для обращения к нему.

Наверное, при наличии серверной NCP-службы на *NIX-овом сервере (например, SLES) можно каким-то образом портировать такой модуль и туда; но увы - я не специалист в данной области.
Аватара пользователя
Константин Ошмян
 
Сообщения: 972
Зарегистрирован: 13 авг 2002, 21:36
Откуда: Рига

Пред.

Вернуться в *nix

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron