В данном материале я постараюсь подробно расписать все этапы настройки прокси-сервера Squid с возможностью фильтрации трафика по группам пользователей Active Directory и фильтрации https сайтов, с возможностью исключений. Все нижепредставленные настройки работают вместе и используют возможности друг друга, поэтому на некоторых этапах буду немного забегать вперед.
Все настройки актуальны для:
- Контроллер домена: Windows Server 2008 r2
- Прокси: FreeBSD 12 (x64)
Как Windows так и FreeBSD работают в виртуальной среде.
Для установки софта во FreeBSD буду использовать pkg
, т.к. все что нужно включено в состав бинарных пакетов и отдельного конфигурирования из портов не требуется.
СОДЕРЖАНИЕ:
- Настройка kerberos;
- Настройка Squid с SSL Bump;
- Настройка SquidGuard + фильтрация по группам AD;
- Proxy Auto-Configuration (PAC);
- Настройка групповых политик AD;
1. Настройка kerberos:
Подразумевается что на контроллере домена есть некий пользователь "Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.", имеющий права на просмотр каталогов (информации о группах и пользователях) и в DNS есть "А" запись proxy.domain.lan.
Для начала на контроллере домена необходимо сгенерировать ключ по которому наш прокси-сервер будет авторизоваться и запрашивать данные о пользователе, выполняем на контроллере домена в командной строке:
c:/> ktpass -out "C:\keytabs\proxy.keytab" -princ HTTP/Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. -mapuser "adminsoft" -pass "adminsoftpass" -crypto "All" -ptype "KRB5_NT_PRINCIPAL"
Сгенерированный файл proxy.keytab
сохраняем он нам ещё понадобится.
Установим на прокси сервере kerberos (пакет krb5).
root@proxy# pkg update
root@proxy# pkg install krb5
Редактируем krb5.conf
в /etc/krb5.conf
если такого файла нет создаем его. Ниже я привел файл конфигурации для сети с двумя контролерами домена. Тут нужно в зависимости от вашей конфигурации подредактировать секцию [realms]
настройки kdc
на основании количества доменов в вашей сети. Да и название домена тоже поменять на свое. Регистр имеет значение - домен нужно писать большими буквами аналогично примеру ниже.
krb5.conf
[logging]
default = FILE:/var/log/krb5.log
kdc = FILE:/var/log/krb5kdc.log
[libdefaults]
default_realm = DOMAIN.LAN
clockskew = 500
dns_lookup_realm = false
dns_lookup_kdc = true
ticket_lifetime = 324000
[realms]
TIHSET.LAN = {
kdc = CD.DOMAIN.LAN
CD2.DOMAIN.LAN
admin_server = CD.DOMAIN.LAN
default_domain = DOMAIN.LAN
}
[domain_realms]
.domain.lan = DOMAIN.LAN
domain.lan = DOMAIN.LAN
[login]
krb4_convert = true
krb4_get_tickets = false
2. Настройка Squid с SSL Bump:
Устанавливаем последнюю версию прокси-сервера Squid.
root@proxy# pkg install squid
Для корректной отработки https сайтов прокси серверу нужно знать адрес в запросе пользователя. Если это касается http то тут все просто, а вот зашифрованные данные https нужно как-то расшифровать. Тут нам и поможет встроенная в Squid утилита ssl-bump. Но для начала нужно подговиться к её использованию. Первым делом сгенерируем сертификат которым прокси будет переподписывать проходящие через него сайты.
Выполним:
root@proxy# cd /usr/local/etc/squid
root@proxy# mkdir -p ssl/ssl_cert
root@proxy# chown squid:squid ssl/ssl_cert && chmod 700 ssl/ssl_cert
root@proxy# cd ssl/ssl_cert
root@proxy# openssl req -new -newkey rsa:2048 -sha256 -days 365 -nodes -x509 -extensions v3_ca -keyout proxyCA.pem -out proxyCA.pem
На этапе генерации сертификата вам нужно будет ответить на вопросы касающиеся вашей компании. Заполняем. Создадим тут же и сертификат для браузеров пользователей:
root@proxy# openssl x509 -in proxyCA.pem -outform DER -out proxyCA.der
Так же загрузим в эту директорию бандл сертификатов для корректного отслеживания цепочки сертификационных центров при генерации. Благо эта возможность есть в Squid и помогает избежать много проблем с сертификатами на стороне пользователей.
root@proxy# curl --remote-name --time-cond cacert.pem https://curl.haxx.se/ca/cacert.pem
Сертификаты сделали, теперь нужно подготовить директорию куда прокси будет складывать сгенерированные сертификаты, чтобы не делать это при каждой загрузке сайтов. В Squid для этого используется утилита security_file_certgen. Проверьте её наличие тут /usr/local/libexec/squid
. Для её использования на первоначальном этапе необходимо инициализировать каталог для готовых сертификатов. Для этого выполним команды:
root@proxy# cd /usr/local/etc/squid
root@proxy# mkdir -p ssl/ssl_db
root@proxy# chown squid:squid ssl/ssl_db && chmod 700 ssl/ssl_db
root@proxy# /usr/local/libexec/squid/security_file_certgen -c -s /usr/local/etc/squid/ssl/ssl_db -M 4MB
Там же в /usr/local/etc/squid
создадим директорию /usr/local/etc/squid/krb5
и скопируем в неё файл, который мы подготовили на домене proxy.keytab
. Не забываем про права:
root@proxy# chown squid:squid krb5/proxy.keytab && chmod 700 krb5/proxy.keytab
Чтобы иметь возможность делать исключения из SSL бампинга создадим директорию /usr/local/etc/squid/lists
и в ней же файл direct_host.ls
. Пример файла исключению выглядит так
direct_host.ls
.whatsapp.com
.kontur.ru
.nalog.ru
.domain.com
Опять же назначаем права:
root@proxy# chown -R squid:squid lists
На этом подготовительные настройки закончили, теперь приводим конфигурационный файл прокси к следующему виду:
squid.conf
# Standart acl
acl SSL_ports port 443 # SSL
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
# sslBump acl
acl step1 at_step SslBump1
# Proxy acl
acl direct_host ssl::server_name "/usr/local/etc/squid/lists/direct_host.ls"
# Auth params active directy
auth_param negotiate program /usr/local/libexec/squid/negotiate_kerberos_auth \
-k /usr/local/etc/squid/krb5/proxy.keytab
auth_param negotiate children 5
auth_param negotiate keep_alive on
acl ldap_auth proxy_auth REQUIRED
http_access deny !ldap_auth
# Deny requests to certain unsafe ports
http_access deny !Safe_ports
# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports
# Squid normally listens to port 3128
http_port 3128 ssl-bump \
cert=/usr/local/etc/squid/ssl/ssl_cert/proxyCA.pem \
generate-host-certificates=on dynamic_cert_mem_cache_size=4MB
# Bump ssl settings.
ssl_bump splice localhost
ssl_bump peek step1
ssl_bump splice direct_host
ssl_bump bump all
# path to sslcrd programm
sslcrtd_program /usr/local/libexec/squid/security_file_certgen \
-s /usr/local/etc/squid/ssl/ssl_db -M 4MB
# path to ssl bundle file
tls_outgoing_options cafile=/usr/local/etc/squid/ssl/ssl_cert/cacert.pem
# Uncomment and adjust the following to add a disk cache directory.
cache_mem 128 MB
maximum_object_size 8 MB
maximum_object_size_in_memory 512 KB
cache_dir ufs /var/squid/cache 1000 16 256
# Leave coredumps in the first cache dir
coredump_dir /var/squid/coredump
# Access log for statistic
access_log stdio:/var/log/squid/access.log squid
# Error directory local
error_directory /usr/local/etc/squid/errors/ru
err_page_stylesheet /usr/local/etc/squid/errorpage.css
# Add any of your own refresh_pattern entries above these.
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
Добавим squid в правила запуска приложений. Сгенерируем кеш и запустим.
root@proxy# echo 'squid_enable="YES"' >> /etc/rc.conf
root@proxy# squid -z
root@proxy# service squid start
Squid должен запустится, проверить это можно командой
root@proxy# ps aux | grep squid
Если все нормально, то вы увидите процессы squid - это negotiate_kerberos_auth
, security_file_certgen
и сам squid
. Вот пример с работающего сервера.
На squidGuard не смотрите до него мы еще дойдем.
На данном этапе наш прокси сервер уже умеет обрабатывать https и пропускает в интернет только доменных пользователей. Но сайты доступны все и для всех, плюс сертификаты сервера будут считаться не действительными и настройки прокси придется прописывать всем вручную.
Далее будем все это исправлять.
3. Настройка SquidGuard + фильтрация по группам AD.
Теперь будем устанавливать SquidGuard и ограничивать наших пользователей в интернете.
Ставим соответственно сам SquidGuard:
root@proxy# pkg install squidguard
В Active Directory нужно создать группы безопасности для использования интернета, на основании которых и будем делить права доступа. Я для примера сделал две группы Internet_Basic
и Internet_Full
в domain.lan/Groups` (у вас этот путь может отличаться). Как следует из названия, одна группа будет с полными правами другая с ограниченными. Важно - не используйте кириллицу как в пути, так и в названии группы.
Замечу, что использование кирилицы в наименовании групп, пользователей, политик в Windows, при планирование дальнейшего взаимодействия с *nix машинами и им подобными, использование скриптов Power Shell, переменных окружения и т.д. с огромной долей вероятности повлечет проблемы кодировки и придется все переименовывать. Поэтому рекомендую всегда при конфигурирования использовать латиницу.
Правим кофигурационный файл /usr/local/etc/squid/squidGuard.conf
squidGuard.conf
# Loging directory
logdir /var/log/squidGuard
# Block site base directory
dbhome /usr/local/etc/squid/guardlists/db
# Active Directory setings
ldapbinddn "CN=AdminSoft,CN=Users,DC=domain,DC=lan"
ldapbindpass "adminsoftpass"
ldapprotover 3
stripntdomain true
striprealm true
src internet_basic {
ldapusersearch "ldap://dc.domain.lan:3268/DC=domain,DC=lan?sAMAccountName?sub?(&(sAMAccountName=%s)(memberOf=CN=Internet_Basic%2cOU=groups%2cDC=domain%2cDC=lan))"
}
src internet_full {
ldapusersearch "ldap://dc.domain.lan:3268/DC=domain,DC=lan?sAMAccountName?sub?(&(sAMAccountName=%s)(memberOf=CN=Internet_Full%2cOU=groups%2cDC=domain%2cDC=lan))"
}
# Path into base domain
dest socialnet {
domainlist socialnet/domains
urllist socialnet/urls
}
# ACL rules
acl {
internet_full {
pass all
}
internet_basic {
pass !socialnet all
}
default {
pass none
}
}
Как видно из файла конфигурации я обращаюсь к базе данных доменов /usr/local/etc/squid/guardlists/db
, но после установки естественно там вы ничего не найдете. В качестве базы запрещенных сайтов будем использовать список с www.shallalist.de (нет вы конечно можете и вручную прописать запрещенные сайты).
Итак давайте скачаем себе полную базу претендентов запрещенных сайтов (для начала создадим директорию в которой разместим все списки):
proxy# cd /usr/local/etc/squid/
proxy# mkdir guardlists
proxy# cd guardlists
Для загрузки и обновления базы предлагаю использовать небольшой скрипт, назовем его к примеру
shalaUpdate.sh
и дадим права на запуск chmod +x shalaUpdate.sh
shalaUpdate.sh
#!/bin/sh
squidGuardpath="/usr/local/bin/squidGuard"
squidGuardconf="/usr/local/etc/squid/squidGuard.conf"
squidpath="/usr/local/sbin/squid"
httpget="/usr/local/bin/wget"
tarpath="/usr/bin/tar"
chownpath="/usr/sbin/chown"
dbhome="/usr/local/etc/squid/guardlists/db"
squidGuardowner="squid:squid"
workdir="/usr/local/etc/squid/guardlists/tmp"
shallalist="http://www.shallalist.de/Downloads/shallalist.tar.gz"
echo -e "\e[1;32m Step 1 Download blocklists \e[0m"
$httpget $shallalist -O $workdir/shallalist.tar.gz || exit 1
echo -e "\e[1;32m Step 2 Extract blocklists \e[0m"
$tarpath xzf $workdir/shallalist.tar.gz -C $workdir || exit 1
echo -e "\e[1;32m Step 3 Replace blocklists \e[0m"
rm -r $dbhome
mv $workdir/BL $dbhome
$squidGuardpath -c $squidGuardconf -C all
$chownpath -R $squidGuardowner $dbhome
echo -e "\e[1;32m Step 4 Restart squid \e[0m"
$squidpath -k reconfigure
Думаю параметры указанные в скрипте вам понятны из названия и отдельно описывать каждый не буду. Если вы делали все как описано выше, то в путях к файлам (а это основное что нужно проверить) вам ничего менять не надо.
Запускаем и ждем завершения
proxy# ./shalaUpdate.sh
Если у вас все завершилось без ошибок, как на скрине, значит база скачалась и установилась, двигаемся дальше.
Добавим в конфигурацию squid.conf
наш настроенный squidGuard, для этого после строк
# path to ssl bundle file
tls_outgoing_options cafile=/usr/local/etc/squid/ssl/ssl_cert/cacert.pem
добавляем
# rewrite query to squidGuard
url_rewrite_program /usr/local/bin/squidGuard -c /usr/local/etc/squid/squidGuard.conf \
url_rewrite_bypass off \
url_rewrite_children 8 startup=4 idle=4 \
concurrency=0 forward_max_tries 25
и переконфигурируем Squid
proxy# squid -k reconfigure
Проверяем доступ в интернет, пользователей как из групп Internet_Basic
так Internet_Full
. Группе Internet_Basic
мы закрыли доступ к социальным сетям, тоже можно проверить.
4. Proxy Auto-Configuration (PAC).
Proxy Auto-Configuration (PAC) - хорошей практикой считается использовать параметры автонастройки прокси-сервера, так для этого принято использовать небольшой скрипт на Java в котором можно очень гибко расписать для чего и когда использовать прокси, а для чего нет. Ниже приведу по сути простой пример .pac файла конфигурации для браузеров:
proxy.pac
function FindProxyForURL(url, host)
{
/* Normalize the URL for pattern matching */
url = url.toLowerCase();
host = host.toLowerCase();
/* Don't proxy local hostnames */
if (isPlainHostName(host)) {
return 'DIRECT';
}
/* Don't proxy local domains */
if (dnsDomainIs(host, ".zoom.us") || (host == "zoom.us") ||
dnsDomainIs(host, ".hostname.ru") || (host == "hostname.ru")) {
return 'DIRECT';
}
if (isResolvable(host)) {
var hostIP = dnsResolve(host);
/* Don't proxy non-routable addresses (RFC 3330) */
if (isInNet(hostIP, '0.0.0.0', '255.0.0.0') ||
isInNet(hostIP, '10.0.0.0', '255.0.0.0') ||
isInNet(hostIP, '127.0.0.0', '255.0.0.0') {
return 'DIRECT';
}
/* Don't proxy local addresses.*/
if (false) {
return 'DIRECT';
}
}
if (url.substring(0, 5) == 'http:' ||
url.substring(0, 6) == 'https:' ||
url.substring(0, 4) == 'ftp:' ||
url.substring(0, 4) == 'wss:') {
return 'PROXY proxy.domain.lan:3128';
}
return 'DIRECT';
}
Как вы понимаете, это образец скрипта автонастройки, и вы без проблем можете его доработать как угодно.
Единственное, что следует тут упомянуть это то, что Microsoft в последних патчах безопасности закрыли возможность размещать .pac файл в сетевых папках. Поэтому для доступа к файлу самый простой способ будет установить веб-сервер и прописать в настройках браузера ссылку на этот файл, что-то вроде этого http://proxy.domain.lan/proxy.pac
. Тем более если мы хотим видеть статистику использования интернета (я предпочитаю Lightsquid
) веб-сервер нам понадобится. Если не хотите заморачиваться с автонастройкой, то без проблем можно указать браузеру адрес и порт прокси, в нашем случае адрес:proxy.domain.lan порт:3128.
Про настройку
Lightsquid + Nginx
напишу в следующей статье, так как для этого материала информации итак очень много.
5. Настройка групповых политик AD.
Итак мы подошли к финальной части. Осталось распространить настройки прокси на компьютеры домена и добавить наш сертификат в "Доверенные корневые центры сертификации", чтобы браузеры не ругались. Еще заблокируем пользователям самим менять настройки прокси.
Подключаемся на контролер домена и открываем оснастку редактирования групповых политик gpedit.msc
.
Создаем политику в нашем юните, к примеру назовем ее Domain_Proxy_Settings
и прописываем следующие настройки:
Первый шаг: - запрещаем пользователям менять настройки прокси сервера самолично.
В User Configuration > Polices > Administrative Templates > Windows Components > Internet Explorer
Меняем три параметра, как на скрине.
Второй шаг: - прописываем настройки прокси сервера автоматически.
В User Configuration > Preferences > Control Panel Settings > Internet Settings
правой кнопкой New > Internet Explorer 10
.
И прописываем наши параметры. Обратите внимание, что я использую скрипт автоматической настройки, если вы не хотите этого делать, то просто укажите параметры в полях ниже (не забудьте отключить политику, в которой мы включили автонастройку).
Третий шаг: - добавим наш сертификат в доверенные.
Берем файл сертификата сгенерированный на шаге 2 формата .der (proxyCA.der
) и добавляем его по пути Computer Configuration > Policies > Windows Settings > Security Settings > Public Key Policies/Trusted Root Certification Authorities > Certificates
.
Четвертый шаг: - добавляем фильтры безопасности.
Переходим на вкладку Security Filter
удаляем все группы безопасности и добавляем наши Internet_Basic
и Internet_Full
.
Перезагружаем любой доменный компьютер и пробуем войти в интернет под пользователем одной из наших групп.
Все на этом настройка закончена, комментарии приветствуются.