Предположим, что у вас есть домен на 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/
http://www.delayer.org/2015/06/squid-samba4-kerberos-authorization.html
Один коментар до “squid: авторизация в ActiveDirectory и статистика посещений сайтов”
Здравствуйте, отличная статья, думаю нужно знать некоторые полезные команды при настройке squid:
после редактирования конфига обязательно используйте вот эту команду: squid -k parse, она проверит файл на наличие синтаксических ошибок. Для того, чтобы squid применил внесенные в конфиг изменения без перезапуска самого “себя”)), т.е просто перечитал свой конфиг и применил изменения, делаем так:
squid -k reconfigure
Я кстати написал о том, как я настраивал squid на работы с AD вот ссылка http://www.artcom-ufa.ru/posts/2012/07/28/nastroika-squid