Samba DC Squid Kerberos authentication

samba_squidРанее публиковалась статья Squid active directory authentication, в которой описана настройка основных протоколов аутентификации на прокси-сервере Squid. Проделаем тоже самое с использованием Samba DC. Поскольку настройка Basic и NTLM схем одинакова в обоих случаях, будет описана только настройка протокола Kerberos.

О настройке контроллеров домена на Samba было написано в статьях Samba Active Directory domain controller и Joining a Samba DC to an Existing Active Directory.

Установим Ubuntu Server на будущий прокси-сервер и сменим имя сервера на proxy

# hostnamectl set-hostname proxy

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

# nano /etc/hosts

127.0.0.1       localhost
127.0.1.1	proxy.4skill.loc        proxy
. . .

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

# nano /etc/network/interfaces

. . .
# The primary network interface
auto ens32
iface ens32 inet static
        address 192.168.10.13
        netmask 255.255.255.0
        gateway 192.168.10.254
        dns-nameservers 192.168.10.11 192.168.10.12
        dns-search 4skill.loc

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

Удалим старую конфигурацию сетевого интерфейса и перезапустим сетевую службу

# ip addr flush ens32
# service networking restart

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

# 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
pool 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

Установим прокси-сервер 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

Создадим на контроллере домена DC1 доменного пользователя squid

# samba-tool user add squid --description="Unprivileged user for Squid proxy server" --random-password

Установим неограниченный срок действия пароля для пользователя squid

# samba-tool user setexpiry squid --noexpiry

Создадим Service Principal Name для пользователя squid

# samba-tool spn add HTTP/proxy.4skill.loc squid

Также нужно заменить значение атрибута userPrincipalName на HTTP/proxy.4skill.loc. Сделать это можно в оснастке «Пользователи и компьютеры».  Нужно открыть свойства пользователя squid и выбрать вкладку «Учетная запись»

user_squid

Экспортируем keytab файл

# samba-tool domain exportkeytab --principal=HTTP/proxy.4skill.loc squid.keytab

Создадим в DNS запись типа А для прокси-сервера squid

# samba-tool dns add DC1 4skill.loc proxy A 192.168.10.13 -U administrator

DC1 — имя первого контроллера домена;
4skill.loc — название DNS зоны;
proxy — имя прокси-сервера;
A — тип DNS записи;
192.168.10.13 — IP адрес прокси-сервера;
-U administrator — имя пользователя, который выполняет операцию добавления записи.

Скопируем keytab файл на прокси-сервер

# scp squid.keytab admin_user@proxy:

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

На прокси-сервере переместим 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 для прокси-сервера

# 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
04.04.2017 10:07:23  04.04.2017 20:07:23  krbtgt/4SKILL.LOC@4SKILL.LOC
        renew until 05.04.2017 10:07:23
# kdestroy

Добавим поддержку Kerberos в squid.conf

# nano /etc/squid/squid.conf

auth_param negotiate program /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
. . .
acl auth proxy_auth REQUIRED
. . .
http_access allow localhost
http_access allow auth
http_access deny all
. . .

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

# squid -k reconfigure

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

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

# samba-tool group add Internet --description="Members of this group have access to the Internet"

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

# samba-tool group addmembers Internet 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
user1
ERR

Если пользователь является членом группы Internet, выводится сообщение OK, если нет, то ERR.

Ошибка

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.

Иногда после перезагрузки прокси-сервера, 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.10.11 192.168.10.12

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

auth_param negotiate program /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

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.10.11 192.168.10.12

# Don't show squid version
httpd_suppress_version_string on

# Fast shutdown
shutdown_lifetime 1 second

Samba DC Squid Kerberos authentication: 2 комментария

  1. Сергей

    В строке
    # /usr/lib/squid/ext_kerberos_ldap_group_acl -g Internet2 -D 4SKILL.LOC
    Кажется должно быть
    # /usr/lib/squid/ext_kerberos_ldap_group_acl -g Internet -D 4SKILL.LOC

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

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