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

  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.

  3. jeansito

    This file (ext_time_quota.db)
    Do not reflect it in:
    # external_acl_type time_quota ttl=1 children-max=1 %LOGIN /usr/lib/squid/ext_time_quota_acl /etc/squid/time_quota
    Why?
    Should I add it or not?
    -b /run/ext_time_quota.db

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

      By default, ext_time_quota_acl helper searches for ext_time_quota.db in /var/ext_time_quota.db

      ext_time_quota.db was created by a command

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

      You can create ext_time_quota.db anywhere and specify the path to it via the -b parameter. The main thing that the user and the group ext_time_quota.db were proxy:proxy

      1. Koratsuki

        Good ‘day or night’ @Andrei, I need to ask you something… How can I change the output directory for the tme quota acl?

        How can I change the path:
        # touch /var/ext_time_quota.db
        # chown proxy:proxy /var/ext_time_quota.db

        To something more like:
        # touch /var/lib/squid/ext_time_quota.db
        # chown proxy:proxy /var/lib/squid/ext_time_quota.db

        Is there a way to change that setting on Squid config? I´ve been reading the Squid doc, but I can´t find it…

        Thanks in advance!

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

          Manpages ubuntu contains information about configuring ext_time_quota_acl helper.
          The -b parameter will help you.

          -b database
                         Filename of persistent database. This defaults to ext_time_quota.db in Squids state
                         directory.

          external acl in squid.conf will look like this:

          external_acl_type time_quota ttl=1 children-max=1 %LOGIN /usr/lib/squid/ext_time_quota_acl -b /var/lib/squid/ext_time_quota.db /etc/squid/time_quota
  4. jeansito

    it’s possible?
    1. Samba DC authentication freeRADIUS?, Authenticating Freeradius against samba Active Directory???????

    or should I implement
    2. Configuring a Squid Server to authenticate from RADIUS?

    What do you advise me?

    NOTA:
    Configure Radius Server on Windows Server 2016, I have implemented it, but NOT windows server, something similar in samba DC!!
    Thanks again!

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

      You can install FreeRADIUS on a domain controller configured under Samba Active Directory domain controller.

      # apt install freeradius

      Add proxy server as client radius

      # nano /etc/freeradius/clients.conf
      
      client proxy {
              ipaddr                = 192.168.10.13
              secret                = Secret1
              shortname             = proxy
              nastype               = other
      }

      Specify the correct path to ntlm_auth and the domain name

      # nano /etc/freeradius/modules/ntlm_auth
      
      exec ntlm_auth {
              wait = yes
              program = "/usr/bin/ntlm_auth --request-nt-key --domain=4SKILL --username=%{mschap:User-Name} --password=%{User-Password}"
      }

      Add NTLM authentication and authorization

      # nano /etc/freeradius/sites-enabled/default
      . . .
      authorize {
              ntlm_auth
      . . .
      #       pap
      }
      . . .
      authenticate {
          Auth-Type ntlm_auth {
              ntlm_auth
          }
      . . .
      }

      Set NTLM authentication as preferred

      # nano /etc/freeradius/users
      
      DEFAULT     Auth-Type = ntlm_auth
      . . .

      Restart FreeRADIUS

      # service freeradius restart

      Here is an example squid.conf. Bold highlights changes.

      # nano /etc/squid/squid.conf
      
      auth_param basic program /usr/lib/squid/basic_radius_auth -f /etc/squid/radius_config
      auth_param basic children 5
      auth_param basic realm Web-Proxy
      auth_param basic credentialsttl 5 minute
      auth_param basic casesensitive off
      
      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 radius-auth proxy_auth REQUIRED
      
      http_access deny !Safe_ports
      http_access deny CONNECT !SSL_ports
      http_access allow localhost manager
      http_access deny manager
      http_access allow radius-auth
      http_access allow localhost
      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

      Add a radius definition file for settings

      # nano /etc/squid/radius_config
      
      server 192.168.10.11
      secret Secret1

      192.168.10.11 — address radius of the server, it is dc1
      Secret1 is a shared password with the radius server, it was listed in /etc/freeradius/clients.conf.

  5. jeansito

    Hello again!
    Yesterday I installed freeradius in debian 9.8 and discovered that:
    # /etc/freeradius/clients.conf
    /etc/freeradius/3.0/clients.conf
    # /etc/freeradius/modules/ntlm_auth
    /etc/freeradius/3.0/mods-available/ntlm_auth
    # /etc/freeradius/sites-enabled/default
    /etc/freeradius/3.0/sites-enabled/default (direct access)
    # /etc/freeradius/users
    /etc/freeradius/3.0/users (direct access)

    Is this file important?
    /etc/freeradius/3.0/proxy.conf

    I have in debian 9.8
    1.Samba DC Squid Kerberos authentication
    2.Samba Active Directory domain controller
    and in the proxy squid install freeradius in 1.

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

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