Squid active directory authentication

squidВ этой статье будет описан принцип настройки аутентификации пользователей на proxy сервере squid. Иными словами, перед тем как получить доступ в интернет, пользователь обязан предоставить свой логин и пароль, который squid будет искать в базе active directory. Для поиска будут задействованы следующие схемы проверки подлинности: Basic, NTLM и Negotiate.

  • Basic — самая простая схема аутентификации. Пользователь открывает браузер и ему предлагается ввести свой логин и пароль. Информация передается в открытом виде.
  • NTLM — схема, использующая одноименный протокол аутентификации разработанный Microsoft. В случае с NTLM информация шифруется. Так же доменному пользователю не нужно вводить логин и пароль при каждом открытии браузера. Используются данные, указанные при входе в систему.
  • Negotiate — данная схема в зависимости от доступности выбирает протокол сетевой аутентификации Kerberos или проверку подлинности NTLM. Kerberos является более совершенный по сравнению с NTLM. Так же как в NTLM, при Kerberos аутентификации используются данные, указанные при входе в систему.

Установка squid будет производиться на Ubuntu Server 16.04.1 LTS. Версия squid 3.5.12.

Базовая настройка

После установки системы изменим имя сервера на proxy

# hostnamectl set-hostname proxy

Укажем полное имя сервера и IP адрес в файле hosts

# nano /etc/hosts

127.0.0.1       localhost
192.168.1.23    proxy.4skill.loc        proxy
. . .

Настроим сетевое подключение

# nano /etc/network/interfaces

. . .
# The primary network interface
auto ens32
iface ens32 inet static
        address 192.168.1.23
        netmask 255.255.255.0
        gateway 192.168.1.1
        dns-nameservers 192.168.1.21 192.168.1.22
        dns-search 4skill.loc

В dns-nameservers нужно указать IP адреса доменных DNS серверов. В dns-search название своего домена. Более подробно о настройке сети можно прочитать здесь.

Перезагрузим систему

# reboot

Обновим индексы пакетов и систему

# apt update
# apt upgrade

Более подробно об обновлении Ubuntu Server можно прочитать здесь.

Для синхронизации времени с контроллерами домена установим пакет ntp

# apt install ntp

В /etc/ntp.conf нужно закоментировать все строки начинающиеся со слова pool и добавить информацию о контроллерах домена

# nano /etc/ntp.conf

. . .
# Specify one or more NTP servers.

# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
# more information.
#pool 0.ubuntu.pool.ntp.org iburst
#pool 1.ubuntu.pool.ntp.org iburst
#pool 2.ubuntu.pool.ntp.org iburst
#pool 3.ubuntu.pool.ntp.org iburst

# Use Ubuntu's ntp server as a fallback.
#pool ntp.ubuntu.com

# Domain Controllers
server dc1.4skill.loc
server dc2.4skill.loc
. . .

Перезапустим ntp сервис и проверим статус синхронизации времени

# service ntp restart
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 dc1.4skill.loc  82.199.107.209   3 u    3   64    1    0.467    8.206   0.000
 dc2.4skill.loc  192.168.1.21     5 u    1   64    1    0.916  256.769   0.000

Установим proxy сервер squid

# apt install squid

Создадим копию конфигурационного файла squid. Из оригинального файла удалим комментарии и пробелы

# cp /etc/squid/squid.conf /etc/squid/squid.conf.orig
# grep -v "^#" /etc/squid/squid.conf.orig | grep -v "^$"> /etc/squid/squid.conf

Настройка basic и ntlm схем

Для ввода сервера в домен потребуется пакет samba. Так же в состав samba входят хелперы, которые будут использованы для basic и ntlm схем аутентификации в squid. Вместе с samba нужно установить пакет winbind. Он нужен для использования доменных групп и пользователей на linux сервере.

# apt install samba winbind

Посколько на proxy сервере не будут использоваться файловые ресурсы и ресурсы печати, остановим службы samba и удалим их из автозагрузки

# service nmbd stop && service smbd stop
# update-rc.d -f nmbd remove && update-rc.d -f smbd remove

Отредактируем конфигурационный файл samba

# nano /etc/samba/smb.conf

[global]
       security = ADS
       workgroup = 4SKILL
       realm = 4SKILL.LOC

       # Default idmap config for local BUILTIN accounts and groups
       idmap config * : backend = tdb
       idmap config * : range = 3000-7999

       # idmap config for the 4SKILL domain
       idmap config 4SKILL : backend = rid
       idmap config 4SKILL : range = 10000-999999

       winbind use default domain = Yes

4SKILL нужно поменять на свой домен.

Проверим конфигурационный файл samba на наличие ошибок

# testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Loaded services file OK.
Server role: ROLE_DOMAIN_MEMBER

Чтобы убрать предупреждение

rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)

Выполним команду

# ulimit -n 16384

И добавим в /etc/security/limits.conf следующие строки

# nano /etc/security/limits.conf

. . .
*                -       nofile          16384
root             -       nofile          16384
. . .

Введем proxy сервер в домен

# net ads join -U Administrator osName='Ubuntu Server GNU/Linux' osVer='16.04 LTS'
Enter Administrator's password:
Using short domain name -- 4SKILL
Joined 'PROXY' to dns domain '4skill.loc'

Перезапустим winbind и проверим базовый функционал

# service winbind restart
# wbinfo -t
checking the trust secret for domain 4SKILL via RPC calls succeeded

Проверим аутентификацию пользователей через winbind

# wbinfo -a 4skill\\administrator
Enter 4skill\administrator's password:
plaintext password authentication succeeded
Enter 4skill\administrator's password:
challenge/response password authentication succeeded

Для нормального функционирования ntlm аутентификации, пользователь, от имени которого работает squid, должен входить в группу winbindd_priv

# gpasswd -a proxy winbindd_priv
Adding user proxy to group winbindd_priv

В Ubuntu и Debian каталог winbindd_privileged создается в двух местах

# ls -la /var/lib/samba/winbindd_privileged
итого 8
drwxr-x--- 2 root root 4096 янв 19 14:45 .
drwxr-xr-x 6 root root 4096 янв 19 14:45 ..
srwxrwxrwx 1 root root 0 янв 19 14:45 pipe
root@proxy:~# ls -la /var/run/samba/winbindd_privileged
итого 0
drwxr-x--- 2 root winbindd_priv 40 янв 19 14:36 .
drwxr-xr-x 9 root root 480 янв 19 14:48 ..

Группу /var/lib/samba/winbindd_privileged нужно изменить по аналогии с /var/run/samba/winbindd_privileged на winbindd_priv

# chgrp -R winbindd_priv /var/lib/samba/winbindd_privileged
root@proxy:~# ls -la /var/lib/samba/winbindd_privileged
итого 8
drwxr-x--- 2 root winbindd_priv 4096 янв 19 14:45 .
drwxr-xr-x 6 root root 4096 янв 19 14:45 ..
srwxrwxrwx 1 root winbindd_priv 0 янв 19 14:45 pipe

Протестируем basic аутентификацию.

# /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
4skill\administrator Pa$$w0rd
OK

Ntlm аутентификацию протестировать из командой строки невозможно.

Добавим в /etc/squid/squid.conf поддержку basic и ntlm схем аутентификации, а так же сопутствующий ACL

# nano /etc/squid/squid.conf

auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 100 startup=10 idle=5
auth_param ntlm keep_alive off

auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 10 startup=1 idle=1
auth_param basic realm 4SKILL.LOC
auth_param basic credentialsttl 1 hours
. . .
acl auth proxy_auth REQUIRED
. . .
http_access allow localhost
http_access allow auth
http_access deny all
. . .

Перезапустим squid

# squid -k reconfigure

На клиентском компьютере заходим в «Пуск»->»Панель управления»->»Свойства браузера»->вкладка «Подключения»->кнопка «Настройка сети». Ставим галочку «Использовать прокси сервер…» и указываем «Адрес:proxy.4skill.loc Порт:3128«, нажимаем «Ок»

ie-proxy

По умолчанию будет использоваться ntlm схема аутентификации. Если этот вариант не поддерживается, будет предложена basic схема.

Настройка negotiate схемы

Для аутентификации proxy сервера на контроллере домена и последующей идентификации пользователей, необходимо создать файл keytab. Этот файл содержит в себе Kerberos Principal (хост, пользователь и домен) и ключи шифрования (определяются из пароля Kerberos). Перед созданием keytab файла, в домене необходимо создать пользователя для proxy сервера. Для этого откроем на контроллере домена powershell и выполним команду

PS C:\> New-ADUser -Name squid -AccountPassword (ConvertTo-SecureString -AsPlainText 'Pa$$w0rd' -Force) -PasswordNeverExpires $true -Enabled $true -Description "Системный пользователь для работы squid"

Создадим keytab файл. Для этого на контроллере домена откроем от имени администратора CMD и выполнить команду

C:\>ktpass -princ HTTP/proxy.4skill.loc@4SKILL.LOC -mapuser 4SKILL\squid -pass Pa$$w0rd -ptype KRB5_NT_PRINCIPAL -out C:\squid.keytab
Targeting domain controller: DC1.4skill.loc
Using legacy password setting method
Successfully mapped HTTP/proxy.4skill.loc to squid.
Key created.
Output keytab to C:\squid.keytab:
Keytab version: 0x502
keysize 67 HTTP/proxy.4skill.loc@4SKILL.LOC ptype 1 (KRB5_NT_PRINCIPAL) vno 3 etype 0x17 (RC4-HMAC) keylength 16 (0x92937945b518814341de3f726500d4ff)

Для передачи keytab файла на proxy сервер, нужно скачать утилиту pscp, положить её в корень диска C. Открыть CMD и выполнить команду

C:\>pscp.exe squid.keytab username@proxy.4skill.loc:
Store key in cache? (y/n) y
username@proxy.4skill.loc's password:
squid.keytab | 0 kB | 0.1 kB/s | ETA: 00:00:00 | 100%

username — пользователь, под которым настраивается proxy сервер.

На proxy сервере переместим keytab файл в каталог /etc/squid/ и выставим права

# mv ~/squid.keytab /etc/squid/
# chown proxy:proxy /etc/squid/squid.keytab
# chmod 400 /etc/squid/squid.keytab

Укажем squid где искать keytab файл

# nano /etc/default/squid

KRB5_KTNAME=/etc/squid/squid.keytab
export KRB5_KTNAME

Для поддержки Kerberos установим следующий пакет

# apt install krb5-user

Отредактируем конфигурационный файл Kerberos

# nano /etc/krb5.conf

[libdefaults]
        default_realm = 4SKILL.LOC
        dns_lookup_realm = false
        dns_lookup_kdc = true
        default_keytab_name = /etc/squid/squid.keytab

В default_realm нужно указать название своего домена.

Попробуем получить билет Kerberos для proxy сервера

# kinit -k HTTP/proxy.4skill.loc
# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: HTTP/proxy.4skill.loc@4SKILL.LOC

Valid starting       Expires              Service principal
20.01.2017 10:08:15  20.01.2017 20:08:15  krbtgt/4SKILL.LOC@4SKILL.LOC
        renew until 21.01.2017 10:08:15
# kdestroy

Добавим описание negotiate схемы в squid.conf

# nano /etc/squid/squid.conf

auth_param negotiate program /usr/lib/squid/negotiate_wrapper_auth --ntlm /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --kerberos /usr/lib/squid/negotiate_kerberos_auth -r -s GSS_C_NO_NAME
auth_param negotiate children 200 startup=50 idle=10
auth_param negotiate keep_alive off
. . .

Перезапустим squid

# squid -k reconfigure

Теперь приоритет имеет negotiate схема. По умолчанию будет использоваться Kerberos аутентификация, если она по каким-либо причинам не поддерживается, буден предложен вариант ntlm аутентификации.

При данных настройках любой доменный пользователь, прошедший аутентификацию, получает доступ в интернет.

Авторизация пользователей на основе доменных групп

Добавим группу Internet, для этого откроем на контроллере домена powershell и выполним команду

PS C:\> New-ADGroup Internet -GroupScope Global -Description "Члены этой группы имеют доступ в интернет"

Добавим в группу Internet пользователя Administrator

PS C:\> Add-ADGroupMember Internet -Members Administrator

Для проверки наличия пользователя в группе, используется хелпер /usr/lib/squid/ext_kerberos_ldap_group_acl. Для корректной работы этого хелпера необходимо установить следующий пакет

# apt install libsasl2-modules-gssapi-mit

Проверим работу хелпера

# /usr/lib/squid/ext_kerberos_ldap_group_acl -g Internet -D 4SKILL.LOC
administrator
OK

Ошибка

support_sasl.cc(276): pid=2019 :2017/01/20 10:56:09| kerberos_ldap_group: ERROR: ldap_sasl_interactive_bind_s error: Unknown authentication method
support_ldap.cc(957): pid=2019 :2017/01/20 10:56:09| kerberos_ldap_group: ERROR: Error while binding to ldap server with SASL/GSSAPI: Unknown authentication method

возникает при отсутствии пакета  libsasl2-modules-gssapi-mit, либо отсутствии  PTR записей для контроллеров домена.

Добавим в squid.conf поддержку хелпера и новый ACL

# nano /etc/squid/squid.conf

. . .
external_acl_type kerberos_ldap_group ttl=300 %LOGIN /usr/lib/squid/ext_kerberos_ldap_group_acl -g Internet -D 4SKILL.LOC
. . .
acl internet external kerberos_ldap_group
. . .
http_access allow localhost
#http_access allow auth
http_access allow internet
http_access deny all
. . .

Параметр ttl определяет в секундах время хранения результатов отработки внешнего ACL. То есть при изменении членства в группе Internet, в squid изменения проиcходят в течении 5 минут.

Перезапустим squid

# squid -k reconfigure

Теперь доступ в интернет имеют только члены группы Internet.

Иногда после перезагрузки proxy сервера, squid перестает аутентифицировать пользователей, и в /var/log/squid/cache.log появляется предупреждение

Warning: Could not find any nameservers. Trying to use localhost
Please check your /etc/resolv.conf file
or use the 'dns_nameservers' option in squid.conf.

По каким-то причинам squid не может найти IP адреса DNS серверов в /etc/resolv.conf. Для решения это проблемы можно указать адреса DNS серверов явно в /etc/squid/squid.conf, добавив в конец файла строку

dns_nameservers 192.168.1.21 192.168.1.22

Пример полного /etc/squid/squid.conf

auth_param negotiate program /usr/lib/squid/negotiate_wrapper_auth --ntlm /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --kerberos /usr/lib/squid/negotiate_kerberos_auth -r -s GSS_C_NO_NAME
auth_param negotiate children 200 startup=50 idle=10
auth_param negotiate keep_alive off

auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 100 startup=10 idle=5
auth_param ntlm keep_alive off

auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 10 startup=1 idle=1
auth_param basic realm 4SKIIL.LOC
auth_param basic credentialsttl 1 hours

external_acl_type kerberos_ldap_group ttl=300 %LOGIN /usr/lib/squid/ext_kerberos_ldap_group_acl -g Internet -D 4SKILL.LOC

acl SSL_ports port 443
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
acl auth proxy_auth REQUIRED
acl internet external kerberos_ldap_group

http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
#http_access allow auth
http_access allow internet
http_access deny all

http_port 3128

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 (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .               0       20%     4320

cache_mgr admin@4skill.loc

dns_nameservers 192.168.1.21 192.168.1.22

# Don't show squid version
httpd_suppress_version_string on

# Fast shutdown
shutdown_lifetime 1 second

Squid active directory authentication: 2 комментария

  1. Павел

    Снова здравствуйте, может вы знаете как Squid заставить определять внутренние ресурсы оп именам? Т.е. суть такова есть внутренний ресурс http://servicedesk:8080 При работе через squid Сервер DNS ответил:

    Это означает, что кэш не смог распознать имя узла в URL. Проверьте адрес на корректность.

    Проблема только с внутренними ресурсами.

    1. Андрей Автор записи

      Здравствуйте! Прокси-сервер нужен для разграничения прав доступа пользователей в сеть интернет. Внутренние ресурсы не принято открывать через прокси. Пользователи должны попадать на них на прямую, минуя прокси. Настраивается это в «Пуск»->»Панель управления»->»Свойства браузера»->»Подключения»->»Настройка сети». Далее ставим галочку «Использовать прокси-сервер…», указываем адрес прокси, ставим галочку «Не использовать прокси-сервер для локальных адресов» и нажимаем «Дополнительно». В окне «Не использовать прокси-сервер для адресов, начинающихся с:» нужно перечислить внутренние ресурсы сети. В домене AD можно воспользоваться GPO. «Конфигурация пользователя»->»Настройка»->»Параметры панели управления»->»Параметры обозревателя».

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *