[Из песочницы] Автоматический импорт ФИО пользователей из Active Directory в Lightsquid
У многих, кто управляет прокси-сервером Squid на предприятии, есть потребность периодически демонстрировать статистику пользования интернетом сотрудниками руководству. Для представления статистики дополнительно к Squid устанавливается анализатор журналов типа SARG, Lightsquid и т.д. При этом зачастую в организации развёрнута служба каталогов (предполагается, это Active Directory), в которой у всех сотрудников есть учётные записи и авторизация в прокси-сервере идёт на основе учётных записей. Естественно, для руководства, когда оно смотрит отчёт, удобней идентифицировать сотрудника по имени и фамилии. На удивление, во многих форумах и IT-порталах эту задачу предлагают решать вручную, забивая имена и фамилии в конфигурационные файлы анализатора журналов. У этого решения есть недостаток — при зачислении/увольнении какого либо сотрудника конфиги придётся редактировать.Эта статья описывает метод автоматического извлечения данных о фамилии и имени сотрудников из ActiveDirectory и их вставку в отчёты Lightsquid.Задача: обеспечить вывод отчётов через Lightsquid по каждому пользователю Active Directory, заходившего в интернет, с указанием его имени и фамилии (забегая вперёд, скажу, что в AD этой информации соответствует поле «выводимое имя», в LDAP-запросах на него ссылается переменная displayName)Исходные данные: Решение: Сначала я опишу механизм передачи данных о ФИО в Lightsquid из ActiveDirectory, затем приведу его реализацию.Сведения о ФИО представлены в AD в свойствах доменного пользователя, в поле «Выводимое имя». Для получения сведений от AD необходимо взаимодействовать с ним через LDAP-запросы. При этом взаимодействовать можно только от имени авторизованного пользователя домена. Поскольку Lightsquid написан на Perl, для выполнения этих запросов потребуется модуль Net: LDAP. А для автоматического вывода в отчёте сведений из AD необходимо заменить простое получение логина от squid на выполнение LDAP-запроса.
Вначале необходимо создать в AD учётку с максимально ограниченными правами, которая будет использоваться для выполнения LDAP-запросов. Для этого запустите оснастку «Active Directory- пользователи и компьютеры» и создайте нового пользователя. Дайте ему название, выражающее его предназначение. Например, LightSquidAgent. Затем создайте новый объект групповой политики и войдите в его свойства (или в свойства существующего объекта). Далее Конфигурация компьютера→Конфигурация Windows→Параметры безопасности→Локальные политики→Назначение прав пользователя. В параметре «Отказ в доступе к компьютеру из сети» введите LightSquidAgent. В параметре «Отклонить локальный вход» тоже введите LightSquidAgent.
Теперь установим в Perl модуль Net: LDAP. Запускаем bash или аналогичную командную оболочку и выполняем
perl -MCPAN -e shell . После входа в интерпретатор cpan выполняем install Net: LDAP . Далее программа установки выведет вопрос, хотим ли мы позволить ей выполнить авто-конфигурирование. Просто жмём Enter. В конце вы должны увидеть LDAP module was installed successfully .После этого можно править код, генерирующий отчёты. Заходим в папку с установленным LightSquid, переходим в папку ip2name и открываем файл ip2name.squidauth. Он должен выглядеть так:
#contributor: esl #specialy for squid with turned on user authentication #simple version
sub StartIp2Name () { }
sub Ip2Name ($$$) { # $Lhost,$user,$Ltimestamp my $Lhost=shift; my $user =shift; $user =URLDecode ($user); #decode user name return $user if ($user ne »-»); return $Lhost; }
sub StopIp2Name () { }
#warning!!! 1; В шапке файла нужно прописать пространства имён, в которых лежат нужные нам функции: #contributor: esl #specialy for squid with turned on user authentication #simple version
use strict; use warnings; use Net: LDAP; use Encode; Финал: заменяем определение функции Ip2Name. Вместо sub Ip2Name ($$$) { # $Lhost,$user,$Ltimestamp my $Lhost=shift; my $user =shift; $user =URLDecode ($user); #decode user name return $user if ($user ne »-»); return $Lhost; } вставляем sub Ip2Name ($$$) { # $Lhost,$user,$Ltimestamp my $Lhost=shift; my $user =shift; $user =URLDecode ($user); #decode user name return $Lhost if ($user eq »-»);
my $server = «ldap://ourserver.domain.com»; my $ldap = Net: LDAP→new ($server) or die $@; my $message = $ldap→bind (q (domain\LightSquidAgent), password => «password»);
die $message→error () if $message→code ();
my $result = $ldap→search ( base => «dc=domain, dc=com», filter => »(&(objectCategory=person)(objectClass=user)(sAMAccountName=» . $user.»))», );
my $first_entry_with_displayName = $result→entry (0); my $pure_displayName = $first_entry_with_displayName→get_value («displayName»); $pure_displayName =~ s/ /_/g; Encode: from_to ($pure_displayName, 'utf-8', 'windows-1251');
$message = $ldap→unbind;
return $pure_cn; } Объективная критика приветствуется
