Этот мануал был написан в связи производственной необходимостью мониторить трафик (http и https) пользователей, а также распределения доступа по белым и черным спискам. За основу были взяты статьи: эта и вот эта , в которых использовалась технология peek-n-splice. В данных статьях конфигурация предполагает использование хоста со squid как шлюз, после доработки конфига, получился полноценный прокси-сервер с возможностью распределения прав доступа по группам из Active Directory. По завершению конфигурирования встал вопрос передачи настроек прокси-сервера для пользователей. В виду того, что в офисе часто ноутбуки берут домой — вся затея зашла в тупик. Изначально рассматривался вариант выдачи настроек прокси-сервера через DHCP, но он не самый лучший, т. к. офисы в разных подсетях, и разное оборудование, выходом из данной ситуации стал WPAD. Вкратце о данной технологии можно сказать так, клиентские машины на OS Windows ищут хост с именем wpad.example.ru (вплоть до доменов третьего уровня), чтобы запросить файл настроек для работы в сети. Исходя из такого принципа, нужно поднять веб-сервер, который просто бы отдавал файл wpad.dat Можно на самом хосте с прокси-сервером поднять веб-сервер (что и было сделано), а в DNS-сервере создать cname 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.dat, он же прокси-сервер) 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
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 Установка прав доступа для каталога swap


# chown squid:squid /var/spool/squid

2.5 конфигурационный файл /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 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

#Непрозрачный порт, через который происходит взаимодействие клиентских хостов с прокси-сервером

http_port 10.0.0.10:3130 options=NO_SSLv3:NO_SSLv2

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

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.6 Предварительно необходимо привести файл /etc/hosts к такому содержанию


127.0.0.1    localohost
10.0.0.10    sq.example.ru    sq

2.7 Настраиваем selinux


В файле /etc/selinux/config должно быть значение:
SELINUX=enforcing

Устанавливаем пакет для работы с selinux:
# yum install policycoreutils-python

Добавляем правила selinux

Разрешаем подключения к кальмару:
# setsebool -P squid_connect_any on

Разрешаем kerberos:
# setsebool -P allow_kerberos  on

Разрешаем подключения к кальмару на 3130 порту:
# semanage port -a -t squid_port_t -p tcp 3130

После изменения параметров selinux, необходимо перезагрузить систему для их применения.
# reboot


2.8 генерация swap


# squid -z

2.9 Включение демона squid, проверка конфигурационного файла


# systemctl enable squid
# squid -k parse

Варнингов и эрроров не должно быть. Если же что-то есть — необходимо проверить настройки.

2.10 Разрешаем форвардинг трафика


# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

Применяем настройку налету:
# sysctl -p


3 Интеграция с контроллером домена Active Directory 2012R2


Интеграция с контроллером домена необходима для того, чтобы пользователи домена могли авторизовываться на прокси-сервере по протоколу Kerberos. Самое разумное решение — оставить только Kerberos ввиду того, что данный метод самый безопасный, авторизация происходит автоматически. Что же касается клиентских машинах которые вне домена, то и здесь нет проблем, логин и пароль можно ввести вручную во всплывающем окне авторизации. Проверено, работает.

3.1 Конфигурационный файл /etc/krb5.conf


Конфигурационный файл /etc/krb5.conf необходимо привести к следующему виду:

krb5.conf
[libdefaults]
default_realm = EXAMPLE.RU
ticket_lifetime = 24h
default_keytab_name = /etc/krb5.keytab

[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.2 Создание DNS-записи


Всем отлично известно, что Active Directory тесно завязан с DNS, и для корректной работы авторизации, необходимо создать узел (A или ААА) c указание имени хоста и его ip-адреса (Получается запись sq.example.ru c ip-адресом 10.0.0.10).

3.3 Варианты интеграции с доменом


И так, есть два стула варианта интеграции с доменом. Первый вариант — средствами Windows (ktpass), второй вариант — средствами Linux (Msktutil). Windows вариант хорош тем, что можно отключить срок действия пароля для пользователя squid. Версия Linux хороша тем, что можно вводить в домен через создание учетной записи компьютера.

3.3.1 Интеграция средствами Windows


Создаем пользователя в AD, например squid
Теперь генерируем krb5.keytab. В командной строке на контроллере домена с правами администратора необходимо выполнить данную команду:

C:\Windows\system32> 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.3.2 Интеграция средствами Linux


В архиве со сквидом и зависимостями также приложен msktutil, устанавливаем его:

# rpm -Uhv msktutil-0.5.1-2.el7.x86_64.rpm


Теперь выполняем следующую команду:

# msktutil -c -b "CN=COMPUTERS" -s HTTP/sq.example.ru -k /etc/krb5.keytab --computer-name sq-k --upn HTTP/sq.example.ru --server dc1.example.ru --verbose --enctypes 28

В случае успеха, вывод команды будет большим, копировать сюда не вижу смысла. Ошибок и варнингов быть не должно. Стоит обратить внимание на --computer-name sq-k это не опечатка. Имя хоста должно отличаться.

В виду необходимости обновлять пароль для учетной записи компьютера, делать это можно через cron.
 # crontab -e

В него необходимо добавить задание:
00 3 * * *      msktutil --auto-update --verbose --computer-name sq-k 


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 должен отобразить следующее:

klist
Ticket 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 start httpd

Если попробовать открыть в браузере доменное имя sq.example.ru, должна открыться тестовая страница apache2.

Далее необходимо создать /var/www/html/wpad.dat файл со следующим содержанием:

wpad.dat
function 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.ru"))
{ return «DIRECT»; }
if (dnsDomainIs( host, "*.inet-example.ru" ))
{ return «DIRECT»; }
return «PROXY sq.exmaple.ru:3130»;
}

4.2 Описание файла wpad.dat


По дефолту в каталоге /var/www/html/wpad.dat файл отдается всем без дополнительных настроек 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 со следующим сожержанием:

sarg.conf
Alias /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-го, и отлично себя зарекомендовала. На все вопросы буду рад ответить.

UPD №1: 12.11.16
1 Были убраны из конфига сквида лишние строки портов 3128 и 3129.
2 включил selinux и добавил правила.
3 Была убрана генерация сертификата из мануала(без него работает)
4 Мелкие исправления

UPD №2: 20.11.16
1 Были убраны из конфига krb5.conf лишние строки
2 Добавлен метод интеграции с AD через Msktutil
3 Добавлен форвардинг
4 Обновлен архив со сквидом и зависимостями
Пригодилась ли вам данная статья?

Проголосовал 21 человек. Воздержавшихся нет.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Поделиться с друзьями
-->

Комментарии (46)


  1. mikkisse
    10.11.2016 15:06

    Спасибо за статью. Один вопрос — вы не пробовали подружить squid и selinux? Может не стоит его так на корню сразу рубить?


    1. kolu4iy
      11.11.2016 09:40

      Тут кроме безопасности еще бывает вопрос производительности. Научить — да, можно. Хватит ли сервера — вопрос. Я с этим столкнулся на web-серверах: с включенным selinux производительность php ниже чем на десктопе разработчика, несмотря на платформу, ядра и память…
      В общем случае, безусловно, вы правы — надо настраивать, пользуясь например CentOS wiki


      1. mikkisse
        11.11.2016 10:19

        Это понятно, что каждый запрос к http серверу пройдет через политики selinux, и да, возможно, будет наблюдаться снижение производительности. Но тут уже кому что. Если ваш веб-сервер смотрит наружу, то я бы не стал отключать selinux даже в угоду производительности системы. А если это какой-то корпоративный портал и вы уверены в своих пользователях, то здесь уже все на свой страх и риск.


    1. Dewey_Kendall
      11.11.2016 09:57

      К сожалению, не было достаточно времени вплотную подойти к данному вопросу. В ходе написания статьи я поднял дополнительную виртуалку со всеми параметрами как в статье. В ней попробую включить selinux, и в случае успешной настройки, я поправлю статью.


      1. mikkisse
        11.11.2016 10:20
        +1

        Игры с selinux это отдельная и интересная тема. Вам точно понравится.


        1. Dewey_Kendall
          12.11.2016 06:54

          Да, было довольно-таки интересно! Включил selinux и поправил статью, все работает


  1. ildarz
    10.11.2016 15:14

    А зачем у вас в конфиге Kerberos что-то ниже RC4-HMAC? И зачем учетка сквида генерит кейтаб с RC4-HMAC, если домен с поддержкой AES?


    1. LoadRunner
      11.11.2016 09:15
      +1

      XP не умеет во что-то выше RC4, если я правильно помню.


      1. ildarz
        14.11.2016 12:04

        Кейтаб на сквиде нужен для аутентификации самого сквида в AD.


        1. LoadRunner
          14.11.2016 13:58

          А зачем ему кейтаб, если можно настроить аутентификацию сквида в AD через логин\пароль?
          Сквиду в AD только и надо, что права на чтение юзеров и групп.


          1. ildarz
            14.11.2016 14:08
            +1

            Потому что без этого (регистрации сквида в AD как сервиса с соответствующим SPN) вся схема прозрачной Kerberos-аутентификации не заработает.


  1. sniks
    11.11.2016 09:08

    А не проще для интеграции с AD использовать basic_ldap_auth?


    1. merlin-vrn
      11.11.2016 10:16

      А керберос между прокси и клиентом как будет? Мы хотим, чтобы клиенты могли использовать SSO при подключении к прокси-серверу?


      1. sniks
        11.11.2016 10:19

        А керберос в этом случае не будет. Необходимо будет вводит вручную доменный логин пароль, хотя бы один раз.


        1. merlin-vrn
          11.11.2016 10:26
          +2

          Именно. А в варианте автора — не нужно вообще. Зашёл в систему — получил tgt. Веб-клиент к прокси — система автоматически получает тикет для него и пользователю снова вводить доменный пароль не надо.


  1. lemproix
    11.11.2016 09:59

    Правильно ли я понимаю, что для работы этой строчки

    https_port 10.0.0.10:3129 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/etc/squid/squidCA.pem

    в клинских машинах необходима установить сертификат выше как корневой сертификат?
    Или он нужен для прокси сервера, чтобы squid с начало посмотрел заголовки http, далее отправил клиенту запрошенный контент?


    1. Dewey_Kendall
      11.11.2016 10:00

      Да, он нужен только для самого squid.

      Нет необходимости устанавливать сертификат на клиентах.


    1. merlin-vrn
      11.11.2016 10:26

      Он указан, и генератор сертификатов (sslcrtd_program) и место их хранения указанО, но эта дорожка с автоматической генерацией и подписью всех сертификатов своим CA просто банально не включена на том порту, который указан в wpad.

      Если вы из этой конфигурации хотите сделать перешифрование (настоящий MitM), нужно только поменять следующее:

      http_port 10.0.0.10:3130 options=NO_SSLv3:NO_SSLv2

      на

      http_port 10.0.0.10:3130 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/etc/squid/squidCA.pem generate-host-certificates=on

      Вот тогда этот сертификат реально нужен клиентам. Но ещё, судя по конфигу, в этом же файле и приватный ключ от сертификата. Клиентам следует, конечно, раздавать без ключа.

      UPD: для указанной вами https_port надо, но похоже конфиг wpad у автора такой, что на https_port никого не направляет.


  1. viiri
    11.11.2016 10:05
    +2

    Скажите, чем вы руководствовались при настройке Kerberos-клиента?
    Зачем у этих параметров «dns_lookup_kdc», «dns_lookup_realm» установлено значение «no»?
    Настоятельно рекомендую разобраться с документацией и не писать глупости. Эти перлы в конфиге уже не первый год тянутся из статьи в статью, как вонь за народным ополчением.
    Если разбираться лень, то просто удалите krb5.conf и все параметры примут значения по умолчанию, которые более адекватны.

    ЗЫ: Прекратите выкапывать виндовый ktpass. Для ввода *nix-машины в AD используйте msktutil. Она не требует создания связанной пользовательской учётной записи, позволяет удобно добавлять SPN, а так же обновлять пароль учётной записи.


    1. Dewey_Kendall
      11.11.2016 10:08

      Спасибо большое за правильные замечания. К сожалению, я уже точно не могу вспомнить почему я привел конфиг krb5.conf именно к такому виду. Если не изменяет память, в других вариациях были проблемы с авторизацией, и только с такими параметрами работает нормально.

      З.Ы. как появится свободное время, обязательно протестирую варианты без krb5.conf и использование mskutil.


    1. ildarz
      11.11.2016 11:45
      +2

      Ну а что вы хотите от простых смертных, когда эти настройки, например, сидят даже в официальной wiki по самбе? :) Ситуация вообще чудесная — https://lists.samba.org/archive/samba-technical/2012-May/083634.html. «Да, у нас лажа, но эти настройки у нас не используются, потому нам пофиг и лажу исправлять не будем».

      > Она не требует создания связанной пользовательской учётной записи

      Переформулирую (чтобы читатели не подумали, что запись не создаётся вообще) — создаёт эту запись сама.


      1. viiri
        11.11.2016 15:30

        > Переформулирую (чтобы читатели не подумали, что запись не создаётся вообще) — создаёт эту запись сама.

        Чтобы уж точно никого не запутать, переформулирую ещё раз. Ktpass создаёт keytab для предварительно созданной пользовательской учетной записи, msktitil же создаёт учетную запись компьютера и keytab для неё.


    1. thework0vlpl
      11.11.2016 16:03
      +1

      В большой AD (как у меня) могут использоваться AD Sites — для распределения нагрузки на разные сервера согласно сетевым адресам клиентов. Windows знает о существовании AD Sites и может выдать нужный kdc для клиента. Linux же полагается только на то, что вернёт dns запрос, поэтому запрос авторизации может уйти на удалённый kdc к которому нет доступа из подсети клиента, и тогда авторизация зависнет и потом завершиться неудачно.
      Видимо поэтому в большинстве примеров конфигов dns_lookup_kdc=no
      У меня тоже не получилось заставить linux обращаться только к kdc расположенных в локальном сайте и пришлось прописать эту опцию.
      Если подскажите как заставить linux обращаться к kdc только в своей подсети буду благодарен.
      Dns запрос, в моём случае, всегда возвращает полный список всех kdc домена.


      1. viiri
        14.11.2016 10:44
        +1

        В данной схеме *nix-машина является клиентом или предоставляет сервис? Если второе, то после ввода машины в домен сетевой доступ к KDC больше не нужен, так как по архитектуре протокола сервер к KDC самостоятельно не обращается — вся необходимая информация содержится в билете пользователя.
        Проблемы могут возникнуть только в случае обновления пароля учётной записи, которое по умолчанию не используется и требует дополнительной настройки.

        Процесс обнаружения ближайшего контроллера домена (читать тут и тут) выполняется с помощью LDAP (или даже CLDAP) протокола, а потому в «чистом» Kerberos не возможен. Если есть острая необходимость, можно установить на сервер пакет Samba и настроить её на использование внешнего keytab. Так же я находил упоминания, что библиотеки MIT Kerberos отдают предпочтение KDC в одной подсети с клиентом, но подтвердить не могу, надо смотреть в исходниках.

        На самом деле, ограничивать сетевой доступ к контроллерам в разных сайтах — плохая идея. Могут вылезти грабли даже на Windows-системах. В частности при переезде машины из одного сайта в другой.

        К сожалению, в большинстве примеров dns_lookup_kdc=no из-за того, что настройка производится бездумно методом копипасты.


        1. merlin-vrn
          14.11.2016 11:01

          dns_lookup_kdc может быть выключен потому, что он требует отдельного DNS-запроса, который занимает отдельное время


          1. viiri
            15.11.2016 04:05

            Согласен, может быть множество причин для отключения автообнаружения. Именно для этого и предусмотрена возможность менять эти значения в конфигурационном файле. Суть моего комментария в том, что в большинстве статей этот параметр отключен (да не только этот параметр, а весь конфигурационный файл — сплошная магия) потому, что «у всех так». Ниже вы написали, что гораздо продуктивнее руководствоваться принципом «понимаю, что делает каждая строка» и с этим я полностью согласен.


  1. thework0vlpl
    11.11.2016 10:08

    Не было проблем с java апплетами и Kerberos авторизацией? В апплетах похоже работает только ntlm авторизация. Java в браузере, конечно уже мертва, но у меня есть один государственный сайт, который работает только через апплеты. Приходится выкручиваться.


    1. Dewey_Kendall
      11.11.2016 10:12

      Если не изменяет память, у интернет-банка ВТБ используется java, и с ним проблем не возникало. Не могли бы вы в сообщить государственный сайт, который вас особенно интересует? Можно личным сообщением


      1. thework0vlpl
        11.11.2016 15:38

        Я тестировал на стандартном апплете проверки версии java https://www.java.com/en/download/installed8.jsp


    1. throttle
      11.11.2016 12:54

      У меня на сквиде с керберосом было, натыкался.
      То, что я раскопал — ява может в керберос, но это должно быть предусмотрено разработчиком апплета. В моем случае я просто дописал правило, чтоб на сайты нужных банков всех пускало без авторизации.


  1. brainfair
    11.11.2016 10:13

    Правильно ли использовать:
    if (isInNet( host, «192.168.0.0», «255.255.255.0») ||
    isInNet( host, «10.0.0.0», «255.255.255.0») ||

    Лучше использовать с резолвом: isInNet(dnsResolve(host), «10.0.0.0», «255.255.255.0»))


    1. Dewey_Kendall
      11.11.2016 10:14

      Признаюсь честно, я не сильно подкован в данном вопросе. Объясните пожалуйста, почему ваш вариант лучше


      1. Vindicar
        11.11.2016 10:20

        Я полагаю, brainfair не уверен что isInNet() самостоятельно отрезолвит параметр host, если в нем будет передано доменное имя вместо IP-адреса.


    1. Vindicar
      11.11.2016 10:31

      Вообще, должно сработать и так — везде написано что функция сама отрезолвит доменное имя.


      1. brainfair
        11.11.2016 11:56
        +1

        Работать будет и так и так, но наверно я тоже неправильно поправил, на самом деле лучше всего сначала отрезолвить host в ip адрес в отдельную переменную например hostip и уже потом проверять его в isInNet, в противном случае у вас будет замедление работы так как в каждой проверке будет заново резолвиться имя в ip, и соответственно чем больше у вас isinnet тем медленнее это будет работать.

        Тоесть в примере:

        hostip=dnsResolve(host);
        if (isInNet( hostip, «192.168.0.0», «255.255.255.0») ||
        isInNet( hostip, «10.0.0.0», «255.255.255.0») ||
        


        1. Vindicar
          11.11.2016 17:43

          Это будет так только если ни в браузере, ни в системе нет своего кэша DNS — иначе время повторного резолвинга будет пренебрежимо мало. А в приведенном случае, имхо, даже кэширующий DNS-сервер в локалке спасёт.


  1. Vindicar
    11.11.2016 10:19

    Небольшое дополнение: тут проскальзывала публикация, описывающая как, контролируя .pac-файл, вытаскивать URL посещенной страницы независимо от шифрования. если коротко, кодируем полученный в параметрах url и делаем dnsResolve() через выделенный поддомен нашего домена (скажем, codedurlhere.filter.domain.tld), который контролируется отдельным нестандартным DNS сервером (например, логирующим все запросы и отдающим в ответ 127.0.0.1).
    Конечно, решение извращенное, и овчинка может не стоить выделки, но по идее узнать полный URL таким образом должно быть реально.


  1. merlin-vrn
    11.11.2016 10:30

    Автор, зачем у вас в конфиге указаны http_port intercept и https_port с MitM, если ваш wpad всё равно направляет всех на http_port без intercept, да и вообще судя по описанию у вас нужна аутентификация по AD (никакого прозрачного прокси), и явно сказано, что MitM использоваться не должен?


    1. Dewey_Kendall
      12.11.2016 07:27

      Стараюсь пользоваться принципом «работает — не мешай», но сегодня поразмыслив, все же убрал данные строки. Без них тоже работает как надо. Конфиг поправил


      1. merlin-vrn
        12.11.2016 20:47
        +1

        А вот теперь вам и sslcrtd_program не нужна. Эта строка указывает команду, используемую для автогенерации сертификатов для MitM, а его же больше нет. И файлик с корневым сертификатом ЦС+ключом не нужен по этой же причине.

        Гораздо продуктивнее руководствоваться принципом «понимаю, что делает каждая строка».


  1. TalWar
    11.11.2016 11:03

    а отчет, как и прежде по IP, а не по пользователю?


  1. Dewey_Kendall
    11.11.2016 11:12

    В отчетах вместо ip-адресов, указаны принципалы пользователей. Проще говоря, список в таком формате:
    i.ivanov@example.ru
    s.sidorov@example.ru


  1. throttle
    11.11.2016 12:56

    А вот кто расскажет, как со скайпом в случае прокси с керберосом?
    Звонки работают?


    1. Dewey_Kendall
      12.11.2016 08:33

      Не тестировал. Будет свободное время, попробую


      1. throttle
        14.11.2016 12:33

        Как будут результаты — дай знать, плз., или сюда, или в личку.
        У меня не работает ни в какую. Когда скайп работает через прокси — он пытается использовать STUN для разговоров, если я все правильно понял.


        1. Dewey_Kendall
          18.11.2016 05:56

          Skype не заработал. Можно попробовать добавить эти настройки