Настройка прокси

Тут описывается нелёгкий путь настройки ОС FreeBSD, начиная с установки дистрибутива и заканчивая настройкой каждого сервиса
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Настройка прокси

Сообщение RomA »

Рано или поздно начинать было надо - надо осуществлять контроль за доступ в интернет, а то крайним будешь ты... Решил поставить прокси.
Для начало пошел смотреть что уже стоит у меня с системе, что бы не слажать и не начать ставимть заново

Код: Выделить всё

/var/db/ports 
и
/var/db/pkg
Для управления прокси я программу выбирал давно, а, кажется, ничего лучшего пока что не появилось - потому буду предерживаться того что уже знаю и что испытано. Вот тут на сайте http://stc.nixdev.org/ есть инструкция, как это все ставить и что делать - в принципе по ней все и делалось...
Обращяю ваше внимание - всегда думайте есть ли у вас такая директория, которая прописана в конфиге или нет. специально тут не пишу где я создаю директории - это должно быть уже в крови - смотрите в конфиг, сразу думаете есть такая директория или нет - если нет - не поленитесь создать.
Для начала поставлю все программы, которые они советуют в разделе "Системные требования" http://stc.nixdev.org/index.php?page=5
В основном все ставится по умолчанию из портов, шибко не заморачиваясь... тут просто внимательно читаем и думаем нужно оно нам или нет. В апаче я как правило выключаю DAV - он мне не нужен - у меня есть самба, в gd включаю "[X] ICONV iconv support" ибо без него никуда. Вот какие порты я ставлю

Код: Выделить всё

/usr/ports/www/apache22
/usr/ports/www/squid
/usr/ports/www/squidguard
/usr/ports/www/sarg
/usr/ports/net/libpcap
/usr/ports/net/p5-Net-Packet
/usr/ports/net/p5-Net-PcapUtils
/usr/ports/net/p5-Net-RawIP
/usr/ports/security/p5-Crypt-HCE_SHA
/usr/ports/security/p5-Crypt-PasswdMD5
Теперь надо скачать сам дистрибутив. Так как машина находится за прокси - надо рассказать шелу о его сущестововании, а потом скачать и распаковать архивы.
Тут сделаю небольшое лирическое отступление - для программ, которых нету в портах я делаю папочку /usr/local/install - именно в ней я дальше и произвожу все действия по сборке и установке. Это помогает не мусорить в системе, а так же иметь одну папку для хранения того, чего нету в портах, и что надо обновлять руками.

Код: Выделить всё

setenv http_proxy http://login:password@192.168.1.7:3128/
mkdir /usr/local/install
cd /usr/local/install
fetch http://stc.nixdev.org/downloads/sfiles/stc-2.0.16.tar.gz
fetch http://stc.nixdev.org/downloads/sfiles/Apache-Htpasswd-1.8.tar.gz
tar -xzf stc-2.0.16.tar.gz
tar -xzf Apache-Htpasswd-1.8.tar.gz
После чего методом

Код: Выделить всё

perl Makefile.PL
make
make install
Ставим модули Apache-Htpasswd-1.8 и stc-2.0.15/_modules/hijack_stc
Теперь можно приступить и к установке самой проги. Файл конфигурации я правил не долго - там почти все по умолчанию

Код: Выделить всё

Begin Intallation of stc-2.0.15 ...


Please check the following install options

-------------------------------------------------------------------
Your OS: 					FreeBSD
Local ethernet device: 				bge0
Local net IP: 					127.0.0.1
Apache User: 					www
Apache Group: 					www
Squid User: 					squid
Squid Group: 					squid
-------------------------------------------------------------------
STC data files directory: 			/usr/local/stc/etc
STC limit scripts directory: 			/usr/local/stc/limit
File exclude hosts: 				/usr/local/stc/etc/exclude_hosts
STC sarg files directory: 			/usr/local/stc/sarg
Apache Document Root 				/usr/home/www/proxy
Path sarg reports: 				/usr/home/www/proxy/data/sarg
STC CGI-scripts directory: 			/usr/home/www/proxy/stat
Squid Log File: 				/usr/local/squid/logs/access.log
-------------------------------------------------------------------
SquidGuard Path Conf file:  			/usr/local/etc/squid
Squid Path Conf file: 				/usr/local/etc/squid
Squid Path Bin file:  				/usr/local/sbin
Sarg Path Bin file: 				/usr/local/bin
Charset codepage: 				rus-1251
Install log file: 				/var/log/error.log
-------------------------------------------------------------------


If it's OK press Y, otherwise press N (Y/N) y
После этого мне пришлось еще руками поправить следующие файлы:
/etc/stc.conf

Код: Выделить всё

sarg_exclude_codes_filelist /usr/local/etc/sarg/exclude_codes
mega_byte 1048576
local_eth_device bge0
Настройку начну с апача - дабы увидеть хоть что нить и возрадоваться. В файле /usr/local/etc/apache22/httpd.conf делаю общие правки и раскоментирую

Код: Выделить всё

# Virtual hosts
Include etc/apache22/extra/httpd-vhosts.conf
В файле /usr/local/etc/apache22/extra/httpd-vhosts.conf удаляю спам и пишу следующее

Код: Выделить всё

<VirtualHost *:80>
    ServerAdmin admin@stniva.ru
    DocumentRoot /usr/home/www/proxy
    ServerName pereslavl.stniva.ru
    ErrorLog /var/log/httpd/proxy_pereslavl-error_log
    CustomLog /var/log/httpd/proxy_pereslavl-access_log combined
    AccessFileName .htaccess
    ScriptAlias /stat/cgi/ "/usr/home/www/proxy/stat/statist/"
    <Directory "/usr/home/www/proxy/">
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
    <Directory "/usr/home/www/proxy/stat">
        Options Indexes FollowSymlinks MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
    <Directory "/usr/home/www/proxy/stat/statist">
        AddHandler cgi-script .cgi .pl
        Options +ExecCGI
        AuthType Basic
        AuthName "Vvedite parol na internet"
        AuthUserFile /usr/local/stc/etc/password
        Require valid-user
        Order allow,deny
        Allow from all
    </Directory>
   <Directory "/usr/home/www/proxy/stat/messages">
        AddHandler cgi-script .cgi .pl
        Options +ExecCGI
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
Помним, что сервисы надо разрешать, что бы они пускались - потому в файл /etc/rc.conf добавляем "apache22_enable="YES""
Опять же обращаю внимание - смотрите в конец файла - есть или нету перевод строки после последней строки - это важно - иногда из-за этой мелочи в конфиге не запускается какая нить прога - пока найдете - пройдут не одни сутки. Всегда обращяйте внимание на то, есть ли пустая строка в конце файла, и на то - пробел или Tab применен в качестве разделителя
Теперь запускаем апачь и идем в вебинтерфейс управления прокси

Код: Выделить всё

pereslavl# ./apache22 start
Performing sanity check on apache22 configuration:
Syntax OK
Starting apache22.
Попал я в вебинтерфейс, порадовался что мои труды не пропали даром - теперь надо настраивать дальше. Ну для начало вспомним что ставили для управления прокси - наверняка этот прокси надо сначлао запустить, что бы он управялялся. потому идем править конфиг. В файл /usr/local/etc/squid/squid.conf в соответствующих местах включаю следующие строки
Эти строки вы должны ввести взямен имеющихся. Вносить блоками, как показано - то есть все auth_param друг за другом, а не по разным частям конфига. Ничего комментировать из стандартного конфига не надо - только добавляем это.

Код: Выделить всё

error_directory /usr/local/etc/squid/errors/Russian-1251
############
auth_param basic program /usr/local/libexec/squid/ncsa_auth /usr/local/stc/etc/password
auth_param basic children 50
auth_param basic realm Pereslavl proxy-caching server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
############
logfile_rotate 5
emulate_httpd_log off
url_rewrite_program /usr/local/bin/squidGuard -c /usr/local/etc/squid/squidGuard.conf
url_rewrite_children 20
redirector_bypass on
############
acl localhost src 192.168.56.5/32
acl all_users proxy_auth REQUIRED
############
http_access allow all_users
Опять идем в /etc/rc.conf и разрешаем запускаться сервису squid_enable="YES" Но сквид просто так не запустится - при первом запуске ему нужно создать базу данных, потому в первый раз делаем

Код: Выделить всё

pereslavl# /usr/local/sbin/squid -z
2009/12/29 21:17:26| Creating Swap Directories
pereslavl# /usr/local/etc/rc.d/squid start
Starting squid.
Запустился? проверим самым универсальным способом

Код: Выделить всё

pereslavl# telnet localhost 3128
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
^[
HTTP/1.0 400 Bad Request
Server: squid/2.7.STABLE7
Date: Tue, 29 Dec 2009 18:18:46 GMT
Content-Type: text/html
Content-Length: 1179
X-Squid-Error: ERR_INVALID_REQ 0
X-Cache: MISS from pereslavl.stniva.ru
Via: 1.0 pereslavl.stniva.ru:3128 (squid/2.7.STABLE7)
Connection: close

Ну вот, какие мы молодцы. Теперь надо померить сквид и апачь - оба работают в разных группах и не жаждут делиться своими знаниями с соседями...

Код: Выделить всё

chown -R squid:www /usr/local/squid/logs
chmod 664 /usr/local/etc/squid/squid.conf
chown squid:www /usr/local/etc/squid
chown squid:www /usr/local/etc/squid/squid.conf
chown www:www /usr/local/stc/etc/allign.otdel
chown www:www /usr/local/stc/etc/password.digest
chmod 755 /usr/home/www/proxy/stat/images
chmod 777 /tmp/stc
touch /var/log/squidGuard.log
chown squid:squid /var/log/squidGuard.log
mkdir /usr/home/www/proxy/data
mkdir /usr/home/www/proxy/data/sarg
Добавляю отдел (1) называю его (Руководители) добавляю в этот отдел пользователя (roman) и добавляю этот ник в список админов в терминале в файл /usr/local/stc/etc/admin.users - теперь удаляю пользователя по умолчанию вместе с группой - они нам больше не нужны
Настало время навести красоту. Привожу примеры, как это делается - полный текст можно посмотреть на любой проксе - тут же просто куски для истории
В файле /usr/home/www/proxy/stat/index.html пишем

Код: Выделить всё

<p style="line-height: 150%; margin-top: 3"align="center">^M                                                      
<b><font color="#901022" size="6">АПК Стойленская Нива</font></b></p>^M                                           
<p style="line-height: 150%; margin-top: 3" align="center"><font color="#000080" size="4">^M                      
система управление http-трафиком<br>офис ЗАО "Переславльский Хлебозавод"</font></p>^M                             
<hr>^M                                                                                                            
^M                                                                                                                
<b>Вы не авторизованы - Авторизуйтесь</b>^M                                                                       
<br>^M                                                                                                            
^M                                                                                                                
<blockquote>^M                                                                                                    
<br><br>^M                                                                                                        
<a href="/stat/cgi/statistic.cgi">Вход в статистику(login)</a>^M                                                  
<br><br><br>^M                                                                                                    
<font size="4">^M                                                                                                 
<b>Для того, что бы войти в статистику вы должны набрать логин и пароль, которым пользуетесь для входа в интернет<
</font>^M                                                                                                         
</blockquote>^M                                                                                                   
</p>^M                                                                                                            
<hr>
В файл /usr/home/www/proxy/stat/info.html

Код: Выделить всё

<p style="line-height: 150%; margin-top: 3"align="center">^M                                                      
<b><font color="#901022" size="6">Выдержка</font></b></p>^M                                                       
<p style="line-height: 150%; margin-top: 3" align="center"><font color="#000080" size="4">^M                      
из документа "Правила использования ресурсов сети Интернет в Компании"<br></font></p>^M                           
<hr>^M                                                                                                            
<b>...раздел "Правила использования ресурсов сети Интернет"</b><br>^M                                             
<blockquote>^M                                                                                                    
1.1.Подключение сотрудников к сети Интернет осуществляется в соответствии с установленным в Компании порядком упра
1.2.Запрещается использование ресурсов сети Интернет для работ, не связанных с исполнением должностных обязанносте
1.3.Аппаратные и программные средства, предоставленные сотруднику для доступа к сети Интернет, находятся в зоне от
1.4.Запрещается изменение конфигурации аппаратных и программных средств, а также любые действия по обходу и отключ
1.5.Запрещается размещение в сети Интернет непристойных, клеветнических, оскорбительных, угрожающих и противозакон
1.6.Сотрудник несёт личную ответственность за использование или наступившие последствия в результате использования
1.7.Администрация Компании предоставляет уполномоченным сотрудникам право проведения периодических проверок исполь
1.8.Администрация Компании имеет право вводить ограничения на использование Интернет, например, на соединения по о
</blockquote>^M 
Ну и в файле /etc/stc.conf

Код: Выделить всё

############## WEB Add-on config #################                                                                                                                                                                                  
#TAG:   header_text                                                                                               
header_text <center>Статистика http трафика офиса <br> ЗАО "Переславльский хлебозавод"</center>                                                                                                                                         
#TAG:   footer_text                                                                                               
footer_text <center>Техподдержка: <b>1800</b> (Владимир Ванин) <br> Вопросы по изменению лимитов: 1278 (Мануйлов Антон Ни                                                                                                                
Вот и все. Заводим отделы, пользователей и настраиваем так, как это должно все работать
PS: Практически везде у нас на заводах стоит такая система учета трафика, но никто ниразу не удосужился прочитать документацию на неё. Хочу обратить ваше внимание, что вместе с системой идет виндовая программка - агент, который показывает сколько трафика вы израсходовали, и сколько его еще осталось. Висит он в трее и выглядит в виде смайлика. По мере уменьшения трафика смайлик становится все грустней и грустней

Примечания
1) На машине с несколькими внутренними IP адресами не заработал раздел статистики - пришлось руками править скрипт /usr/home/www/proxy/stat/statist/serverstat.cgi - выглядеть он стал так

Код: Выделить всё

#This is only for serverstatus
$conf_site_ip = '127.0.0.1';
Последний раз редактировалось RomA 05 фев 2010, 14:48, всего редактировалось 23 раза.
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

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

Сообщение RomA »

Система статистики не создала отчеты за декабрь месяц - а отчеты были нужны, в связи с чем было принято решение создать эти отчеты вручную. Посмотрев внимательно на логи проски, было принято решение что m12 - это скорее всего 12 месяц - то есть нужный нам декабрь. Лог был на всякий случай скопирован в другую директорию, что бы не повредить оригинал. Отчет создавался следующей командой

Код: Выделить всё

srvbsd# mkdir /usr/home/www/stat/12
srvbsd# /usr/local/bin/sarg -l /usr/local/squid/logs/access.log.m12 -o /usr/home/www/stat/12/
SARG: Records in file: 4129569, reading: 100.00%
SARG: Successful report generated on /usr/home/www/stat/12//2009Dec01-2009Dec31
srvbsd#
Отлично - теперь идем смотреть статистику http://Наш_Сервер/stat/12/ - статистика есть!
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Баны сайтов

Сообщение RomA »

За баны сайтов у нас отвечает squidguard, которому передается запрос. О том, что кончился трафик нам сообщит тоже он, подменив страничку сайта на предупреждение.
Файл конфигурации находится тут /usr/local/etc/squid/squidGuard.conf - в принципе там все ясно и понятно. Сами же банлисты лежат тут /var/db/squidGuard - они разделены на папки.

Файл банов можно качать с инета, можно создавать самого. править можно руками, но так как лазить телнетом не хочется, то на коленке родился такой скрипт:

Код: Выделить всё

<head>                                                                                                            
<meta http-equiv="Content-Type" content="text/html; charset=KOI8-R">                                              
</head>                                                                                                           
<center>Баним доменные имена</center>                                                                             
<a href="proxy.php">Обновить</a>                                                                                  
<table border="1" cellspacing="1" cellpadding="5">                                                                
<tr><td>Сайт</td><td>                                                                                             
<FORM name=get action="" method=get>                                                                              
<input TYPE="text" name="name">                                                                                   
</td><td>                                                                                                         
<input type=submit value="Блокировать!">                                                                          
</td></tr>                                                                                                        
</form>                                                                                                           
</TABLE>                                                                                                          
                                                                                                                  
<?php                                                                                                             
$file = "/var/db/squidGuard/khps/domains";                                                                        
                                                                                                                  
                                                                                                                  
$file1 = $file;                                                                                                   
                                                                                                                  
// Чтение с файла                                                                                                 
$fpn = fopen($file, "r");                                                                                         
$text = file($fpn);                                                                                               
fclose($fpn);                                                                                                     
print_r($text); 

$name=$_GET["name"];                                                                                              
if (isset($name)){                                                                                                
// Размер строки и Фильтруем символы                                                                              
$name=substr($name, 0, 100);                                                                                      
$name = ereg_replace(" +", " ", $name);                                                                           
                                                                                                                  
// Запись в файл                                                                                                  
$file = fopen($file, "a");                                                                                        
$data = "$name\n";                                                                                                
fputs($file, $data);                                                                                              
fclose($file);                                                                                                    
}                                                                                                                 
                                                                                                                  
                                                                                                                  
                                                                                                                  
$array_text = file("$file1");                                                                                     
$text="";                                                                                                         
$save=0;                                                                                                          
$i=0;                                                                                                             
while (list ($key, $val) = each ($array_text)) {                                                                  
$q=0;                                                                                                             
$i++;                                                                                                             
if(isset($_GET["n"])) {                                                                                           
if($_GET["n"]==$key) {                                                                                            
echo "<font color=red>Удалено: $key = $val</font><br>";                                                           
$q=1;                                                                                                             
$save=1;                                                                                                          
}                                                                                                                 
}    

if($q==0) {                                                                                                       
$text.=$val;                                                                                                      
echo "$i - $val <input type=submit onclick=\"location='proxy.php?n=$key';\" value=\"Удалить\"><br>";              
}                                                                                                                 
                                                                                                                  
}                                                                                                                 
                                                                                                                  
if($save==1) {                                                                                                    
// Запись в файл                                                                                                  
$file = fopen($file, "w");                                                                                        
$data = "$text";                                                                                                  
fputs($file, $data);                                                                                              
fclose($file);                                                                                                    
}                                                                                                                 
                                                                                                                  
?> 
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Настройка клиентов

Сообщение RomA »

Самый простой способ настроить прокси в браузере - это прописать его вручную. Прописываем IP-адрес сервера где стоит прокси, порт - по умолчанию он у нас 3128 и в принципе все работает. Но одновременно это и самый слождый способ настройки прокси - потому что если что-то изменится, например список исключений, то прийдется всех обходить пешком и править. Кста, про список исключений - когда мы настроили IP и порт прокси, мы должны еще рассказать браузеру на какие сайты мы не должны ходить через прокси. в каждом браузере это прописывается по своему, потому приведу только список этих самых исключений

Код: Выделить всё

192.168.0.0/16
10.0.0.0/8
*.stniva.ru
*.khps.ru
*.kkhp.ru
*.safonovohleb.ru
*.smhlebopek.ru
*.pecherkiy.ru
Но есть и другие способы настройки браузеров - настройка через сценарий. для этого мы на сервер в общедоступное место ложим файл с именем proxy.pac примерно мледующего содержания

Код: Выделить всё

function FindProxyForURL(url, host) {                                                                             
  //Если указано только короткое имя, обратиться напрямую.                                                        
  if (isPlainHostName(host))                                                                                      
    return "DIRECT";                                                                                              
                                                                                                                  
  //Если имя машины начинается с "intranet" или "internal",                                                       
  //тоже обратиться минуя прокси.                                                                                 
  if (shExpMatch(host, "stniva*")||                                                                               
      shExpMatch(host, "www"))                                                                                    
    return "DIRECT";                                                                                              
                                                                                                                  
  //Hе использовать прокси для наших доменов                                                                      
  if (dnsDomainIs(host,".apstniva.ru")||                                                                          
      isInNet(host, "192.168.0.0", "255.255.0.0") ||                                                              
      dnsDomainIs(host,".stniva.ru")||                                                                            
      dnsDomainIs(host,"localhost")||                                                                             
      dnsDomainIs(host,"192.168.1.7")||                                                                           
      dnsDomainIs(host,"192.168.1.8")||                                                                           
      dnsDomainIs(host,"192.168.1.6"))                                                                            
    return "DIRECT";                                                                                              
                                                                                                                  
  //Если такого хоста нет, попытаться обратиться напрямую - только                                                
  //для того, чтобы броузер выдал более осмысленное сообщение об ошибке.                                          
  //if (!isResolvable(host))                                                                                      
    //return "DIRECT";                                   
  //Hаш прокси умеет кэшировать только http, ftp и gopher                                                         
  if (url.substring(0, 5) == "http:" ||                                                                           
      url.substring(0, 6) == "https:" ||                                                                          
      url.substring(0, 4) == "ftp:"||                                                                             
      url.substring(0, 7) == "gopher:")                                                                           
                                                                                                                  
    //Замените "proxy.ourcompany.com:3128" на имя и порт вашего прокси                                            
    return "PROXY 192.168.1.8:3128; DIRECT";                                                                      
                                                                                                                  
    //WAIS не кэшировать                                                                                          
    if (url.substring(0, 5) == "wais:")                                                                           
      return "DIRECT";                                                                                            
    else                                                                                                          
      return "DIRECT";                                                                                            
}     
А в браузере просто прописываем пусть к нему типа - сценарий автонастройки http://pereslavl.stniva.ru/proxy.pac - теперь мы можем менять только этот файлик, а все клиенты будут автоматически его себе затягивать

Литература:
1) спецификация файла втосценария http://www.wrec.org/Drafts/draft-cooper ... pad-00.txt
Scorp
Сообщения: 22
Зарегистрирован: 16 янв 2009, 14:19

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

Сообщение Scorp »

RomA писал(а):Система статистики не создала отчеты за декабрь месяц - а отчеты были нужны, в связи с чем было принято решение создать эти отчеты вручную. Посмотрев внимательно на логи проски, было принято решение что m12 - это скорее всего 12 месяц - то есть нужный нам декабрь. Лог был на всякий случай скопирован в другую директорию, что бы не повредить оригинал. Отчет создавался следующей командой

Код: Выделить всё

srvbsd# mkdir /usr/home/www/stat/12
srvbsd# /usr/local/bin/sarg -l /usr/local/squid/logs/access.log.m12 -o /usr/home/www/stat/12/
SARG: Records in file: 4129569, reading: 100.00%
SARG: Successful report generated on /usr/home/www/stat/12//2009Dec01-2009Dec31
srvbsd#
Отлично - теперь идем смотреть статистику http://Наш_Сервер/stat/12/ - статистика есть!
Также создать отчеты можно отредактировав файл

Код: Выделить всё

/usr/local/stc/sarg/report
(в нем записаны даты и интервалы дат, за которые sarg пытался сделать отчеты), т.е. если мы поставим там даты более ранние, то начиная с них создадутся все отчеты, чтобы создать их запускаем

Код: Выделить всё

/usr/local/stc/sarg/run
если ошибок нет, то отчеты сделаются, ошибки можно поглядеть в логах

Код: Выделить всё

/var/log/sarg_error.log
Scorp
Сообщения: 22
Зарегистрирован: 16 янв 2009, 14:19

Re: Настройка прокси

Сообщение Scorp »

Если кто то будет переходить на другую версию STC - обратите внимания, что при инсталле он делает подлянку :D записывает в crontab свой блок скриптов, но старый при этом не удаляет, при этом крон начинает запускать оба блока в одно время и ловим глюки. Как минимум я получил гемор с отчетами, пока не разобрался в чем дело
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Re: Настройка прокси

Сообщение RomA »

Scorp писал(а):Если кто то будет переходить на другую версию STC - обратите внимания, что при инсталле он делает подлянку :D записывает в crontab свой блок скриптов, но старый при этом не удаляет, при этом крон начинает запускать оба блока в одно время и ловим глюки. Как минимум я получил гемор с отчетами, пока не разобрался в чем дело
Возможно какая то разовая ошибка - я никогда с таким не сталкивался
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Авторизация в вебморде через NTLM

Сообщение RomA »

Итак, у нас есть домен, в нём заведены пользователи, но что бы посмотреть свою статистику им приходится вводить логин и пароль на прокси... это неудобно. По итогам этой статье пользователь сможет автоматически входить в свою статистику, используя NTLM авторизацию.
Приступаем:

Код: Выделить всё

cd /usr/ports/www/mod_ntlm2
make install clean
Обращяю внимание на то, что у меня второй апачь, потому и модуль я собираю /usr/ports/www/mod_ntlm2 - для первого апача я бы собирал /usr/ports/www/mod_ntlm
Модуль ставится без проблем... проверяем что он себя прописал

Код: Выделить всё

arhiv# cat /usr/local/etc/apache22/httpd.conf | grep ntlm
LoadModule ntlm_module        libexec/apache22/mod_ntlm.so
arhiv#
Хорошо. Подразумеваем что у нас уже настроен прокси и мы просто переделываем то, что было описано во всех верхних статьях. Таким образом вместо

Код: Выделить всё

#       AuthType Basic                                                                                            
#        AuthName "Vvedite parol na internet"                                                                     
#        AuthUserFile /usr/local/stc/etc/password                                                                 
#        Require valid-user  

прописываю новую авторизацию

Код: Выделить всё

        AuthType NTLM                                                                                             
        NTLMAuth on                                                                                               
        NTLMAuthoritative on                                                                                      
        NTLMDomain APK                                                                                            
        NTLMServer 192.168.0.5                                                                                    
        Require valid-user    
APK - мой домен
192.168.0.5 - ИП контролера домена
Перезапускаем апачь

Код: Выделить всё

/usr/local/etc/rc.d/apache22 stop
/usr/local/etc/rc.d/apache22 start
и теперь в статистику мы должно ходить без логина пароля.

Не забываем:
1) В интернет эксплорере это работает с 6 версии и второго сервиспака
2) В файрфоксе это надо включить, для этого строке адреса набираем about:config ставим фильтр по ntlm включаем и вносим туда наши сайты, или ИП
3) В Вин-Сервере и виндовс7 для этого надо включить отправку LM-запроса и понизить уровень безопасности интернет-эксплорера, ну или добавить такой хост в доверенные
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Авторизация без пароля

Сообщение RomA »

Предпосылки:
Прокси был настроен как описывалось выше, но уровень компьютерной грамотности растёт, что приводит к тому, что пользователи начали воровать пароли друг друга и ходить в интернет от чужого имени. В очередной раз уморившись искать таких умников по ИП, решил пресечь ситуацию в корне.

Реализация:
После изучения вопроса было решено делать авторизацию по NTLM технологии - пользователя больше не спрашивают о пароле - он передаётся сам. В итоге я мало что меняю у себя, но хороший результат на выходе

Требования:
Сразу хочу обратить внимание на то, что сервер, где стоит такой прокси должна быть в домене (ну или как честный случай являться контролером домена), а так же:
1) действия выполнялись на машине - контролере домена
2) домен поднят под юниксом

Замечание:
Скорее всего для виндового домена всё это прийдется весьма сильно рехтовать, в силу того что я получаю имя пользователя, без домена, а винда будет его отдавать с доменом... но это мысли - такого контролера у меня под рукой нет и проверять неначем.

Описание:
Итак, давайте начнем настраивать. Я не буду описывать весь процесс. Имеется в виду что есть настроеный прокси по вышестоящим статьям. И тут мы его только модернизируем. Итак, всё что нам надо сделать - это изменить в прокси метод аутеидентификации. для этого закоментируем то что там есть, и сделаем по своему:

Код: Выделить всё

auth_param ntlm program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 50
auth_param ntlm keep_alive on
auth_param basic program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 50
auth_param basic realm APK StNiva proxy web server
auth_param basic credentialsttl 2 hours
То есть мы коментируем все auth_param которые есть у нас и прописываем вот это. Как не трудно догадаться первый способ авторизации - это ntlm - он наш основной, но есть прокраммы, которые не умеют так авторизовываться и нам понадобатся старый метод запроса пароля - например для аськи - и тогда сработает basic-авторизация. В реале мне понадобилось добавить эту строчку что бы с Mac OS X в аську выйти через Adium - для всего остального оно было совершенно не нужно.
Перезапускаем сквид и если всё хорошо, а у меня было всё хорошо, пользователи начинают ходить в интернет сразу же без логинов и паролей - пускает всех... Ну это если выключить сквидгуард, конечно... для проверки...

Подытог... пользователи пошли в инттернет - не важно блокирует или нет их сквидгуард - главное что мы видим в логах что они проходят через наш прокси. У меня в интернет могут ходить все пользователи - я не стал их выделять в отдельную группу - если есть пользователь то с вероятностью 99,9% ему нужен интернет и замарачиваться смысла нет. Итак - любой пользователь кто есть в домене идет в интернет. Вроде как всё хорошо. Но ни пользователь ни я не может смотреть свою статистику... Следовательно мне нужно завести пользователей в STC... как авторизовать пользователя на вебморде было описано в предыдущей статье, теперь же рассмотрим процесс создания пользователя

Итак, мне нужен пользователь, но мне леново всех своих 100 человек заводить руками. Немного подумав я пришел в такой схеме: пустил всех пользователей в интернет - как следствие по всем ним собралась статистика, я просканировал список тех пользователей, что пытались пройти через прокси и создал всем им профили... то есть сегодня я завёл нового пользователя в домене, сегодня же он пошёл в инет, а на завтра ему автоматически завёлся профиль в STC - с завтра он может следить за своим трафиком. Для реализации этой схемы был написан нижеприведённый скрипт

Код: Выделить всё

#!/bin/sh

#################################################
#   Avto dobavlenie polzovateley v STC is LDAP  #
#       Roman Perepechaev roman@stniva.ru       #
# Version 1.0 kratkaya - polnaya na 192.168.0.5 #
#################################################

#############
### Trebovaniya
# Nado postavit base64 (FreeBSD: /usr/ports/converters/base64 & make install clean )
# Zapuskat posle STC (FreeBSD: cat "01 2 * * * root /usr/local/stc/etc/ntlm/CreateUser.sh" >> /etc/crontab)

#############
### Spisok peremennyh
# Pochta admina
pochta="roman@stniva.ru"
# 400MB po umolchaniy vsem
trafik="419430400"
# put do konfigov STC
stcpatch="/usr/local/stc/etc"
# put gde lezhat progi
progi="/usr/local/bin"
# tochka poiska v LDAP
ldapdn="ou=users,dc=apk,dc=stniva,dc=ru"
# Data v tom formate kak i STC
datedir=`date -v-1d +%d%m%Y | sed "s/\`date -v-1d +%d\`\`date +%m\`/\`date -v-1d +%d\`\`date| cut -d " " -f 2\`/g"`
# Put k otchetam SARG (esli pravim put to pravim i kol-vo "-f 10" strokoy nije )
sargdir="/usr/home/www/proxy/sarg/daily/total"

#############
# Sozdaem profil iz poluchennyh imen polzovateley (zapolnyarm familiy i imya po russki)
for i in `/usr/bin/find $sargdir/$datedir-$datedir -type d | tail +2 | cut -d "/" -f 10`;
do
# Proveryaem est uje takoi polsovatel ili net ispolsuem neyavnuy konstrukciy
    test -s $stcpatch/profiles/$i.profile && continue ||
	echo "domain:" >> $stcpatch/profiles/$i.profile
	echo "iface:tori" >> $stcpatch/profiles/$i.profile
	echo "email:$i@stniva.ru" >> $stcpatch/profiles/$i.profile
	echo "lname:`$progi/ldapsearch -H ldap://192.168.0.5 -b "uid=$i,$ldapdn" -x | grep sn | cut -d ":" -f 3 | sed s/^\ //g | $progi/base64 -d | $progi/iconv -f UTF-8 -t CP1251`" >> $stcpatch/profiles/$i.profile
	echo "fname:`$progi/ldapsearch -H ldap://192.168.0.5 -b "uid=$i,$ldapdn" -x | grep givenName | cut -d ":" -f 3 | sed s/^\ //g | $progi/base64 -d | $progi/iconv -f UTF-8 -t CP1251`" >> $stcpatch/profiles/$i.profile
	echo "mname:" >> $stcpatch/profiles/$i.profile
	echo "$i" >> $stcpatch/allow.users
	echo "$i" >> $stcpatch/o100.users
	echo "$i $trafik" >> $stcpatch/traffic.users
	/usr/sbin/chown www: $stcpatch/profiles/$i.profile
	echo "$i" >> $stcpatch/password
# Otpravlyaem uvedomlenie na pochtu adminu
	echo "New user:  $i" | /usr/bin/mail -s"New STC user created" $pochta
done

exit 0
Как видим последним действием стоит отправка письма сисадмину о том, какой пользователь был создан. Сам скрипт запускается по кнону

Код: Выделить всё

arhiv# cat /etc/crontab | grep ntlm
01	2	*	*	*	root	/usr/local/stc/etc/ntlm/CreateUser.sh
arhiv# 
теперь остается только по мере надобности перенести пользователя в другую группу, в админке STC и всё... Таким образом мы не ломая привычную систему перешли на NTLM авторизацию. Пользователь ничего не заметил, со стороны админа управление пользователем тоже не поменялось, а результат есть.
Совет от Захарова:
Что бы у меня заработало в параметрах авторизации добавил --require-membership-of="VYKSA-HLEB@Domain Users", т.е в конфиге сквида в итоге получилось
auth_param ntlm program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --require-membership-of="VYKSA-HLEB@Domain Users"
auth_param ntlm children 50
auth_param ntlm keep_alive on
auth_param basic program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-basic --require-membership-of="VYKSA-HLEB@Domain Users"
auth_param basic children 50
auth_param basic realm VYKSA_HLEB proxy web server
auth_param basic credentialsttl 2 hours
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Автонастройка прокси

Сообщение RomA »

Вот тут мы рассматривали, что автонастройку прокси можно передать через DHCP сервер - настройки DHCP описаны там, а тут мы рассмотрим всё остальное, что требуется для работы этого параметра.

Для начала повторюсь, что в конфиг DHCP-сервера /usr/local/etc/dhcpd.conf мы прописали следующие строки

Код: Выделить всё

option local-pac-server code 252 = text ;
option local-pac-server "http://wpad.stoilyanka.ru:80/wpad.dat\000" ;
Прописали и перезапустили. Теперь нам надо обеспечить работу этого сайта, который тут описан. Правим ДНС - то есть в файл /etc/namedb/master/stoilyanka.ru (у вас это ваш файл зоны) прописываем следующую строку

Код: Выделить всё

wpad        A      192.168.54.2
Не забывая изменить серийник, перезапускаем. Проверяем

Код: Выделить всё

hotel# ping wpad.stoilyanka.ru
PING wpad.stoilyanka.ru (192.168.54.2): 56 data bytes
64 bytes from 192.168.54.2: icmp_seq=0 ttl=64 time=0.057 ms
64 bytes from 192.168.54.2: icmp_seq=1 ttl=64 time=0.056 ms
Работает. Кста, у меня не захотела подключаться зона, - ругалась на журнал - потому недолго думая я просто удалил /etc/namedb/master/stoilyanka.ru.jnl и всё запустилось. ну да ладно.
Теперь нам надо создать сайт - пошли в /usr/local/etc/apache22/extra/httpd-vhosts.conf или где у вас там конфиг вебсервера и создаём новый хост

Код: Выделить всё

<VirtualHost *:80>                 
    ServerAdmin admin@stniva.ru    
    DocumentRoot /usr/home/www/wpad
    ServerName wpad.stoilyanka.ru
    ErrorLog /var/log/httpd/wpad-error_log
    CustomLog /var/log/httpd/wpad-access_log combined
    AccessFileName .htaccess
    <Directory "/usr/home/www/wpad">
        Options Indexes FollowSymlinks MultiViews
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
Не забываем создать те папки, которые тут прописаны.
Теперь в основной конфиг апача /usr/local/etc/apache22/httpd.conf после AddType application/x-gzip .gz .tgz
дописываем следующее

Код: Выделить всё

AddType application/x-ns-proxy-autoconfig .dat
ну и идём в /usr/home/www/wpad где создаём файлик wpad.dat следующего содержания

Код: Выделить всё

function FindProxyForURL(url, host) { return "PROXY 192.168.54.2:3128; DIRECT"; }
Ну а вот пример если надо прописать сразу и исключения - то строка будет выглядеть так

Код: Выделить всё

function FindProxyForURL(url, host) { if (dnsDomainIs(host,".smhlebopek.ru") || isInNet(host, "192.168.0.0", "255.255.0.0") ||  dnsDomainIs(host,"*.stniva.ru")) return "DIRECT"; return "PROXY 192.168.6.2:3128; DIRECT"; }
Перезапускаем апач, перегружаем какой нить компьютер и смотрим что у нас получилось - и идеале компьютер должен автоматически пойти в интернет с настройками "по умолчанию"
Совет от Евгения Харитонова:
Разобрался с фаерфоксом (с авто прокси), оказывается он ищет файл wpad.dat в первой зоне описанной в апаче, т.е. если зону wpad.....ru описать первой в апаче, то все работает на всех браузерах, если описана не первой, то для фаерфокса надо сделать симлинк wpad.dat в первую зону (которая открывается по ип адресу сервера)
Ответить