LightSquid настройка Ubuntu Server 14.04 LTS и 15

Linux > LightSquid настройка Ubuntu Server 14.04 LTS и 15
05.06.2015 11:21:32



Статья:

 LightSquid

Устанавливаем:

sudo apt-get install lightsquid

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

sudo cp /etc/lightsquid/lightsquid.cfg /etc/lightsquid/lightsquid.cfg.default
sudo nano -Y sh /etc/lightsquid/lightsquid.cfg

Редактируем (выведено содержимое конфигурационного файла без комментариев):

sudo cat /etc/lightsquid/lightsquid.cfg | grep -v  "^#"
$cfgpath             ="/etc/lightsquid";
$tplpath             ="/usr/share/lightsquid/tpl";
$langpath            ="/usr/share/lightsquid/lang";
$reportpath          ="/var/lib/lightsquid/report";
$logpath             ="/var/log/squid3";
$ip2namepath         ="/usr/share/lightsquid/ip2name";
$lockpath            =$reportpath;
$maxlocktime         = 30*60;
$debug               = 0;
$debug2              = 0;
$squidlogtype        = 0;
$skipurl             = 'zzz\.zzz';
$ip2name="UsersAndHostnames";
%month2dec = ( Jan => 1, Feb => 2, Mar => 3, Apr => 4, May => 5,Jun => 6,
               Jul => 7, Aug => 8, Sep => 9, Oct => 10, Nov => 11,Dec => 12);
$timereport          = 1;
$lang                ="ru-utf8";
$templatename        ="base";
$DecOutType="fine";
$decdelimiter        = " ";
$showgrouplink       = 1;
$showgroupid         = 1;
$showoversizelink    = 1;
$showputpost         = 1;
$putpostwarninglevel =15;
$userealname         = 1;
$bigfilelimit        = 2*1024*1024;
$perusertrafficlimit = 1*1024*1024*1024;
$weekendmode="both";
$topsiteslimit       = 500;
$usertimelimit       = 200;
$graphreport         = 1;
$graphmaxuser=0.05*(1024*1024*1024);
$graphmaxall =0.80*(1024*1024*1024);
$barcolor="orange";

sub CreateGroupFile($) {
  my $path=shift;

  open Fi,"<$cfgpath/group.cfg";
  open Fo,">$path/.group";
  while (<Fi>) {
    print Fo $_;
  }
  close Fo;
  close Fi;
}

sub CreateRealnameFile($) {
  my $path=shift;

  open Fi,"<$cfgpath/realname.cfg";
  open Fo,">$path/.realname";
  while (<Fi>) {
    print Fo $_;
  }
  close Fo;
  close Fi;
}

 

Файл преобразований имён LightSquid — ip2name

В переменной $ip2name указывается расширение файла описывающего схему отображения имён пользователей и компьютеров в генерируемых отчётах. Все возможные варианты таких файлов можно найти в каталоге, который указан в переменной $ip2namepath. После изучения всех доступных вариантов стало понятно, что каждый из них имеет свои недостатки, поэтому был создан собственный файлip2name.UsersAndHostnames, который преобразует IP адреса компьютеров (запросы к прокси без аутентификации) в понятные имена (из DNS), а имена аутентифицированных пользователей отображает в виде логинов. Создадим такой файл:

sudo nano -Y sh /usr/share/lightsquid/ip2name/ip2name.UsersAndHostnames

Наполним его содержимым:

#contributor: crux
#do nothing
#simple version

use Socket;

sub StartIp2Name() {
}

sub Ip2Name($$$) {
  # $Lhost,$user,$Ltimestamp
  my ($ip, $user) = @_;
  return $user if $user ne "-";
  if (!defined $hIP{$ip}) {

    my $iaddr = inet_aton($ip);
    my $user  = scalar gethostbyaddr($iaddr, AF_INET);
    $user =~ s/\..+$// if defined $user;
    $user = uc($user) if defined $user;

    # if gethostbyaddr failed to get host, use ip
    $user = $ip unless defined $user;

    $hIP{$ip}=$user;
  }
  return $hIP{$ip};

}

sub StopIp2Name() {
}

#warning !!!
1;

 

Файл сопоставлений имён LightSquid — realname.cfg

При генерации отчётов по пользователям включенный параметр $userealname подразумевает добавление дополнительной колонки в которой будет отображаться полное имя (Ф.И.О.) пользователя. В нашем случае в анализируемом логе прокси-сервера access.log информация об аутентифицированных пользователях отображается в виде доменных логинов, и для того чтобы заполнить в отчётах LightSquid колонку с полным именем во время генерации этих отчётов используется специальный вспомогательный файл сопоставлений — /etc/lightsquid/realname.cfg. Каждая строка этого файла может содержать пару значений по принципу: <Что искать> <Чему соответствует>. Таким образом, если мы хотим в отчетах получить заполненной колонку с ФИО, — нужно наполнить файл сопоставлений, например:

artur Артур Вахтангович Пирожков
anov1 Алексей Сигизмундович Новацкий

Чтобы автоматизировать процесс заполнения и поддержания в актуальном состоянии этого файла создадим bash-скрипт, который будет при запуске очищать содержимое файла, а затем наполнять его информацией полученной из Active Directory (AD). Скрипт сделаем исполняемым и откроем на редактирование:

sudo touch /etc/lightsquid/realname-generate.sh
sudo chmod +x /etc/lightsquid/realname-generate.sh
sudo nano -Y sh /etc/lightsquid/realname-generate.sh

Наполним скрипт содержимым (не забываем изменить переменную groupdn):

#!/bin/bash

rnfile="/etc/lightsquid/realname.cfg";
groupdn="CN=KOM-Internet-AllUsers,OU=Security Groups,OU=KOM,DC=holding,DC=com";

if [ -f $rnfile ];then
   sudo rm $rnfile
fi
sudo touch $rnfile;

for i in `sudo net ads search "(&(objectclass=person)(memberOf:1.2.840.113556.1.4.1941:=$groupdn))" samAccountName -P | grep "^sAMAccountName:" | sed "s/^sAMAccountName: //"`;
do
        login_low=`echo $i | tr "[:upper:]" "[:lower:]"`;
        full_name=`sudo net ads search "(sAMAccountName=$login_low)" name -P | grep "^name:" | sed "s/^name: //"`;
        echo "$login_low   $full_name" >> $rnfile;
done
#

Обратите внимание на то, что поиск пользователей в AD производится по их членству в доменной группе безопасности KOM-Internet-AllUsers, которую мы создали ранее в одной из предыдущих частей.

Немного позже мы вернёмся к этому скрипту, чтобы настроить его периодическое выполнение через планировщик Cron.

 

Языковой файл LightSquid

Теперь настало время объяснить почему в переменной $lang конфигурационного файла lightsquid.cfg у нас указано значение ru-utf8, хотя в поставке LightSquid нет такого языкового файла в каталоге указанном в переменной $langpath (/usr/share/lightsquid/lang/). Дело в том, что если мы будем использовать любой из предложенных ru*.lng файлов, то можем нарваться на ситуацию когда данные из файла сопоставленийrealname.cfg не состыкуются по используемой кодировке с кодировкой языкового файла LightSquid. Так как в нашем случае в системе по умолчанию используется кодировка UTF-8, то и генерируемый файлrealname.cfg будет содержать данные в этой кодировке, и чтобы не было разночтений с языковым файлом LightSquid сделаем свой языковой файл, сконвертировав его из уже имеющегося, после чего откроем получившийся файл на редактирование:

sudo iconv -f cp1251 -t utf8 /usr/share/lightsquid/lang/ru.lng -o /usr/share/lightsquid/lang/ru-utf8.lng
sudo nano -Y sh /usr/share/lightsquid/lang/ru-utf8.lng

Изменим одну строчку в начале файла указав его кодировку:

MSG_CODEPAGE=UTF-8

 

Интеграция LightSquid с веб-сервером Apache2

Теперь настало время интегрировать LightSquid в ранее установленный веб-сервер Apache2. Для этого к основной конфигурации Apache2 можно подключить конфигурационный модуль /etc/apache2/conf-available/lightsquid.conf. Как всегда сохраним копию и откроем исходный файл на редактирование:

sudo cp /etc/apache2/conf-available/lightsquid.conf /etc/apache2/conf-available/lightsquid.conf.default
sudo nano -Y sh /etc/apache2/conf-available/lightsquid.conf

Изменённое содержимое файла будет таким:

Alias   /lightsquid/    /usr/lib/cgi-bin/lightsquid/

<Location "/lightsquid/">
        AddHandler cgi-script .cgi
        Require all granted
</Location>

Подключаем этот конфигурационный модуль к основной конфигурации веб-сервера:

sudo a2enconf lightsquid

Enabling conf lightsquid.
To activate the new configuration, you need to run:
  service apache2 reload

При этом в каталоге /etc/apache2/conf-enabled/ (который в свою очередь обрабатывается из главного файла /etc/apache2/apache2.conf) будет создан линк на /etc/apache2/conf-available/lightsquid.conf

ls -la /etc/apache2/conf-enabled/lightsquid.conf
lrwxrwxrwx 1 root root 33 Jun 20 16:33 /etc/apache2/conf-enabled/lightsquid.conf -> ../conf-available/lightsquid.conf

***

Так как веб-страницы LightSquid формируются cgi-скриптами, для веб-сервера Apache2 потребуется включить модуль обработки CGI (будет создан линк в каталоге /etc/apache2/mods-enabled/):

sudo a2enmod cgi
Enabling module cgi.
To activate the new configuration, you need to run:
  service apache2 restart

***

После проделанных изменений перезагружаем конфигурацию веб-сервера Apache2 :

sudo service apache2 reload
 * Reloading web server apache2  *
 *

 

Генерация  отчетов

Теперь можно попробовать выполнить генерацию отчетов LightSquid:

sudo /usr/share/lightsquid/lightparser.pl

Результат проверяем открыв соответствующий URL http://kom-ad01-squid.holding.com/lightsquid/

 

Исправление ошибки деления на 0

При первой же попытке генерации отчетов LightSquid нами была обнаружена ошибка – для некоторых пользователей/компьютеров с минимальным объёмом трафика отчёт отображался в виде пустой страницы. При этом в логе веб-сервера /var/log/apache2/error.log фиксировалась запись:

[Wed Jun 25 13:03:53.828886 2014] [cgi:error] [pid 53614] [client 10.160.100.100:52121] AH01215: Illegal division by zero at /usr/lib/cgi-bin/lightsquid/user_detail.cgi line 91.

Указанная проблема воспроизводится LightSquid 1.8 в том, случае случае если пользователь интернета имел какой-то минимальный трафик, и весь этот трафик попал к нему из кэша.

Чтобы исправить эту проблему, создаём файл патча:

sudo nano -Y sh /usr/lib/cgi-bin/lightsquid/user_detail.cgi.patch

…и наполняем его с содержимым:

# When user have only 'hit' traffic, $calculatedtotal become zero
# and script die with "Illegal division by zero" error
--- user_detail.cgi~	2014-06-25 13:26:16.576149494 +0400
+++ user_detail.cgi	2014-06-25 13:25:58.108485852 +0400
@@ -88,7 +88,7 @@
   $hit=$h{$site}{hit};
   $size=$h{$site}{size};
   $total+=$size;
-  $percent   =sprintf("%2.1f",int($size*1000/$calculatedtotal)/10);
+  $percent   =$calculatedtotal?sprintf("%2.1f",int($size*1000/$calculatedtotal)/10):'&infin;';
   $printhit  =FineDec($hit);
   $printsize =FineDec($size);
   $printtotal=FineDec($total);
@@ -145,4 +145,4 @@
 2006-06-28 ADD : die -> MyDie
 2006-06-28 ADD : &tpl= support
 2006-09-13 ADD : add &user= in bigfiles URL
-2006-11-20 ADD : /g for ##SITEURL_B## & ##SITEURL_L##, my need in some cases
\ No newline at end of file
+2006-11-20 ADD : /g for ##SITEURL_B## & ##SITEURL_L##, my need in some cases

Патчим предварительно сохранив оригинальный файл user_detail.cgi

cd /usr/lib/cgi-bin/lightsquid/
sudo cp user_detail.cgi user_detail.cgi.default
sudo patch user_detail.cgi user_detail.cgi.patch
patching file user_detail.cgi

 

Автоматизация обработки логов Squid

Перенесём файл описывающий правила ротации логов Squid для Logrotate в отельное месторасположение, например в каталог с конфигурационными файлами Squid.

sudo mv /etc/logrotate.d/squid3 /etc/squid3/squid.logrotate

Отредактируем файл squid.logrotate, немного увеличив срок хранения логов, убрав упоминания о SARG и расширив postrotate:

sudo nano -Y sh /etc/squid3/squid.logrotate

Изменённое содержимое файла будет таким:

#
#       Logrotate fragment for squid3.
#
/var/log/squid3/*.log {
        daily
        compress
        delaycompress
        rotate 3
        missingok
        nocreate
        sharedscripts
        postrotate
              test ! -e /var/run/squid3.pid || test ! -x /usr/sbin/squid3 || /usr/sbin/squid3 -k rotate
              /usr/share/lightsquid/lightparser.pl access.log.1
        endscript
}

Периодический запуск обработки логов Squid из LightSquid по расписанию реализован путём автоматического добавления файла lightsquid в /etc/cron.d/ в процессе установки пакета LightSquid.
Используемая по умолчанию конфигурация подразумевает ежедневный запуск скрипта lightparser.pl в 04:00 утра. Закомментируем данные настройки и добавим вызов logrotate с нашим конфигурационным файлом /etc/squid3/squid.logrotate

sudo nano -Y sh /etc/cron.d/lightsquid

Изменённое содержимое файла будет таким:

#
# Regular cron jobs for the lightsquid package
#
#0  4 * * *   root [ -x /usr/share/lightsquid/lightparser.pl ] && /usr/share/lightsquid/lightparser.pl
#30 * * * *   root /usr/share/lightsquid/lightparser.pl today
0 21  * * *   root /etc/lightsquid/realname-generate.sh
0 0   * * *   root /usr/sbin/logrotate /etc/squid3/squid.logrotate

То есть каждый день в 21:00 мы будем вызывать скрипт обновления файла сопоставления имёнrealname.cfg а в 00:00 будем вызывать ротацию логов, из которой в свою очередь (после ротации логаaccess.log) будет вызвана процедура генерации отчетов LightSquid за прошедшие сутки (из логаaccess.log.1).

Разумеется, на всякий случай можно проверить успешность выполнения запланированной в CRON команды:

sudo /usr/sbin/logrotate /etc/squid3/squid.logrotate

По материалам 

http://blog.it-kb.ru/2014/06/30/forward-proxy-squid-3-3-on-ubuntu-server-14-04-lts-part-9-lightsquid-reports-patched/