IT-Service - Настройка прокси сервера squid3 c аутентификацией по Kerberos
Пятница, 12 Сентябрь 2014 04:32

Настройка прокси сервера squid3 c аутентификацией по Kerberos

Автор 
Оцените материал
(1 Голосовать)

Настройки контроллера домена

Нужно добавить A запись на DNS сервере :

squidkerb       узел(A)     192.168.10.10

Проверим запись:

nslookup squidkerb.domen.local

Также надо создать еще PTR запись в домене. Это всё это нужно так мы не вводим компьютер в домен.

 

Теперь нужно создать тикет (кейтаб) для компьютера(Важно! Не пользователя), от имени которого будет проверяться валидность пользователя интернета. Также компьютер нужно поместить в корень нашего домена domen.local (Важно! Если поместить его в подразделение например IT, то работать ничего не будет работать, будет выскакивать окно об авторизации)

В АД создаем компьютер например SQUIDKERB2 желательно большими буквами. Керберос это протокол который не умеет нормальные ошибки говорить, поэтому лучше большими буквами, чтобы не было ошибок.

Для Windows Server 2003:

ktpass -princ HTTP/squidkerb.domen.local@DOMEN.LOCAL -mapuser SQUIDKERB2$@DOMEN.LOCAL -crypto RC4-HMAC-NT -ptype
KRB5_NT_PRINCIPAL -pass 123456 -out c:\krb5.keytab

Для Windows Server 2008:

ktpass -princ HTTP/squidkerb.domen.local@DOMEN.LOCAL -mapuser SQUIDKERB2$@DOMEN.LOCAL -crypto ALL -ptype KRB5_NT_SRV_HST
+rndpass -out c:\keytab

Здесь HTTP/squidkerb.domen.local@DOMEN.LOCAL — имя принципала Kerberos для нашего HTTP-сервера на UNIX-машине.

SQUIDKERB2$@DOMEN.LOCAL — имя учётной записи, которую мы только что создали, вместе с именем домена. Обратите внимание, после имени здесь добавляется знак $, чтобы команда ktpass.exe догадалась, что это учетная запись компьютера, а не пользователя. На вопрос «Reset SQUIDKERB2$’s password [y/n]?» нужно ответить y.

-pass и +rndpass задает пароль, который может быть указан вручную, или устанавливает произвольный пароль, если задано значение +rndpass.

- crypto Задает тип шифрования Kerberos, который будет использоваться при шифрации/дешифрации билетов, передаваемых между контроллером домена KDC и хостами Для windows 2003 лучше всего RC4-HMAC-NT , а 2008 -crypto ALL(создается ключ со всеми поддерживаемыми протоколами шифрования)

Полученный ключ надо скопировать на UNIX-машину и поместить, например, в /etc/krb5.keytab. После чего проверить его работоспособность: без рабочего ключа работать ничего не будет.

Все на контроллере домене больше ничего делать не надо переходим к настройке ubuntu 12.04 server.

Установка нужных нам пакетов и обновление системы

apt-get update
apt-get upgrade
apt-get install krb5-user krb5-config libkrb53 ntp ssh mc htop squid3 libpam-krb5

Настройка DNS

Пишем в /etc/resolv.conf какой домен искать и на каком DNS сервере:

domain DOMEN.LOCAL
search DOMEN.LOCAL
nameserver 192.168.0.1
nameserver 192.168.0.2

Проверяем что контроллер домена доступен:

nslookup dc.domen.local
ping dc.domen.local

Настройка сети

Настраиваем сервер на статический ip nano /etc/network/interfaces

auto eth0
iface eth0 inet static
address 192.168.0.43
netmask 255.255.240.0
gateway 192.168.0.254
dns-nameservers 192.168.0.1 192.168.0.2

Для применения изменений остается перезапустить службу

service networking restart

Настройка синхронизации времени

Далее необходимо настроить синхронизацию времени с домен контроллером. Если разница будет более 5 минут мы не сможем получить лист от Kerberos. Для единовременной синхронизации можно воспользоваться командой:

ntpdate dc.domen.local

Теперь надо исправить файл добавив в него информацию о вашем сервере времени: nano /etc/ntp.conf

server dc.domen.local

Перезапускаем ntp

sudo /etc/init.d/ntp restart

 

Настройка KERBEROS

nano /etc/krb5.conf И приводим его вот к такому виду

[libdefaults]
        default_realm = DOMEN.LOCAL
        default_keytab_name = /etc/krb5.keytab
# The following krb5.conf variables are only for MIT Kerberos.
        krb4_config = /etc/krb.conf
        krb4_realms = /etc/krb.realms
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true

# The following encryption type specification will be used by MIT Kerberos
# if uncommented.  In general, the defaults in the MIT Kerberos code are
# correct and overriding these specifications only serves to disable new
# encryption types as they are added, creating interoperability problems.
#
# Thie only time when you might need to uncomment these lines and change
# the enctypes is if you have local software that will break on ticket
# caches containing ticket encryption types it doesn't know about (such as
# old versions of Sun Java).

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

ticket_lifetime = 24000

# The following libdefaults parameters are only for Heimdal Kerberos.
        v4_instance_resolve = false
        v4_name_convert = {
                host = {
                        rcmd = host
                        ftp = ftp
                }
                plain = {
                        something = something-else
                }
        }
        fcc-mit-ticketflags = true

[realms]
        DOMEN.LOCAL = {
                kdc = dc:88
                kdc = dc1:88
                kdc = dc2:88
                admin_server = dc:749
                admin_server = dc1:749
                admin_server = dc2:749
                default_domain = DOMEN.LOCAL
        }

[domain_realm]
.domen.local=DOMEN.LOCAL
domen.local=DOMEN.LOCAL

[login]
        krb4_convert = true
        krb4_get_tickets = false
[logging]
kdc = FILE:/var/log/kdc.log
admin_server = FILE:/var/log/kadmin.log
default = FILE:/var/log/krb5lib.log
FILE=/var/log/kdc.log

Копируем сгенерированный krb5.keytab в /etc/krb5.keytab и даем нужные права И назначим права на кейтаб:

chown proxy:proxy /etc/krb5.keytab
chmod 664 /etc/krb5.keytab

Проверим правильность настройки kerberos kinit user Потребует ввести пароль, если после ввода пароля никаких ошибок не появилось то идем дальше, если есть ошибки стоит еще раз внимательно перепроверить файл /etc/krb5.conf

Теперь проверим кейтаб который мы сделали ранее на контроллере домена:

kinit -V -k -t /etc/krb5.keytab HTTP/squidkerb.domen.local@DOMEN.LOCAL

Должно быть сообщение об успешной авторизации. Если наблюдаются ошибки то здесь они могут быть самыми не очевидными например не поддерживается алгоритм шифрования. вывод дожен быть примерно таким :

Using default cache: /tmp/krb5cc_0
Using principal: HTTP/squidkerb.domen.local@DOMEN.LOCAL
Using keytab: /etc/krb5.keytab
Authenticated to Kerberos v5

Командой kinit с параметром -k и указанным именем службы мы попробовали проверить подлинность без пароля с помощью keytab. Дополнительно могу отметить, что иногда приходится к kinit добавить ключ -t с путем к кейтаб-файлу. Это может понадобиться, если по какой-то причине, kinit не смог найти и обратиться к keytab файлу по умолчательному пути. -V это для более подробной информации об ошибках

Если на данном этапе kinit выдал ошибки, то далее настраивать смысла нет, ибо Kerberos клиент работает не корректно. Необходимо избавиться от ошибок.

Настройка Squid3

Скажем squid создать кэш и перезапустим чтобы проверить что он работает.

squid3 -z
/etc/init.d/squid3 restart

Cоздаем файл /etc/pam.d/squid в который пишем:

auth required pam_krb5.so
session required pam_krb5.so
account required pam_krb5.so
password required pam_krb5.so

Посмотрим как выглядит конфиг squid3 без лишнего мусора

egrep -v '^#|^$' /etc/squid3/squid.conf

Или вот так :

cat /etc/squid3/squid.conf | grep -v ^# | grep -v ^$

/etc/squid3/squid.conf

acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
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
http_access allow manager localhost
http_access deny manager
include /etc/squid3/auth.conf
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid3
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

Я оставил дефолтный конфиг и добавил свои настройки(все комментарии я стёр, чтобы было удобочитаемо) :

:>/etc/squid3/squid3.conf

Вот так выглядит конфиг после всех изменений :

#Поддержка прозрачного проксирования.
http_port 3128 intercept
#Этот тэг задает список слов, которые при нахождении их(этих слов) в URL,сообщают Squid то, что объект расположенный по этому URL надо брать напрямую, 
#а не из кэша.
hierarchy_stoplist cgi-bin ?

# Отключим кеширование динамически загружаемых страниц
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
# Этот тэг определяет Email адрес на который будет отправлено сообщение, если Squid рухнет.
cache_mgr user@domen.ru
# Полезные файлы для статистики, а также хранение кеша.
cache_mem 1024 MB
cache_dir ufs /var/spool/squid3/cache 150000 64 512
cache_access_log /var/log/squid3/access.log
cache_log /var/log/squid3/cache.log
cache_store_log /var/log/squid3/store.log
#При достижение этого уровня заполнения кэша (в процентном соотношении) начинается ускоренный процесс удаления старых объектов.
cache_swap_high 95
#Процесс удаления прекращается при достижении этого уровня.
cache_swap_low 90


#Используем специальный helper для прозрачной авторизации через kerberos
auth_param negotiate program /usr/lib/squid3/squid_kerb_auth -s HTTP/squidkerb.domen.local@DOMEN.LOCAL
auth_param negotiate children 20
auth_param negotiate keep_alive on

#Используем kerberos через систему pam для стандартной авторизации с запросом пароля
auth_param basic program /usr/lib/squid3/pam_auth -n squid
auth_param basic children 10
auth_param basic credentialsttl 2 hours
auth_param basic realm DOMEN.LOCAL

#Необходимо для поиска групп в AD

external_acl_type ldap_check ttl=1200 children=15 %LOGIN /usr/lib/squid3/squid_ldap_group -R -b "dc=domen,dc=local"
-f "(&(objectclass=person)(sAMAccountName=%v)(memberof=cn=%a,ou=Groups,ou=MainUsers,dc=domen,dc=local))"
-D "ldap@domen.local" -w "MegaPass" -K 192.168.0.1 Несколько замечаний по поводу данного хелпера: первое и самое плохое он не понимает русских букв. второе данный путь стоит читать с конца тоесть снизу вверх, а не сверху вниз по порядку. (memberof=cn=%a,ou=IT,
ou=domen,dc=domen,dc=local) acl manager proto cache_object acl localhost src 127.0.0.1/32 ::1 acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1 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 lan proxy_auth REQUIRED #Описание групп доступа из AD acl all_it external ldap_check IT acl all_inet external ldap_check inet #Описываем пользователей которые не входят в другие группы acl auth proxy_auth test@DOMEN.LOCAL http_access allow all_inet http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow lan http_access allow localhost http_access deny all coredump_dir /var/spool/squid3 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 cache_effective_user proxy http_reply_access allow all icp_access allow all append_domain .domen.local error_directory /usr/share/squid3/errors/Russian-1251 visible_hostname proxy.domen.local squid Server logfile_rotate 7

Перезапускаем squid

/etc/init.d/squid3 restart

проверим что в логах нет ошибок

tail -n 50 /var/log/squid3/access.log

Если все впорядке то осталось настроить браузер на клиенте.

Прочитано 4017 раз Последнее изменение Пятница, 12 Сентябрь 2014 04:52
Авторизуйтесь, чтобы получить возможность оставлять комментарии