2009-05-26

Настройка SQUID с авторизацией в домене Windows

От Филиппова А.С., скромного админа, на радость всем остальным скромным админам ;)

Настройка SQUID с авторизацией в домене Windows

Автор: Филиппов Алексей
Дата создания: 20 февраля 2007

Итак, необходимо настроить SQUID таким образом, чтобы он авторизовал пользователей через домен Windows.

Имеется домен mydomain.com.ua, работающий на Windows 2000 Server. В нем есть 2 сервера, alpha.mydomain.com.ua и centavr.mydomain.com.ua с адресами 192.168.1.3 и 192.168.1.2 соответственно.
SQUID будет крутится на операционной системе SLES9. На этом сервере должны быть установлены следующие пакеты:
samba-3.0.20b-3.4
samba-client-3.0.20b-3.4
samba-winbind-3.0.20b-3.4
heimdal-0.6.1rc3-55.18
sarg-2.1-10
squid-2.5.STABLE5-42.44
apache2-2.0.49-27.38

Итак, поехали.
Редактируем файл /etc/resolv.conf. Там должно быть прописано следующее:

nameserver 192.168.1.2
nameserver 192.168.1.3
search mydomain.com.ua

В итоге если мы запустим ping alpha, то обязательно должен быть ответ.
Настраиваем клиента Kerberos. Для этого редактируем файл /etc/krb5.conf. Содержание его должно быть следующим:

[libdefaults]
default_realm = mydomain.com.ua
clockskew = 300
v4_instance_resolve = false
v4_name_convert = {
host = {
rcmd = host
ftp = ftp
}
plain = {
something = something-else
}
}

[realms]
mydomain.com.ua = {
kdc = alpha.mydomain.com.ua
admin_server = alpha.mydomain.com.ua
}

[domain_realm]
.mydomain.com.ua = mydomain.com.ua

Проверяем соединение с сервером Kerberos:

root> kinit -p philippoff
philippoff@mydomain.com.ua's Password: <тут вводим пароль пользователя philippoff>
kinit: NOTICE: ticket renewable lifetime is 1 week

Если ответ отличается от приведенного выше и говорит об ошибке – значит что-то не так настроили, или еще чего-нибудь...
Проверим состояние соединения:

root> klist
Credentials cache: FILE:/tmp/krb5cc_0
Principal: philippoff@mydomain.com.ua

Issued Expires Principal
Feb 20 11:37:08 Feb 20 21:37:02 krbtgt/mydomain.com.ua@mydomain.com.ua

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

Настраиваем Samba. Для этого редактируем файл /etc/samba/smb.conf. Кроме всего, что в нем может находится, обязательно должно присутствовать следующее (или если ничего от самбы кроме авторизации сквида не надо, то достаточно быдет только этого):

[global]
workgroup = CO
server string = legion
netbios name = legion
security = ads
realm = mydomain.com.ua
password server = alpha.mydomain.com.ua
encrypt passwords = yes
winbind separator = +
winbind use default domain = yes
winbind uid = 10000-15000
winbind gid = 10000-15000
winbind enum users = yes
winbind enum groups = yes

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

root> net ads join -U admin_name%admin_password
Joined 'LEGION' to realm 'mydomain.com.ua'

Если ответ получен с ошибкой, что делать в таких случаях смотреть выше :)
После этого необходимо, чтобы запускался необходимый набор служб. Это smb, nmb, winbind. Самый простой вариант – это завалиться в YaST под root, зайти в «Runlevel Editor» и поставить сервисы nmd, smb, winbind в состояние «Включен», то есть на автостарт. Или можно руками:

root> ln -s /etc/init.d/nmb /etc/init.d/rc3.d/K15nmb
root> ln -s /etc/init.d/nmb /etc/init.d/rc3.d/S07nmb
root> ln -s /etc/init.d/smb /etc/init.d/rc3.d/K10smb
root> ln -s /etc/init.d/smb /etc/init.d/rc3.d/K12smb
root> ln -s /etc/init.d/winbind /etc/init.d/rc3.d/K14winbind
root> ln -s /etc/init.d/winbind /etc/init.d/rc3.d/S08winbind
root> ln -s /etc/init.d/nmb /etc/init.d/rc5.d/K15nmb
root> ln -s /etc/init.d/nmb /etc/init.d/rc5.d/S07nmb
root> ln -s /etc/init.d/smb /etc/init.d/rc5.d/K10smb
root> ln -s /etc/init.d/smb /etc/init.d/rc5.d/K12smb
root> ln -s /etc/init.d/winbind /etc/init.d/rc5.d/K14winbind
root> ln -s /etc/init.d/winbind /etc/init.d/rc5.d/S08winbind

Если вы включали сервисы через YaST, то они в процессе применения изменений запустятся, если нет, то есть делали руками, то и запускать из придется руками:

root> /etc/init.d/nmb start
root> /etc/init.d/smb start
root> /etc/init.d/winbind start

Проверяем работоспособность winbind:

root> wbinfo -t
checking the trust secret via RPC calls succeeded

Если появился такой ответ, значит учетная запись компьютера успешно зарегистрирована в домене Windows. Проверяем дальше:

root> wbinfo -u

Должен появится список пользователей и компьютеров домена. У меня он весьма немаленький, так что даже для примера приводить не буду, краска в принтере кончится :). Но что самое замечательное, в этом списке есть запись «legion$», что подтверждает то, что учетка нашего компьютера в домене зарегистрирована правильно. Если этой записи нет – смотрим внимательнее, она должна быть :), только у вас может называться по другому. Кстати сказать, у меня первый раз эта проверка не отработала, а свкид при этом уже всех во всю авторизовал. А потом вдруг заработала сама по себе.
Дальше проверяем:

root> wbinfo -g

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

root> wbinfo -a user_name%user_password
plaintext password authentication succeeded
challenge/response password authentication succeeded

Полученный ответ говорит о том, что все идет по плану :) Аутентификация прошла успешно.
Теперь настраиваем файл конфигурации Name Service Switch. Для этого в конец файла /etc/nsswitch.conf добавляем две строки (смотри внимательно, может они там уже есть):

passwd: files winbind
group: files winbind

Если вдруг окажется, что в данном файле уже присутствуют строки, которые начинаются на passwd или group и они отличны от тех, что мы добавляем, то просто комментируем их, если одинаковы, то можно наши строки не добавлять.
После этого:

root> /etc/init.d/nscd restart

После этого проверяем распознавание доменных пользователей линуксом (я проверяю на своей учетке):

root> id Philippoff
uid=10000(philippoff) gid=10001(Пользователи домена) группы=10001(Пользователи домена),10012(Programmers),10063(LowInternetAccess),10065(High Internet Access),10070(SitAccess),10074(RemoteAdmins),10109(Admin Internet Access)

Как видите, такой ответ подразумевает, что наш дорогой линукс знает о пользователе Philippoff если не все, то очень многое. И это хорошо, это то, что нам и нужно :) Опять же эта замечательная проверка с первого раза у меня не отработала. Только после перезапуска служб, а то и перезагрузке сервера. А может и после чего-то еще, только чего – не помню.

Ну вот, пришло время заняться собственно головоногими. SQUID у нас уже установлен. Настраиваем его. Нас интересует файл /etc/squid/squid.conf. Файл этот может быть весьма пухлым, сложным и неприятным на вид. По крайней мере у меня так и есть. В файле должны присутствовать следующие секции:

# Секция для аутентификации пользователей по NTLM
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 10
auth_param ntlm max_challenge_reuses 0

# Секция для базовой аутентификации пользователей
auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 10
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

acl adusers proxy_auth REQUIRED LowInternetAccess
http_access allow adusers

ВНИМАНИЕ!!! В acl нельзя использовать доменные группы, только логины. По другому, хоть убейся, работать не будет! Хотя, может у вас получиться :)
Тут показан самый простой вариант. acl-ов с виндозными логинами можете наклепать хоть миллион – ваше право, squid выдержит (хотя с миллионом я не пробовал...).
На данный момент конфиг SQUID на legion выглядит так:

##############
### GLOBAL ###
##############

cache_peer 192.168.11.70 parent 3128 3130 no-query no-digest
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY
cache_dir ufs /var/cache/squid 5000 16 256
forwarded_for 10.77.11.70
cache_mgr legion@proxy.mydomain.com.ua
quick_abort_min 0 KB
quick_abort_max 0 KB
http_port 8080

######################
##### AUTH_PARAM #####
######################

auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 10
auth_param ntlm max_challenge_reuses 0

auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 10
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours

#################
###### ACL ######
#################

acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_objects
acl localhost src 127.0.0.1/255.255.255.255
acl SSL_ports port 443 563 5190
acl Safe_ports port 21 70 80 210 280 443 488 563 591 777 901 1025-65535 90
acl purge method PURGE
acl CONNECT method CONNECT

acl bad_url url_regex "/etc/squid/bad_url"
acl microsoft url_regex "/etc/squid/microsoft"
acl bad_files urlpath_regex .wav$ .avi$ .wmv$ .mpg$ .mp3$ .mov$ .wmf$ .3gp$ .mpeg$ .mpeg4$

acl adFull proxy_auth Philippoff
acl adHighSpeed proxy_auth setter Dyadyov Chebukin Salygin Belyaev
acl adMediumSpeed proxy_auth Solovyov Shevchuk Levin Linik Badenko
acl adLowSpeed proxy_auth Goncharov Taran Dispetcher Boyko Borisuk
acl adICQRes proxy_auth nkrash1 nkrash2 nkrash3 crrash1 crrash2 crrash3 gsrash1 gsrash2 gsrash3 kvrash1

#########################
###### HTTP_ACCESS ######
#########################

never_direct allow all

http_access allow manager localhost
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost

http_access allow adFull !microsoft
http_access allow adHighSpeed !bad_url !bad_files !microsoft
http_access allow adMediumSpeed !bad_url !bad_files !microsoft
http_access allow adLowSpeed !bad_url !bad_files !microsoft
http_access allow adICQRes !bad_url !bad_files !microsoft

http_access deny all

#########################
###### DELAY_POOLS ######
#########################

delay_pools 3

delay_class 1 1
delay_parameters 1 8000/8000
delay_access 1 allow adLowSpeed
delay_access 1 deny all

delay_class 2 1
delay_parameters 2 15000/15000
delay_access 2 allow adMediumSpeed
delay_access 2 deny all

delay_class 3 1
delay_parameters 3 500/500
delay_access 3 allow adICQRes
delay_access 3 deny all


Файлы bad_url и microsoft занимаются тем, что рубят доступ к порнухе (и другим ненужным, но интересным для работников любой конторы темам) и к серверам Майкрософта. Вот листинг (bad_url приведен не полностью, т.к. ну очень большой).

/etc/squid/bad_url:

mp3
c-e-k-c
cekc
dildo
porevo
porno
porn
sex
xxx
lesbi
adult
erotic
glamur
prastitutki
prostitutki
prastitutky
prostitutky

Ну в общем бешеное буйство фантазии :)

/etc/squid/bad_url:

microsoft

Теперь ставим squid на автозагрузку так, как делали со службами самбы. То есть либо через YaST, либо руками:


root> ln -s /etc/init.d/squid /etc/init.d/rc3.d/K07squid
root> ln -s /etc/init.d/squid /etc/init.d/rc3.d/S15squid
root> ln -s /etc/init.d/squid /etc/init.d/rc5.d/K07squid
root> ln -s /etc/init.d/squid /etc/init.d/rc5.d/S15squid

Ну и если вы делали линки для автостарта руками, то и запускаем руками:

root> /etc/init.d/squid start

Ну и маленькая мелочь – меняем права доступа на один системный каталог:

root> chmod 750 /var/lib/samba/winbindd_privileged

Ну вот и все – закончен сей великий труд, все настроено правильно и по правилам. Казалось бы, можно радоваться! Но...
Аутентификация по NTLM НЕРАБОТАЕТ!!! Базовая, понимаешь, работает, а NTLM нет. И нахрена, спрашивается мы всем этим занимались??? Что поделать, без костылей никуда. Путем мучительных проб и ошибок (хорошо, что не моих, кто-то до меня успел головой о стенку побиться) было выяснено, если провести определенный ряд последовательных действий, то заставить работать осьминога можно. Итак. Создаем файлик /etc/init.d/squid_winbind и заполняем его следующим содержимым:

#!/bin/bash
echo " ###############################################"
echo " ### START Shamanstvo wokrug SAMBA & WINBIND ###"
echo " ###############################################"
echo "chmod 750 /var/lib/samba/winbindd_privileged -R"
chmod 750 /var/lib/samba/winbindd_privileged -R
/etc/init.d/winbind stop
/etc/init.d/squid stop
/etc/init.d/winbind start
echo "chmod 777 /var/lib/samba/winbindd_privileged -R"
chmod 777 /var/lib/samba/winbindd_privileged -R
/etc/init.d/squid start
echo " ################################################"
echo " ### FINISH Shamanstvo wokrug SAMBA & WINBIND ###"
echo " ################################################"

Вот этот файлик будет правильно все запускать. Теперь ставим его на автозагрузку:

root> ln -s /etc/init.d/squid_winbind /etc/init.d/rc3.d/S99squid_winbind
root> ln -s /etc/init.d/squid_winbind /etc/init.d/rc5.d/S99squid_winbind

Внимательные люди уже заметили, что я ставлю линки только на запуск. И это правильно. А почему – догадайтесь сами :). Хотя вообще ситуация несколько неправильная (причем вдвойне), ну да ладно. Ну и собственно проверяем:

root> /etc/init.d/squid_winbind

Проверяйте, теперь все должно работать.
Ну и напоследок настроим хоть какой-нибудь мониторинг нашего головоногого. Устанавливаем sarg. Где вы его возьмете – ваши проблемы. Я утянул откуда-то из инета, так как в SLES9 его нет. Постарался найти самую последнюю версию для SLES9, нашел sarg-2.1-10. Настраиваем sarg. Предполагается, что логи sarg будет хранить в каталоге /var/log/sarg. Редактируем файлик /etc/sarg.conf. Нафиг все оттуда выкидываем, оставляем только следующее:

access_log /var/log/squid/access.log
output_dir /var/log/sarg
max_elapsed 28800000

Настраиваем расписание работы sarg. Делается это по следующей причине – sarg не является монитором реального времени, он работает только после того, как его пнешь командой (еж птица гордая, пока не пнешь – не полетит). Поэтому:

root> export EDITOR=mcedit
root> crontab -e

В открывшемся расписании cron-а добавляем следующие строки:

30 7 * * * sarg
12 12 * * * sarg
00 13 * * * sarg
30 16 * * * sarg

Вы можете настроить расписание так, как вам удобнее – ваше право. Мне удобно так.
Кроме того, при ротации логов тоже будет выполняться sarg. Об этом ниже.

Теперь настроим мониторинг реального времени. Для этого нам понадобится такая классная штука, как sqstat. Стянуть можно с http://samm.kiev.ua/sqstat/. Содержимое архива распаковываем в папку /var/log/sqstat. И настраиваем. Файлик config.inc.php.defaults копируем в эту же папку с именем config.inc.php. После редактирования у меня он выглядит следующим образом:



Кроме того для apache2 необходимо проставить php. Кстати, обратите внимание, что у меня sqstat занимается мониторингом двух хостов :)
Ну и теперь настраиваем apache2, чтоб можно было на sarg и sqstat смотреть по человечески. Редактируем файл /etc/apache2/httpd.conf, в самый конец дописываем:


ServerAdmin legion@proxy.mydomain.com.ua
ServerName legion.mydomain.com.ua
Alias /sarg "/var/log/sarg"

Order Deny,Allow
Allow from all
Options -Indexes

Alias /sqstat "/var/log/sqstat"

Order Deny,Allow
Allow from all
Options -Indexes



Запускаем апач и делаем первый сбор sarg:

root> /etc/init.d/apache2 start
root> sarg

После этого через любой обозреватель (IE, FireFox, Mozilla, Opera, NetScape, linx, Konqueror, SeaMonkey...) открываем ссылку: http://legion/sarg и смотрим содержимое. Если видим фигу – RTFM.
Кроме того открываем ссылку http://legion/sqstat/sqstat.php и смотрим на активные сессии. Опять же, если видим фигу – RTFM. Ну а че тут еще посоветовать???
Ну и занимаемся любимым делом – ставим apache2 в автозагрузку. Если руками, то так:

root> ln -s /etc/init.d/apache2 /etc/init.d/rc3.d/K08squid
root> ln -s /etc/init.d/apache2 /etc/init.d/rc3.d/S14apache2
root> ln -s /etc/init.d/apache2 /etc/init.d/rc5.d/K08apache2
root> ln -s /etc/init.d/apache2 /etc/init.d/rc5.d/S14apache2

Теперь настраиваем ротацию логов сквида, а заодно добавляем еще один сбор sarg. Для этого создаем каталог /var/log/arhiv/squid, и после этого редактируем /etc/logrotate.d/squid. Должно выглядеть так:

/var/log/squid/cache.log {
compress
dateext
maxage 365
rotate 99
size=+1024k
notifempty
missingok
create 640 squid root
postrotate
/etc/init.d/squid reload
endscript
olddir /var/log/arhiv/squid
}

/var/log/squid/access.log {
compress
dateext
maxage 365
rotate 100
daily
notifempty
missingok
create 640 squid root
prerotate
sarg
endscript
postrotate
/etc/init.d/squid reload
endscript
olddir /var/log/arhiv/squid
}

/var/log/squid/store.log {
compress
dateext
maxage 365
rotate 99
daily
notifempty
missingok
create 640 squid root
postrotate
/etc/init.d/squid reload
endscript
olddir /var/log/arhiv/squid
}

Пока все...

20 февраля 2007

Комментариев нет: