24.11.2024

Аутентификация пользователей в Squid – Kerberos, NTLM и Basic

Заметки в процессе установки

Аутентификация

Подготовка

Round-Robin записи в DNS для котроллеров домена Active Directory

У многих используется несколько котроллеров домена Active Directory.

В данном случае 2 контроллера dc1.notdev.local – 192.168.10.11 и dc2.notdev.local – 192.168.10.12. Для повышения отказоустойчивости работы сервисов которые нуждаются в указании конкретного сервера, соответствующие записи  Round-Robin, dc.notdev.local – 192.168.10.11 и dc.notdev.local – 192.168.10.12, что позволят указывать dc.notdev.local в роли сервера аутентификации.

PTR запись в DNS для прокси сервера

Создайте на DNS серверах, PTR-запись прокси сервера.

Для использования Kerberos-аутентификации необходимо убедиться, что на серверах DNS присутствует PTR-запись для каждого контроллера домена Active Directory.

Установить локальные DNS сервера

Отредактируйте nano /etc/resolv.conf

search notdev.local
nameserver 192.168.10.11
nameserver 192.168.10.12

Настройка Kerberos-аутентификации

Данная настройка необходима когда у вас есть, контроллер домена Active Directory, который будет выполнять аутентификацию пользователей.

При использовании данного типа аутентификацию  нельзя использовать прозрачный порт

Синхронизация времени с контроллером домена

apt install -y ntp ntpdate

Добавляем в секцию server ntp.your-provider.example свои сервера времени

Отредактируйте ntp.conf, для Debian 9/10/11 /etc/ntp.conf, а Debian 12 /etc/ntpsec/ntp.conf

# You do need to talk to an NTP server or two (or three).
#server ntp.your-provider.example
server dc1.notdev.local
server dc2.notdev.local

Останавливаем службу NTP, выполняем синхронизацию с указанным сервером и запускаем службу NTP.

service ntp stop
ntpdate dc.notdev.local
# ntpdate[10465]: adjust time server 192.168.10.11 offset +0.048560 sec

service ntp start

Состояние активного NTP-сервера отображается командой.

ntpq -p

#     remote         refid   st t  when   poll   reach   delay   offset  jitter
#==============================================================================
#-dc1.notdev.loc XX.XX.XX.XX  2 u   506   512     377    0.711   +52.723  6.169
#-dc2.notdev.loc YY.YY.YY.YY  3 u   474   512     377    1.148   +22.318  7.211

Создание keytab-файла для сервиса Squid

Подключитесь к контроллеру домена Active Directory. В оснастке Domains Users and Computers создайте пользователя с именем squid с паролем qwerty123. Запустите командную строку или PowerShell от имени администратора и выполните одну из команд.

Достаточно создать keytab-файл используя шифрование RC4-HMAC-NT

ktpass -princ HTTP/[email protected] -mapuser [email protected] -pass qwerty123 -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -out squid.keytab

Но можно создать используя все доступные алгоритмы для большей совместимости

ktpass -princ HTTP/[email protected] -mapuser [email protected] -pass qwerty123 -crypto ALL -ptype KRB5_NT_PRINCIPAL -out squid.keytab

ktpass -princ HTTP/<имя сервера с сервисом Squid в нижнем регистре>@<realm Active Directory в верхнем регистре> -mapuser squid@<realm Active Directory в верхнем регистре> -crypto <тип шифрования, рекомендуется указать RC4-HMAC-NT или ALL для совместимости> -ptype KRB5_NT_PRINCIPAL -pass <пароль пользователя squid> -out squid.keytab

Должен быть ТОЛЬКО ОДИН пользователь, сопоставленный одной записью SPN (HTTP/<имя сервера с сервисом Squid в нижнем регистре>@<realm Active Directory в верхнем регистре>). Если несколько разных пользователей сопоставленных с записью SPN, то проверка подлинности Kerberos будет ВСЕГДА НЕУДАЧНОЙ.

Скопируйте файл squid.keytab в директорию /etc/squid/

Установка необходимых пакетов

apt install -y krb5-config krb5-user libsasl2-modules-gssapi-mit ldap-utils

Резервная копия Kerberos

cp /etc/krb5.conf{,.bak}

Отредактируйте nano /etc/krb5.conf

[libdefaults]
    default_realm = NOTDEV.LOCAL
    default_keytab_name = /etc/squid/squid.keytab
    dns_lookup_kdc = yes
    dns_lookup_realm = yes
    kdc_timesync = 1
    ccache_type = 4
    ticket_lifetime = 24h
    forwardable = true
    proxiable = true
    # Windows 2003
    #default_tgs_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
    #default_tkt_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
    #permitted_enctypes = rc4-hmac des-cbc-crc des-cbc-md5
    # Windows 2008 with AES
    default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    # Windows 2012 R2 with DES3
    #default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5 des3-hmac-sha1
    #default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5 des3-hmac-sha1
    #permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5 des3-hmac-sha1

[realms]
    NOTDEV.LOCAL = {
        kdc = dc1.notdev.local
        kdc = dc2.notdev.local
        admin_server = dc1.notdev.local
        admin_server = dc2.notdev.local
        default_domain = notdev.local
    }

[domain_realm]
    .notdev.local = NOTDEV.LOCAL
    notdev.local = NOTDEV.LOCAL

Проверка аутентификации

kinit [email protected]
#Password for [email protected]: klist
#Ticket cache: FILE:/tmp/krb5cc_0 #Default principal: [email protected] # #Valid starting Expires Service principal #04/21/2022 19:36:42 04/22/2022 05:36:42 krbtgt/[email protected] #renew until 04/22/2022 19:36:36 kdestroy
kinit -kV -p HTTP/proxy.notdev.local
#Using default cache: /tmp/krb5cc_0 #Using principal: HTTP/[email protected] #Authenticated to Kerberos v5 klist
#Ticket cache: FILE:/tmp/krb5cc_0 #Default principal: HTTP/[email protected] # #Valid starting Expires Service principal #04/21/2022 19:46:46 04/22/2022 05:46:46 krbtgt/[email protected] #renew until 04/22/2022 19:46:46 kdestroy

Основной модуль аутентификации

Ввиду модульной структуры нашего прокси сервера опишем основной файл /etc/squid/conf.d/00.auth.conf, в котором перечислены различные методы аутентификации, часть указанных параметров будет рассмотрено ниже более подробно.

Отредактируем /etc/squid/conf.d/00.auth.conf

# Kerberos authentication
include /etc/squid/conf.d/kerberos.auth

# NTLM authentication
#include /etc/squid/conf.d/ntlm.auth

# Basic authentication via LDAP or NTLM
include /etc/squid/conf.d/basic.auth

# сколько пользователь будет оставаться аутентифицированным, со времени его последнего запроса
authenticate_ttl 1 hour

# Проверка группы доступа в домене
external_acl_type Internet ttl=300 negative_ttl=60 %LOGIN /usr/lib/squid/ext_kerberos_ldap_group_acl -a -g Internet -D NOTDEV.LOCAL

# Определяем группы доступа
acl Internet external Internet

# Авторизация требуется ОБЯЗАТЕЛЬНО, без нее никого не пускать
acl auth proxy_auth REQUIRED

# Доступ через принадлежность группе
http_access allow Internet

# Доступ c авторизацией, усиленная авторизация
http_access deny !auth
http_access allow auth

В данном файле указан перечень общих параметров которые могут быть использованы для большинства типов аутентификации

Настройка Squid для использования Kerberos-аутентификации

Можно использовать два метода с использованием keytab-файла и без него.

-i -d отладка
-r  не использовать @<realm Active Directory в верхнем регистре> в учетной записи

-s может иметь несколько вариантов HTTP/[email protected] = HTTP/proxy.notdev.local = GSS_C_NO_NAME (AUTO)

Параметр auth_param negotiate keep_alive off 

Если у вас возникают проблемы с запросами PUT/POST, когда вы используете Negotiate схему аутентификации, вы можете попробовать выключить эту опцию. Но это может привести, к тому, что Squid будет закрывать соединения, если браузер спрашивает, какие схемы аутентификации поддерживает прокси.

# Negotiate Kerberos
#auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth -k /etc/squid/squid.keytab -r -s HTTP/[email protected]
auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth -r -s GSS_C_NO_NAME
auth_param negotiate children 100 startup=10 idle=10
auth_param negotiate keep_alive on

Так же необходимо создать acl  и укажите что требуется обязательная аутентификация и добавить перед правилом http_access deny all

acl auth proxy_auth REQUIRED
http_access deny !auth
http_access allow auth

Если необходимо обеспечивать ограничение пользователей, по принадлежности к группам безопасности в домене Active Directory, то необходимо добавить соответствующую обработку, ACL и запрет, размещенный перед правилом http_access deny all

Проверка принадлежности учетной записи к группе Internet

/usr/lib/squid/ext_kerberos_ldap_group_acl -a -g Internet -D NOTDEV.LOCAL
user1

#OK

Теперь можем добавлять необходимое правило

external_acl_type Internet ttl=300 negative_ttl=60 %LOGIN /usr/lib/squid/ext_kerberos_ldap_group_acl -a -g Internet -D NOTDEV.LOCAL

acl Internet external Internet
http_access deny !Internet

Перезапустите службу Squid

service squid restart

Текущее содержание модуля kerberos.auth

# Negotiate Kerberos
auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth -r -s GSS_C_NO_NAME
auth_param negotiate children 100 startup=10 idle=10
auth_param negotiate keep_alive on

Настройка NTLM-аутентификации

Рекомендуется использовать Kerberos-аутентификацию для обеспечения безопасности передачи данных. Используйте NTLM-аутентификацию, только если невозможно использовать Kerberos-аутентификацию. Если вы используете NTLM-аутентификацию, необходимо включить протокол Samba версии 2.

Установка сервиса Samba

Чтобы установить сервис Samba и пакеты, необходимые для работы сервиса Samba, выполните одну из следующих команд в зависимости от используемой операционной системы:

apt install -y samba winbind

Установите разрешения, чтобы учетная запись proxy пользователя могла читать samba winbindd_privileged.

Требуется добавить пользователя proxy в группу winbindd_priv:

usermod -a -G winbindd_priv proxy

Создаем резервную копию

cp /etc/samba/smb.conf{,.bak}

Отредактируйте nano /etc/samba/smb.conf

Приводим файл smb.conf к следующему виду

workgroup = <NetBIOS-имя домена Active Directory>

netbios name = <NetBIOS-имя сервера со службой Squid>

realm = <realm Active Directory в верхнем регистре>

[global]
    workgroup = NOTDEV
    netbios name = PROXY
    security = ADS
    realm = NOTDEV.LOCAL
    encrypt passwords = yes

    bind interfaces only = yes

    winbind nss info = rfc2307
    winbind use default domain = yes
    winbind enum users = yes
    winbind enum groups = yes

    idmap config *:backend = tdb
    idmap config *:range = 10000-80000
    idmap config NOTDEV:backend = rid
    idmap config NOTDEV:range = 10000-80000

    log file = /var/log/samba/samba.%m
    log level = 9

Добавление прокси сервера в домен Active Directory

Процедура добавления сервера со службой Squid весьма простая. В процессе потребуется использовать учетную запись и пароль администратора домена или пользователя с правами администратора домена.

net ads join -U admin

#Enter admin's password:
#Using short domain name -- NOTDEV
#Joined 'PROXY' to dns domain 'notdev.local'

Проверьте добавление сервера с сервисом Squid в домен Active Directory

net ads testjoin

#Join is OK

Перезапустите необходимые службы

service smbd restart
service nmbd restart
service winbind restart

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

wbinfo -u
wbinfo -g
wbinfo -a admin
wbinfo -t

Настройка Squid для использования NTLM-аутентификации

Ниже приведены необходимые настройки

Протоколы squid-2.5-ntlmssp и gss-spnego, работают они одинаково, но имеют некоторые особенности, которые не документированы. Параметр –require-membership-of позволяет указать какой группе пользователь в домене должен присутствовать что бы удовлетворять требование аутентификации.

auth_param ntlm program /usr/bin/ntlm_auth –helper-protocol=squid-2.5-ntlmssp –domain=<NetBIOS-имя домена Active Directory> –require-membership-of=<NetBIOS-имя домена Active Directory><группа пользователей>

# NTLM authentication
#auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=gss-spnego --domain=NOTDEV --require-membership-of=NOTDEV\Internet
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --domain=NOTDEV --require-membership-of=NOTDEV\Internet auth_param ntlm children 50 startup=10 idle=10 auth_param ntlm keep_alive off

Так же необходимо создать acl  и укажите что требуется обаятельная аутентификация и добавить перед правилом http_access deny all

Правила создаются один раз, для всех методов аутентификации

acl auth proxy_auth REQUIRED
http_access deny !auth
http_access allow auth

Перезапустите службу Squid

service squid restart

Текущее содержание модуля ntlm.auth

# Negotiate NTLM authentication
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp --domain=NOTDEV --require-membership-of=NOTDEV\Internet auth_param ntlm children 50 startup=10 idle=10 auth_param ntlm keep_alive off

Настройка Basic-аутентификации

Настройка Squid для использования Basic-аутентификации через Active Directory

При использовании Active Directory в роли сервера аутентификации можно воспользоваться несколькими методами

  • Если вы настраивали NTLM-аутентификацию можно использовать auth_param basic program /usr/bin/ntlm_auth –helper-protocol=squid-2.5-basic
  • LDAP-аутентификацию auth_param basic program /usr/lib/squid/basic_ldap_auth

auth_param basic program /usr/lib/squid/basic_ldap_auth -R -d -b “<LDAP объект (домен, группа или организационная единица) в формате DN>” -D “<имя пользователя>@<домен Active Directory>” -w “<пароль пользователя>” -f “sAMAccountName=%s” -h <IP-адрес контроллера домена Active Directory>

Проверка LDAP-аутентификации

/usr/lib/squid/basic_ldap_auth -R -b "dc=notdev,dc=local" -D "[email protected]" -w "qwerty123" -f "sAMAccountName=%s" -h dc.notdev.local 

squid qwerty123

#OK
# Basic authentication via LDAP
auth_param basic program /usr/lib/squid/basic_ldap_auth -R -b "dc=notdev,dc=local" -D "[email protected]" -w "qwerty123" -f "sAMAccountName=%s" -h dc.notdev.local
# Basic authentication via NTLM #auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic --domain=NOTDEV --require-membership-of=NOTDEV\Internet
auth_param basic children 50 startup=10 idle=10 auth_param basic realm "SQUID Proxy Server Basic authentication!" auth_param basic casesensitive off auth_param basic credentialsttl 1 hours

Настройка Squid для использования Basic-аутентификации используя файл passwd

Обычная аутентификация из файла с логином паролем. Создаем файл где будут хранится логин и пароль

htpasswd -c создать файл, для этого может потребоваться установить apache2-utils

apt install apache2-utils
htpasswd -c /etc/squid/passwd user01
htpasswd /etc/squid/passwd user02
htpasswd /etc/squid/passwd user03

Назначаем права на файл

chown -R proxy:proxy /etc/squid/passwd

Настройка Squid

# Basic authentication via file passwd
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 50 startup=10 idle=10
auth_param basic realm "SQUID Proxy Server Basic authentication!"
auth_param basic casesensitive off
auth_param basic credentialsttl 1 hours

Так же необходимо создать ACL  и укажите что требуется обаятельная аутентификация и добавить перед правилом http_access deny all

Правила создаются один раз, для всех методов аутентификации

acl auth proxy_auth REQUIRED
http_access deny !auth
http_access allow auth

Перезапустите службу Squid

service squid restart

Текущее содержание модуля basic.auth

# Basic authentication via file passwd
#auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd

# Basic authentication via LDAP auth_param basic program /usr/lib/squid/basic_ldap_auth -R -b "dc=notdev,dc=local" -D "[email protected]" -w "qwerty123" -f "sAMAccountName=%s" -h dc.notdev.local
# Basic authentication via NTLM (SMB) #auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic --domain=NOTDEV --require-membership-of=NOTDEV\Internet
auth_param basic children 50 startup=10 idle=10 auth_param basic realm "SQUID Proxy Server Basic authentication!" auth_param basic casesensitive off auth_param basic credentialsttl 1 hours

Дополнительные настройки


Дополнительная информация

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

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