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: 8 комментариев

  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

  2. jeansito

    Я установил
    DC debian 9 DLZ
    кальмар
    это дает мне ошибку

    root@proxy:~# kinit -k HTTP/proxy.inutil.cu
    kinit: Preauthentication failed while getting initial credentials

    root@proxy:~# kinit HTTP/proxy.inutil.cu
    perfect…

    ты знаешь почему?

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

      -k — use keytab file.

      The path to the keytab file is specified in /etc/krb5.conf

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

      Check or re-create your squid.keytab file. Most likely the problem is in it, or its location.

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

      Helper ext_time_quota_acl is not available in Ubuntu 16.04 LTS, but is available in Ubuntu 18.04 LTS.
      I installed Ubuntu 18.04 LTS and configured Squid for Squid active directory authentication.
      The only exception is the network configuration in Ubuntu 18.04 LTS, but much has been written about this on the Internet.

      The changes I made to /etc/squid/squid.conf are in bold.

      # 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
      external_acl_type time_quota ttl=1 children-max=1 %LOGIN /usr/lib/squid/ext_time_quota_acl /etc/squid/time_quota
      
      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
      acl noquota src all
      acl time_quota external time_quota
      
      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_access deny !internet
      deny_info ERR_ACL_TIME_QUOTA_EXCEEDED noquota
      http_access deny !time_quota noquota
      
      . . .

      Created quotas for users

      nano /etc/squid/time_quota
      
      # user budget / period
      user1    1h / 1d
      user2    7h / 1w

      Created a database for ext_time_quota_acl helper and set permissions on it

      # touch /var/ext_time_quota.db
      # chown proxy:proxy /var/ext_time_quota.db

      At the end you need to reload the Squid configuration

      # squid -k reconfigure

      *When the squid -k reconfigure command is executed, the user quota counters are reset.

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

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