пятница, 20 июня 2014 г.

Squid и Domain Users

Достаточно много времени прошло с момента ввода в эксплуатацию прокси сервер со squid на борту, с доменном авторизацией. Все было хорошо, все работало.
Однако, в один момент админ одного из филиалов захотел, чтобы пользователей его поддомена наш squid не пускал в интернет. Не долго думая, в группу запрета интернета DenyInternet была добавлена группа Domain Users соответствующего поддомена. Быстро выяснилось, что такая конфигурация не работает. Пришлось разбираться почему.
Оказалось, что в MS AD группа Domain Users это primary группа пользователя, которая не числится в атрибуте memberOf учетки пользователя. Есть отдельный атрибут под названием primaryGroupID, в котором записан идентификатор группы. Именно идентификатор в виде цифры, а не текст или что-то еще. Как правило, если в атрибуте primaryGroupID указано 513, то это Domain Users, 512 - Domain Admins. Но это как правило, т.е. по идее не исключены ситуации, когда это не так.
Чтобы точно знать какой же группе принадлежит этот идентификатор, надо сделать поиск в AD. Что искать? Гугл подсказал, что группу надо искать по атрибуту objectSID. Чтобы его сформировать, надо взять objectSID запрашиваемого пользователя, например S-1-5-21-1232852338-251567878-923712399-72399, отрубить там последние циферки, идущие за последним дефисом. Так мы получить SID домена запрашиваемого пользователя. Вместо тех циферок подставить значение из атрибута primaryGroupID запрашиваемого пользователя. Так мы получим идентификатор группы S-1-5-21-1232852338-251567878-923712399-513, по которому и будет искать в AD. Т.е. теперь нужно выполнить поиск по ldap по атрибуту objectSID=S-1-5-21-1232852338-251567878-923712399-513 и получить имя группы. Поскольку эта группа тоже может иметь атрибут memberOf, в котором записано членство в других группах, то надо рекурсивно пройтись по ним так же, как это делалось в обычными группами.
По началу я попытался сам написать патч. Конечно, знаний у меня маловато, и я не сильно надеялся на успех. В добавок оказалось, что objectSID возвращается в бинарном виде. Тут я совсем сдался и решил написать разработчику хелпера, которого зовут Markus Moeller. В письме изложил ему проблему и идею ее решения. Markus ответил довольно быстро и легко согласился дописать хелпер. В общем диалог у нас вышел легкий. Через несколько дней он прислал патч, который я попробовал и отписался о результатах, потом еще несколько и в итоге все заработало как надо. Markus обещал, что этот патч он включит в транк. Так что в след. версии squid этот функционал будет доступен.
А пока новая версия еще не вышла, можно использовать этот патч для актуальной версии squid.
Писалось все это для squid34, так что к нему и надо применять. Для младших версии нужна правка.
Тут лежит новый файл support_ldap.cc, который надо заменять.
Вот такой хороший человек оказался Markus Moeller, легкий на подъем и в общении. Большое спасибо ему!

UPD. Squid 3.5 уже включает в себя данные изменения.