Этот мануал был написан в связи производственной необходимостью мониторить трафик (http и https) пользователей, а также распределения доступа по белым и черным спискам. За основу были взяты статьи: эта и вот эта , в которых использовалась технология peek-n-splice. В данных статьях конфигурация предполагает использование хоста со squid как шлюз, после доработки конфига, получился полноценный прокси-сервер с возможностью распределения прав доступа по группам из Active Directory. По завершению конфигурирования встал вопрос передачи настроек прокси-сервера для пользователей. В виду того, что в офисе часто ноутбуки берут домой — вся затея зашла в тупик. Изначально рассматривался вариант выдачи настроек прокси-сервера через DHCP, но он не самый лучший, т. к. офисы в разных подсетях, и разное оборудование, выходом из данной ситуации стал WPAD. Вкратце о данной технологии можно сказать так, клиентские машины на OS Windows ищут хост с именем wpad.example.ru (вплоть до доменов третьего уровня), чтобы запросить файл настроек для работы в сети. Исходя из такого принципа, нужно поднять веб-сервер, который просто бы отдавал файл wpad.pac Можно на самом хосте с прокси-сервером поднять веб-сервер (что и было сделано), а в DNS-сервере создать cname wpad на прокси-сервер. Прокси-сервер лучше использовать с возможностью сбора и просмотра статистики, благо выбор предостаточный. В виду некоторых консервативных соображений, было решено выбрать SARG. Он легкий в настройке, достаточно приемлемая статистика для офиса со штатом до 100 сотрудников.
- 1 Введение
- 1.1 Упрощенная схема работы WPAD
- 1.2 Плюсы и минусы работы WPAD
- 1.3 Squid Peek-n-splice — how to it works
- 1.4 Плюсы и минусы Peek-n-splice
- 1.5 Необходимое для решения задачи
- 2 Конфигурирование операционной системы и установка Squid
- 2.1 Параметры сборки Squid
- 2.2 Установка пакетов из официальных репозиториев
- 2.3 Ручная установка Squid и дополнительных пакетов
- 2.4 Генерация сертификата для squid
- 2.5 Установка прав доступа на swap-каталог для squid
- 2.6 Конфигурационный файл squid
- 2.7 Настройка файла /etc/hosts
- 2.8 Выключаем selinux
- 2.9 Генерация swap
- 2.10 Включение демона squid, проверка конфигурационного файла
- 3 Интеграция с контроллером домена Active Directory 2012R2
- 3.1 Конфигурация kerberos
- 3.2 Создание DNS-записи
- 3.3 Создание служебного пользователя и файла krb5.keytab
- 3.4 Рекомендуемые права на файл krb5.keytab
- 3.5 Группы в Active Directory для регулировки доступа в Интернет
- 3.6 Проверка авторизации в Active Directory при помощи файла krb5.keytab
- 4 WPAD
- 5 Статистика трафика
- 5.1 Установка SARG из исходников
- 5.2 Конфигурирование SARG
- 5.3 Расписание генерации отчетов посещаемости
- 5.4 Конфигурация web-сервера
- 5.5 Авторизация на сайте со статистикой
- 6 Групповые политики
1.1 Упрощенная схема работы WPAD
— Клиент на ОС Windows обращается к DNS-серверу с запросом на хост wpad.example.ru, и DNS-сервер имя соответствующую запись указывает куда обратиться. Далее, клиент обращается к wpad.example.ru с запросом на файл настроек. Получив его, начинает действовать соответственно инструкций в нём.
1.2 Чем хороша данная технология
Плюсы:
— нет необходимости через GPO прописывать всем клиентам адрес-прокси
— Мобильность сотрудников (доступ к интернету вне офиса)
— Чтобы отключить использование данной технологии, достаточно отключить в «Свойствах браузера» — «Автоматическое получение настроек»
Минусы:
— «Автоматическое получение настроек» можно отключить любому пользователю, поэтому данную функцию лучше оставить включенной и запретить ее изменение через GPO
1.3 Squid Peek-n-splice — how to it works
Сотрудник пытается зайти на сайт с https через прокси. При установке зашифрованного соединие происходит «приветствие», которое передается в открытом виде, прокси-сервер его перехватывает, и исходя из конфигурации, squid разрешает или запрещает соединение. Т.е. перехватили на посмотреть «приветствие», разрешили или дропнули соединение.
1.4 Плюсы и минусы Peek-n-splice
Плюсы:
— Это не MITM-атака, и не будет проблем с банк-клиентами
— Отображение доменных имен в статитстике сайтов запрашиваемых по https
Минусы:
— К сожалению, нельзя полностью просмотреть какая именно интернет-страница была открыта как при MITM-атаке
— Данная конфигурация хорошо себя показала только на CentOS (на Debian были проблемы, через некоторое время случался kernel-panic)
1.5 И так, теперь стоит отметить что дано
— Хост с Active Directory 2012R2 (метод авторизация пользователей — Kerberos)10.0.0.9
— Хост с CentOS 7 (x64) (он же веб-сервер для отдачи wpad.pac, он же прокси-сервер) 10.0.0.10
— Тестовый хост с ОС Windows для проверки работы 10.0.0.11
«Поехали» Гагарин Ю.А.
2 Конфигурирование операционной системы и установка Squid
Процесс установки CentOS описывать нет смысла. Так что будем иметь в виду, что у нас свежеустановленный CentOS 7 x64. Итак, чтобы Squid работал одинаково хорошо с http и https трафиком, необходимо следующее:
2.1 Squid должен быть собран с такими параметрами
Squid Cache: Version 3.5.16
Service Name: squid
configure options: '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--program-prefix=' '--prefix=/usr' '--exec-prefix=/usr' '--bindir=/usr/bin' '--sbindir=/usr/sbin' '--sysconfdir=/etc' '--datadir=/usr/share' '--includedir=/usr/include' '--libdir=/usr/lib64' '--libexecdir=/usr/libexec' '--sharedstatedir=/var/lib' '--mandir=/usr/share/man' '--infodir=/usr/share/info' '--verbose' '--exec_prefix=/usr' '--libexecdir=/usr/lib64/squid' '--localstatedir=/var' '--datadir=/usr/share/squid' '--sysconfdir=/etc/squid' '--with-logdir=$(localstatedir)/log/squid' '--with-pidfile=$(localstatedir)/run/squid.pid' '--disable-dependency-tracking' '--enable-follow-x-forwarded-for' '--enable-auth' '--enable-auth-basic=DB,LDAP,NCSA,NIS,PAM,POP3,RADIUS,SASL,SMB,getpwnam,fake' '--enable-auth-ntlm=smb_lm,fake' '--enable-auth-digest=file,LDAP,eDirectory' '--enable-auth-negotiate=kerberos,wrapper' '--enable-external-acl-helpers=wbinfo_group,kerberos_ldap_group,LDAP_group,delayer,file_userip,SQL_session,unix_group,session,time_quota' '--enable-cache-digests' '--enable-cachemgr-hostname=localhost' '--enable-delay-pools' '--enable-epoll' '--enable-icap-client' '--enable-ident-lookups' '--enable-linux-netfilter' '--enable-removal-policies=heap,lru' '--enable-snmp' '--enable-storeio=aufs,diskd,ufs,rock' '--enable-wccpv2' '--enable-esi' '--enable-ssl-crtd' '--enable-icmp' '--with-aio' '--with-default-user=squid' '--with-filedescriptors=16384' '--with-dl' '--with-openssl' '--with-pthreads' '--with-included-ltdl' '--disable-arch-native' '--enable-ecap' '--without-nettle' 'build_alias=x86_64-redhat-linux-gnu' 'host_alias=x86_64-redhat-linux-gnu' 'CFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' 'LDFLAGS=-Wl,-z,relro ' 'CXXFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' 'PKG_CONFIG_PATH=:/usr/lib64/pkgconfig:/usr/share/pkgconfig' —enable-ltdl-convenience
Либо же можно скачать архив с собранным squid и его зависимостями.
2.2 Установка необходимых пакетов из официальных репозиториев
Стоит отметить, что для установки кальмара нужны некоторые зависимости. К сожалению, у CentOS довольно скудные официальные репозитории, поэтому некоторые пакеты надо качать с неофициальных. Установка необходимых пакетов из оф.репозиториев:
# yum install -y libtool-ltdl perl-DBI perl-Digest-MD5 cyrus-sasl-gssapi krb5-workstation
2.3 Ручная установка Squid и дополнительных пакетов
# rmp -Uvh squid-3.5.8-4.el7.centos.x86_64.rpm libecap-1.0.0-3.el7.centos.x86_64.rpm squid-helpers-3.5.8-4.el7.centos.x86_64.rpm perl-Crypt-OpenSSL-X509-1.803-4.el7.x86_64.rpm
Если что-то не так, в терминале отобразится чего не хватает.
2.4 Для корректной работы squid с применением peek-n-splice, необходимо сгенерировать сертификат
# cd /etc/squid
# openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -keyout squidCA.pem -out squidCA.pem
2.5 Установка прав доступа для каталога swap
# chown squid:squid /var/spool/squid
2.6 конфигурационный файл /etc/squid/squid.conf
auth_param negotiate program /usr/lib64/squid/negotiate_kerberos_auth -s HTTP/sq.example.ru@EXAMPLE.RU
auth_param negotiate children 60
auth_param negotiate keep_alive off
external_acl_type inet_medium ttl=300 negative_ttl=60 %LOGIN /usr/lib64/squid/ext_kerberos_ldap_group_acl -g Internet-medium@EXAMPLE.RU
external_acl_type inet_full ttl=300 negative_ttl=60 %LOGIN /usr/lib64/squid/ext_kerberos_ldap_group_acl -g Internet-full@EXAMPLE.RU
external_acl_type inet_low ttl=300 negative_ttl=60 %LOGIN /usr/lib64/squid/ext_kerberos_ldap_group_acl -g Internet-low@EXAMPLE.RU
acl localnet src 10.0.0.0/24
acl localnet src 192.168.0.0/24
acl my_full external inet_full
acl my_medium external inet_medium
acl my_low external inet_low
acl auth proxy_auth REQUIRED
# помимо дефолтного 443, для себра бизнес онлайн нуже доп. порт 9443
acl SSL_ports port 443 9443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
#В данной конфигурации whitelist — это список разрешенных сайтов для группы пользователей Internet-low@EXAMPLE.RU (доступ только на те сайты, которые в whitelist.txt)
#А blocked_http.txt — список запрещенных сайтов для группы Internet-medium@EXAMPLE.RU (на все сайты можно заходить, кроме тех, которые в blocked_http.txt)
acl white_list dstdomain "/etc/squid/whitelist.txt"
acl black_list dstdomain "/etc/squid/blocked_http.txt"
dns_nameservers 10.0.0.9
# access rule
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access deny !auth
#http_access allow my_low white_list
#http_access deny my_low
#http_access deny my_medium black_list
#http_access allow my_medium
#http_access allow my_full
#http_access allow my_full
http_access deny my_medium black_list
http_access allow my_medium
http_access allow my_low white_list
http_access deny my_low all
http_access allow my_full
# Разрешаем локалхост
http_access allow localhost
# Запрещаем все остальное
http_access deny all
#прозрачный порт указывается опцией intercept
http_port 10.0.0.10:3128 intercept options=NO_SSLv3:NO_SSLv2
#Непрозрачный порт, через который происходит взаимодействие клиентских хостов с прокси-сервером
http_port 10.0.0.10:3130 options=NO_SSLv3:NO_SSLv2
#HTTPS порт
https_port 10.0.0.10:3129 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/etc/squid/squidCA.pem
always_direct allow all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER
#Данная опция нужна для корректной работы peek-n-splice. Сам файл blocked_https.txt ни на что не влияет, но и он не должен быть пустым. Магия.
#
acl blocked ssl::server_name "/etc/squid/blocked_https.txt"
acl step1 at_step SslBump1
ssl_bump peek step1
#терминируем соединение, если клиент заходит на запрещенный ресурс
ssl_bump terminate blocked
ssl_bump splice all
sslcrtd_program /usr/lib64/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|?) 0 0% 0
refresh_pattern. 0 20% 4320
cache_dir aufs /var/spool/squid 20000 49 256
maximum_object_size 61440 KB
minimum_object_size 3 KB
#httpd_suppress_version_string on
#visible_hostname PROXYSERVER
cache_swap_low 90
cache_swap_high 95
maximum_object_size_in_memory 512 KB
memory_replacement_policy lru
logfile_rotate 4
2.7 Предварительно необходимо привести файл /etc/hosts к такому содержанию
127.0.0.1 localohost
10.0.0.10 sq.example.ru sq
2.8 Выключаем selinux
В файле /etc/selinux/config устанавливаем значение:
SELINUX=disabled
2.9 генерация swap
# squid -z
2.10 Включение демона squid, проверка конфигурационного файла
# systemctl enable squid
# squid -k parse
Варнингов и эрроров не должно быть. Если же что-то есть — необходимо проверить настройки.
3 Интеграция с контроллером домена Active Directory 2012R2
Интеграция с контроллером домена необходима для того, чтобы пользователи домена могли авторизовываться на прокси-сервере по протоколу Kerberos. Самое разумное решение — оставить только Kerberos ввиду того, что данный метод самый безопасный, авторизация происходит автоматически. Что же касается клиентских машинах которые вне домена, то и здесь нет проблем, логин и пароль можно ввести вручную во всплывающем окне авторизации. Проверено, работает.
3.1 Конфигурационный файл /etc/krb5.conf
Конфигурационный файл /etc/krb5.conf необходимо привести к следующему виду:
default_realm = EXAMPLE.RU
dns_lookup_kdc = no
dns_lookup_realm = no
ticket_lifetime = 24h
default_keytab_name = /etc/krb5.keytab
; for Windows 2008 with AES
default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
[realms]
EXAMPLE.RU = {
kdc = dc1.example.ru
admin_server = dc1.example.ru
default_domain = example.ru
}
[domain_realm]
.example.ru = EXAMPLE.RU
example.ru = EXAMPLE.RU
3.1 Создание DNS-записи
Всем отлично известно, что Active Directory тесно завязан с DNS, именно поэтому необходимо создать узел (A или ААА) c указание имени хоста и его ip-адреса (Получается запись sq.example.ru c ip-адресом 10.0.0.10). А также необходимо создать служебного пользователя, например squid.
3.3 Создание служебного пользователя и файла krb5.keytab
Генерация krb5.keytab. В командной строке на контроллере домена с правами администратора необходимо выполнить данную команду:
ktpass -princ HTTP/sq.example.ru@EXAMPLE.RU -mapuser squid@EXAMPLE.RU -crypto rc4-hmac-nt -pass Pa$$wd12 -ptype KRB5_NT_PRINCIPAL -out C:
Сам файлик krb5.keytab переместить (Можно при помощи WinSCP) на sq.example.ru в каталог /etc.
3.4 Рекомендуемые права на файл krb5.keytab
После перемещения krb5.keytab, рекомендуется понизить права доступа к файлу
# chown squid:squid /etc/krb5.keytab && chmod 644 /etc/krb5.keytab
3.5 Группы доступа AD
В ActiveDirectory в OU Users необходимо создать три группы, согласно которых будет распределен доступ в Интернет: Internet-full, Internet-medium, Internet-low.
3.6 Проверка авторизации
Проверка авторизации в Active Directory при помощи файла /etc/krb5.keytab
# kinit -V -k -t /etc/krb5.keytab HTTP/sq.example.ru@EXAMPLE.RU
Вывод команды должен быть примерно такой:
Using default cache: /tmp/krb5cc_0
Using principal: HTTP/sq.example.ru@EXAMPLE.RU
Using keytab: /etc/krb5.keytab
Authenticated to Kerberos v5
А klist должен отобразить следующее:
Default principal: HTTP/sq.example.ru@EXAMPLE.RU
Valid starting Expires Service principal
09.10.2016 22:19:20 10.10.2016 08:19:20 krbtgt/EXAMPLE.RU@EXAMPLE.RU
renew until 10.10.2016 22:19:20
На это настройка Squid практически закончена, теперь перезагружаем хост для применения настроек. После перезагрузки для теста можно вручную прописать прокси в настройках sq.example.ru указав порт 3130.
4 WPAD
4.1 Установка и конфигурирование web-сервера apache2
Установка web-сервера:
# yum install -y httpd
После установки включаем в автозагрузку:
# systemctl enable httpd
Запускаем:
# systemctl start httpd
Если попробовать открыть в браузере доменное имя sq.example.ru, должна открыться тестовая страница apache2.
Далее необходимо создать /var/www/html/wpad.pac файл со следующим содержанием:
{
// var ip_host = dnsResolve(host);
// var localnet = «192.168.0.0»;
// var localhost = «127.0.0.0»;
// var localnet = «10.0.0.0»;
if (isInNet( host, «192.168.0.0», «255.255.255.0») ||
isInNet( host, «10.0.0.0», «255.255.255.0») ||
isInNet( host, «127.0.0.0», «255.0.0.0») ||
shExpMatch( host, "*.example.ru"))
{ return «DIRECT»; }
if (dnsDomainIs( host, "*.inet-example.ru" ))
{ return «DIRECT»; }
return «PROXY sq.exmaple.ru:3130»;
}
4.2 Описание файла wpad.pac
По дефолту в каталоге /var/www/html/wpad.pac файл отдается всем без дополнительных настроек apache2, а это как раз необходимо для корректного взаимодействия с клиентскими машинами на ОС Windows.
Строчки
if (isInNet( host, "192.168.0.0", "255.255.255.0") ||
isInNet( host, "10.0.0.0", "255.255.255.0") ||
Обозначают, что обращения к хостам в подсетях 192.168.0.0/24, 10.0.0.0/24 и 127.0.0.0/8 (последнее нужно для корректной работы сервисов при обращении к localhost) передаются напрямую, а также напрямую происходит соединение с домеными хостами .example.ru:
Строчки:
if (dnsDomainIs( host, "*.inet-example.ru" ))
{ return "DIRECT"; }
Обозначают, что при обращении к доменным именам .inet-example.ru происходит напрямую
Если запрашиваемый ресурс не попадает под вышеперечисленные условия, выполняется следующее:
return "PROXY sq.exmaple.ru:3130";
4.3 Создание CNAME
На DNS-сервере Active Directory необходимо создать cname wpad (FQDN wpad.example.ru) на sq.example.ru.
Для проверки необходимо открыть в браузере wpad/wpad.dat и файл wpad.dat должен автоматически скачаться. Таким образом, все хосты скачивают данный файл, и исходя из содержимого действуют. Рекомендуется сделать релог или перезагрузить все компьютеры в домене на ОС Windows, чтобы произошло скачивание файла.
5 Статистика
5.1 Установка SARG из исходников
Если не был установлен gcc ранее, сейчас самое время:
# yum install -y gcc gd gd-devel make wget
# wget http://liquidtelecom.dl.sourceforge.net/project/sarg/sarg/sarg-2.3.10/sarg-2.3.10.tar.gz
# tar -xvzf sarg-2.3.10.tar.gz
# cd sarg-2.3.10
# ./configure
# make
В файле po/Makefile.in.in указана версия gettext как 0.18, чтобы не было ошибки при make install, необходимо изменить на 0.19:
# make install
5.2 Конфигурирование SARG
Стандартный файл конфигурации /usr/local/etc/sarg.conf лучше забекапить:
# mv /usr/local/etc/sarg.conf /usr/local/etc/sarg.conf.default
Теперь создаем файл sarg.conf со следующим содержанием:
access_log /var/log/squid/access.log
output_dir /var/www/html/squid-reports
date_format e
overwrite_report yes
language UTF-8
5.3 Расписание генерации отчетов при помощи cron
# crontab -e
Добавляем строчку:
55 23 * * * /usr/local/bin/sarg -xd day-0
Данная строчка указывает, что отчеты будут генерироваться каждый день и за текущий день в 23:55
5.4 Конфигурация web-сервера
На ранее установленный веб-сервер можно еще возложить задачу отображение отчетов, с запросом ввода логина и пароля для авторизации. Создаем файл /etc/httpd/conf.d/sarg.conf со следующим сожержанием:
<Directory /var/www/html/squid-reports/>
AuthType Basic
AuthName «Basic Authentication»
AuthUserFile /etc/httpd/conf/.htpasswd
require valid-user
AddDefaultCharset UTF-8
5.5 Авторизация на сайте со статистикой
Генерация файла логина и пароля для авторизации
# htpasswd -c /etc/httpd/conf/.htpasswd administrator
Перезапуск apache2:
# systemctl restart httpd
При попытке открыть sq.example.ru/reports будет предложено ввести логин и пароль. В случае успешной авторизации можно просмотреть статистику.
6 Групповые политики
Здесь все неоднозначно и может зависит, от каких-то особенностей. В текущей задаче было разумным решением исключить возможность установки прокси-сервера пользователя, или же отключения «Автоматического определения параметров».
6.1 Редактирование GPO
Для запрета ввода прокси-сервера или изменения настроек по автоматическому определению параметров, можно воспользоваться групповой политикой. Создаем и связываем групповую политику с OU например, office.
Редактируем групповую политику:
Пользователь → Политики → Административные шаблоны → Компоненты Windows → Internet Explorer
В данном каталоге найти параметры и перевести в статус «Включено»:
«Запретить изменение параметров прокси»
«Отключить изменение параметров автоматической»
В заключение сказать могу вот что, данная конфигурация успешно работает по настоящее время с весны 2016-го, и отлично себя зарекомендовала. На все вопросы буду рад ответить.
Автор: Dewey_Kendall