Squid з фільтрацією HTTPS без підміни сертифіката, інтеграція з Active Directory 2012R2 + WPAD

Цей мануал був написаний в зв'язку з виробничою необхідністю моніторити трафік (http і https) користувачів, а також розподілу доступу з білим і чорним списками. За основу були взяті статті: і ось ця , в яких використовувалась технологія peek-n-splice. В даних статтях конфігурація припускає використання хоста з squid як шлюз, після доопрацювання конфига, вийшов повноцінний проксі-сервер з можливістю розподілу прав доступу по групах з Active Directory. По завершенню конфігурування постало питання передачі налаштувань проксі-сервера для користувачів. В виду того, що в офісі часто ноутбуки беруть додому — вся справа зайшла в глухий кут. Спочатку розглядався варіант видачі налаштувань проксі-сервера DHCP, але він не найкращий, оскільки офіси в різних підмережах, і різне обладнання, виходом з даної ситуації став WPAD. Коротко про даної технології можна сказати так, клієнтські машини на OS Windows шукають хост з ім'ям wpad.example.ru (аж до доменів третього рівня), щоб отримати файл налаштувань для роботи в мережі. Виходячи з такого принципу, потрібно підняти веб-сервер, який би віддавав файл wpad.pac Можна на самому хості з проксі-сервером підняти веб-сервер (що і було зроблено), а в DNS-сервері створитиа wpad проксі-сервер. Проксі-сервер краще використовувати з можливістю збору і перегляду статистики, благо вибір предостаточный. В очах деяких консервативних міркувань, було вирішено вибрати SARG. Він легкий у налаштуванні, досить прийнятна статистика для офісу зі штатом до 100 співробітників.

Зміст
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 -v$ squid -v
Squid Cache: Version 3.5.16
Service Name: squid
options configure: '--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-реєстрації=$(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-perl DBI-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
squid.conf### negotiate kerberos
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 необхідно привести до наступного вигляду:

krb5.conf[libdefaults]
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 -princes town включно 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 повинен відобразити наступне:

klistTicket cache: FILE:/tmp/krb5cc_0
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 httpd start

Якщо спробувати відкрити в браузері доменне ім'я sq.example.ru, повинна відкритися тестова сторінка apache2.

Далі необхідно створити /var/www/html/wpad.pac файл з наступним змістом:

wpad.pacfunction FindProxyForURL(url, host)
{
// 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.ua"))
{ return «DIRECT»; }
if (dnsDomainIs( host, ".*.inet-example.ua" ))
{ return «DIRECT»; }
return «PROXY sq.exmaple.ua: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.ua" ))
{ return "DIRECT"; }

Означають, що при зверненні до доменним іменам .inet-example.ru відбувається безпосередньо

Якщо запитуваний ресурс не підпадає під вищеперелічені умови, виконується наступне:

return "PROXY sq.exmaple.ua:3130";

4.3 Створення CNAME
На DNS-сервері Active Directory необхідно створити а 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 з наступним сожержанием:

sarg.confAlias /reports /var/www/html/squid-reports/

<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-го, і відмінно себе зарекомендувала. На всі питання буду радий відповісти.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.