Настройка Squid + SquidGuard + SSL + Active Directory (FreeBSD 12)

В данном материале я постараюсь подробно расписать все этапы настройки прокси-сервера Squid с возможностью фильтрации трафика по группам пользователей Active Directory и фильтрации https сайтов, с возможностью исключений. Все нижепредставленные настройки работают вместе и используют возможности друг друга, поэтому на некоторых этапах буду немного забегать вперед.
Все настройки актуальны для:

  • Контроллер домена: Windows Server 2008 r2
  • Прокси: FreeBSD 12 (x64)

Как Windows так и FreeBSD работают в виртуальной среде.

Для установки софта во FreeBSD буду использовать pkg, т.к. все что нужно включено в состав бинарных пакетов и отдельного конфигурирования из портов не требуется.


СОДЕРЖАНИЕ:

  1. Настройка kerberos;
  2. Настройка Squid с SSL Bump;
  3. Настройка SquidGuard + фильтрация по группам AD;
  4. Proxy Auto-Configuration (PAC);
  5. Настройка групповых политик 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
shalaUpdatesh

Если у вас все завершилось без ошибок, как на скрине, значит база скачалась и установилась, двигаемся дальше.

Добавим в конфигурацию 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.

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

Все на этом настройка закончена, комментарии приветствуются.

СТАТЬИ

МАНУАЛЫ

СХЕМЫ