Автоматический импорт ФИО пользователей из Active Directory в Lightsquid

от автора

У многих, кто управляет прокси-сервером Squid на предприятии, есть потребность периодически демонстрировать статистику пользования интернетом сотрудниками руководству. Для представления статистики дополнительно к Squid устанавливается анализатор журналов типа SARG, Lightsquid и т.д. При этом зачастую в организации развёрнута служба каталогов (предполагается, это Active Directory), в которой у всех сотрудников есть учётные записи и авторизация в прокси-сервере идёт на основе учётных записей. Естественно, для руководства, когда оно смотрит отчёт, удобней идентифицировать сотрудника по имени и фамилии. На удивление, во многих форумах и IT-порталах эту задачу предлагают решать вручную, забивая имена и фамилии в конфигурационные файлы анализатора журналов. У этого решения есть недостаток — при зачислении/увольнении какого либо сотрудника конфиги придётся редактировать.
Эта статья описывает метод автоматического извлечения данных о фамилии и имени сотрудников из ActiveDirectory и их вставку в отчёты Lightsquid.

Задача: обеспечить вывод отчётов через Lightsquid по каждому пользователю Active Directory, заходившего в интернет, с указанием его имени и фамилии (забегая вперёд, скажу, что в AD этой информации соответствует поле «выводимое имя», в LDAP-запросах на него ссылается переменная displayName)
Исходные данные:

  • -Настроенный и корректно работающий Squid 3.3.8 с авторизацией ntlm
  • -в конфиге Squid присутствуют следующие строки:
    	logfile_rotate N 	debug_options rotate=M 	

    где N и M -максимальное количество файлов журнала, которые Squid может создать
    logfile_rotate — для access.log, debug_options -для cache.log

  • -Настроенный и корректно работающий Apache 2.4.7
  • -Настроенный и корректно работающий Lightsquid 1.8 ()
  • -в конфиге Lightsquid есть переменная $lang = «ru»
Решение:

Сначала я опишу механизм передачи данных о ФИО в 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; } 

Объективная критика приветствуется

ссылка на оригинал статьи http://habrahabr.ru/post/227289/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *