squid: авторизация в ActiveDirectory и статистика посещений сайтов

Предположим, что у вас есть домен на ActiveDirectory и шлюз на FreeBSD. И захотелось вам (или поступила задача от руководителя 🙂 ) настроить авторизацию пользователей через домен.

Что имеем: контроллер домена ActiveDirectory на Windows 2008 (логины пользователей на кириллице, да ещё и с пробелами!), FreeBSD 8.1 amd64, клиенты Windows XP/7

Внимание!

Перед установкой следует позаботиться о достаточном количестве файловых дескрипторов для пользователя, от которого работает squid, при включённом кешировании.

Перед установкой обновим порты:

#portsnap fetch update

1) Установка squid.

Идём в порты и ставим squid:

#cd /usr/ports/www/squid31 && make install clean

При выборе опций выбираем такие:

[X] SQUID_LDAP_AUTH Install LDAP authentication helpers
[X] SQUID_PINGER Install the icmp helper
[X] SQUID_HTCP Enable HTCP support
[X] SQUID_WCCP Enable Web Cache Coordination Prot. v1
[X] SQUID_IDENT Enable ident (RFC 931) lookups
[X] SQUID_USERAGENT_LOG Enable User-Agent-header logging
[X] SQUID_IPFW Enable transparent proxying with IPFW
[X] SQUID_LARGEFILE Support log and cache files >2GB
[X] SQUID_DEBUG Enable debugging options

Остальные опции выбираем по желанию.

После установки приводим конфигурационный файл к такому виду:

http_port 10.1.5.1:3128
logformat skel_squid %tl.%tu %6tr %>a %Ss/%03>Hs %<st %rm %ru [%ul] %Sh/%<A %mt
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
cache_mem 1024 MB
cache_dir ufs /usr/local/squid/cache 50000 64 512
access_log /var/log/squid/stat/access.log squid
access_log /var/log/squid/access.log skel_squid
coredump_dir /usr/local/squid
cache_store_log none
hosts_file /etc/hosts
append_domain .domain.ua
error_directory /usr/local/etc/squid/errors/ru
logfile_rotate 10
auth_param ntlm program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 30
auth_param basic program /usr/local/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 10
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern .               0       20%     4320
external_acl_type nt_group ttl=600%LOGIN  /usr/local/libexec/squid/wbinfo_group.pl
acl     inet_it      external nt_group inet_it
acl     inet_bad_users      external nt_group inet_bad_users
acl bnrs url_regex -i "/usr/local/etc/squid/db/bnrs"                #banners
acl porn url_regex -i "/usr/local/etc/squid/db/porn"                #porno
acl games url_regex -i "/usr/local/etc/squid/db/games"              #games
acl prox url_regex -i "/usr/local/etc/squid/db/prox"                #proxy
acl forum url_regex -i "/usr/local/etc/squid/db/forum"              #forum
deny_info       ERR_ACCESS_DENIED       bad_url
deny_info       ERR_ACCESS_DENIED        bad_networks
http_access     allow   inet_it all
http_access     allow   inet_users !prox !games !chat_url !porn !bnrs
deny_info       ERR_ACCESS_DENIED       all
http_access     deny                    all

Теперь объясню некоторые опции:

— logformat skel_squid : это для того, что бы в журнальных файлах было привычное для нас время (в формате dd/mm/yyyy hh:mm:ss); если вам это не нужно — уберите эту опцию
— cache_store_log none : я выключил логгирование кеша (собственно зачем мне знать, кто какой объект берёт из кеша; да и нагрузка на систему будет меньше)
— auth_param ntlm : этот блок описывает ntlm-авторизацию
— auth_param basic : этот блок описывает basic-авторизацию; добавлен для тех приложений, которые не поддерживают ntlm-авторизацию (например, opera)
— external_acl_type : указывает на то, что авторизацию будет проводить сторонняя программа (в нашем случае через winbind), параметр (в секундах) ttl=600 — отвечает за то, через какое время будут перечитываться пользователи из AD
— списки доступа acl inet_it external nt_group описывают одноимённые группы из ActiveDirectory

Остальные параметры можно посмотреть в справочном руководстве к squid.

Для возможности запуска squid’a добавляем такую строку в /etc/rc.conf:

squid_enable="YES"

Создаём директории для логов:

#mkdir -p /var/log/squid/stat
#chown -R squid:squid /var/log/squid

Ну и запускаем сам squid:

#/usr/local/etc/rc.d/squid start
squid starting

2) Введение в домен и настройка авторизации.

Что бы можно было авторизировать доменных пользователей нужно ввести наш шлюз в домен ActiveDirectory. Что бы это сделать — нужно получить билет kerberos от контроллера домена. После этого можно будет ввести шлюз в домен.

Устанавливать kerberos не нужно — он уже присутствует в базовой системе. Создаём файл /etc/krb5.conf (если создан, то правим его) и приводим к такому виду:

[libdefaults]
default_realm = MYDOMAIN.LOCAL
[realms]
MYDOMAIN.LOCAL = {
kdc = 10.1.5.21
admin_server = 10.1.5.21
kpasswd_server = 10.1.5.21
}
[domain_realm]
.mydomain.local = MYDOMAIN.LOCAL
mydomain.local = MYDOMAIN.LOCAL
[login]
krb4_convert = true
krb4_get_tickets = false
[logging]
default = FILE:/var/log/kerberos/krb5libs.log
kdc = FILE:/var/log/kereros/krb5kdc.log
admin_server = FILE:/var/log/kerberos/kadmind.log

Теперь пробуем получить билет:

# kinit admin
Password for admin@MYDOMAIN.LOCAL:

где admin — учётая запись в домене, которой разрешено добавлять комптютеры в домен.
Если ошибок не было, значит билет вы получили. Что бы посмотреть срок действия билета, выполним команду klist

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: admin@MYDOMAIN.LOCAL
Valid starting     Expires            Service principal
07/10/10 14:22:50  07/10/10 21:02:50  krbtgt/MYDOMAIN.LOCAL@MYDOMAIN.LOCAL

Небольшое отступление.
Билет от kerberos нужен всего 1 раз, что бы ввести компьютер в домен. Больше он не нужен. Поэтому не пугайтесь, если вы запустите klist и увидите такую картину:

# klist
Credentials cache: FILE:/tmp/krb5cc_0
Principal: GATE$@MYDOMAIN.LOCAL
Issued           Expires        Principal
Oct 11 10:07:45  >>>Expired<<<  krbtgt/MYDOMAIN.LOCAL@MYDOMAIN.LOCAL
Oct 11 10:07:45  >>>Expired<<<  ldap/srvad.mydomain.local@MYDOMAIN.LOCAL

Доменная авторизация будет продолжать работать.

Добавляем возможность доменной авторизации. Для этого вносим изменения в файл /etc/nsswitch.conf. Меняем строки

group: compat
passwd: compat

на такие

group: files winbind
passwd: files winbind

Теперь можно вводить наш шлюз в домен:

#net join rpc -W mydomain.local -U admin
admin’s password:
Joined domain MYDOMAIN.

Если после ввода пароля не получили ошибок — поздравляем, вы в домене.

Иногда могу появляться ошибки, наподобии таких:

# net join ads -W MYDOMAIN.local -U admin
Enter admin's password:
Failed to join domain: failed to find DC for domain ads
ADS join did not work, falling back to RPC...
Unable to find a suitable server for domain MYDOMAIN.local
Unable to find a suitable server for domain MYDOMAIN.local

Тогда можно попробовать ввести в домен так:

# net rpc join -U admin
Enter admin's password:
Joined domain MYDOMAIN.

Если ругается так:

Error in domain join verification (credential setup failed): NT_STATUS_INVALID_COMPUTER_NAME

то нужно выполнить такие вещи:

— прописать PTR-запись для сервера
— прописать в /etc/hosts строку

1.1.1.1 домен

где, 1.1.1.1 — один из адресов КД.

После этого добавлять в домен командой

# net ads join -U squid

3) Установка samba.

Ставить будем версию 3.4:

#cd /usr/ports/net/samba34 && make install clean

При выборе опций выбираем такие:

[X] ADS With Active Directory support
[X] WINBIND With WinBIND support
[X] SYSLOG With Syslog support
[X] MAX_DEBUG With maximum debugging

Остальные по желанию. Собственно от самой samb’ы нам нужен только winbind. Если вам нужно больше — выбирайте дополнительные опции. После установки приводим конфигурационный файл (/usr/local/etc/smb.conf) к такому виду:

[global]
bind interfaces only = yes
interfaces = em0
socket address = 10.1.5.1
unix charset = KOI8-U
dos charset = CP866
display charset = KOI8-U
workgroup = mydomain
netbios name = gate
server string = gate
wins support = no
dns proxy = no
log file = /var/log/samba34/log.%m
max log size = 1000
syslog = 0
security = ads
password server = 10.1.5.21
realm = MYDOMAIN.LOCAL
encrypt passwords = true
passdb backend = tdbsam
obey pam restrictions = yes
invalid users = root
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\sUNIX\spassword:* %n\n *Retype\snew\sUNIX\spassword :* %n\n *passwd:*password\supdated\ssuccessfully* .

socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
idmap uid = 10000-20000
idmap gid = 10000-20000
template shell = /bin/sh
winbind enum groups = no
winbind enum users = no
template homedir = /home/%D/%U
client use spnego = yes
winbind use default domain = no
winbind refresh tickets = yes
winbind cache time = 10
restrict anonymous = 2

domain master = no
local master = no
preferred master = no
os level = 0

Ключевыми здесь являются такие параметры:
— workgroup = mydomain : указывает NETBIOS имя домена
— security = ads : будет использоваться доменная авторизация
— password server = 10.1.5.21 : адрес сервера с паролями (в нашем случае это контроллер домена)
— winbind use default domain = no : если у вас единственный домен, то ставим значение yes (у меня в AD несколько доменов)
— winbind refresh tickets = yes : заставляет демона winbind ticket-granting-ticket (TGT), то есть билет kerberos
— winbind cache time = 10 : время, которое windind использует для поиска в кеше пользователей и групп, перед тем, как запросит информацию из ActiveDirectory
— domain master, local master, preferred master : указывает на то, что шлюз не является контроллером домена

Примечание: при использовании параметров и установке значений ‘yes’ наблюдались подвисания, поэтому я принудительно выставил их в no. Лучше их выставлять в ‘yes’:

winbind enum groups = no
winbind enum users = no

Устанавливаем параметры запуска samba. Для этого добавляем такие строки в /etc/rc.conf:

nmbd_enable="NO"
smbd_enable="NO"
winbindd_enable="YES"

Ну и запускаем самбу (точнее winbind):

#/usr/local/etc/rc.d/samba start
winbind starting

4) LightSquid

Моя цель была такова: нужен быстрый, просто анализатор логов (кто куда ходил) и всё. Мощные системы наподобии sams для блокировки мне нужны былию.
Среди многих анализаторов логов squid’a мне понравился Free-SA — небольшой, написан на С (а значит работать будет быстро), но он не подходит на систем x64. Пришлось искать альтернативу. И альтернатива была найдена — LightSquid. Тоже небольшой, достаточно шустрый, но правда написан на perl. Кстати, на сайте opennet.ru есть список популярных анализаторов (http://www.opennet.ru/prog/sml/100.shtml).

Ну что ж, приступим к установке:

#cd /usr/ports/www/lightsquid && make install

Здесь только одна опция:

[X] GDSUPPORT Graphics report support

Я её выбрал (нужна для графического отображения). После установки имеем: конфигурация lightsquid’a лежит по адресу /usr/local/etc/lightsquid, сама статистика будет лежать в /usr/local/www/lightsquid/report ну и модули авторизации по адресу /usr/local/libexec/lightsquid.
Конфигурационный файл /usr/local/etc/lightsquid/lightsquid.cfg приводим к такому виду:

$cfgpath ="/usr/local/etc/lightsquid";
$tplpath ="/usr/local/www/lightsquid/tpl";
$langpath ="/usr/local/share/lightsquid/lang";
$reportpath ="/usr/local/www/lightsquid/report";
$logpath ="/var/log/squid/stat";
$ip2namepath ="/usr/local/libexec/lightsquid";
$debug = 0;
$debug2 = 0;
$squidlogtype = 0;
$ip2name="squidauth";
$timereport = 1;
$lang ="ru-koi8";
$templatename ="base";
$showgrouplink = 0;
$userealname = 0;

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

#/usr/local/www/lightsquid/check-setup.pl
LightSquid Config Checker, (c) 2005-9 Sergey Erokhin GNU GPL

LogPath : /var/log/squid/stat
reportpath: /usr/local/www/lightsquid/report
Lang : /usr/local/share/lightsquid/lang/ru-koi8
Template : /usr/local/www/lightsquid/tpl/base
Ip2Name : /usr/local/libexec/lightsquid/ip2name.squidauth

all check passed, now try access to cgi part in browser

Как видим ошибок нет и можно переходить к созданию отчётов. Рекомендую создавать отчёты каждые полчаса. Для этого в /etc/crontab добавим такую строку:

*/30 * * * * root /usr/local/www/lightsquid/lightparser.pl

Теперь пару слов о доступе к статистике. Сам lightsquid не предусматривает авторизированный доступ к статистике, поэтому, нужно позаботиться самим. Я рекомендую добавить авторизацию через htaccess. Вот, что добавляем в httpd.conf:

Alias /squid "/usr/local/www/lightsquid"

<Directory "/usr/local/www/lightsquid">
AddHandler cgi-script .cgi
AllowOverride None
Order deny,allow
Deny from all
Allow from 10.1.0.0/16
AddDefaultCharset koi8-r
Options FollowSymLinks ExecCGI
DirectoryIndex index.cgi
AuthName "Lightsquid Admin Panel"
AuthType Basic
AuthUserFile /etc/htpasswd
require valid-user
</Directory>

Добавим пользователя для авторизации:

#htpasswd /etc/htpasswd admin

После перечитывания конфигурации apach’a можно в принцыпи пробовать смотреть статистику. НО! Поскольку у меня логины пользователей содержат пробелы, то нужно немного подправить файл самого lightsquid (иначе будет неправильный подсчёт). Если же у вас логины без пробелов — можете пропустить этот этап.

Поскольку авторизация у нас доменная, то править будем файл ip2name.squidauth, который находится в папке /usr/local/libexec/lightsquid. Открываем файл и после строки

$user    =URLDecode($user); #decode user name

добавляем такую

$user =~ s/\s/_/g;

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

Описывать все возможности lightsquid’a не буду, так как на это может уйти не одна статья. Да и ничего сложного в нём нет — достаточно просто по нажимать на ссылки и на освоение уйдёт не более 15 минут.

5) Заключение

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

6) Разное

https://habr.com/post/347212/

squid: авторизация в ActiveDirectory и статистика посещений сайтов: 1 комментарий

  1. korven

    Здравствуйте, отличная статья, думаю нужно знать некоторые полезные команды при настройке squid:
    после редактирования конфига обязательно используйте вот эту команду: squid -k parse, она проверит файл на наличие синтаксических ошибок. Для того, чтобы squid применил внесенные в конфиг изменения без перезапуска самого «себя»)), т.е просто перечитал свой конфиг и применил изменения, делаем так:

    squid -k reconfigure

    Я кстати написал о том, как я настраивал squid на работы с AD вот ссылка http://www.artcom-ufa.ru/posts/2012/07/28/nastroika-squid

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

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