Pull to refresh

Интеграция squid c MS Active Directory

Итак, я все же решил написать статью для хабра (а может, и цикл статей), посвященную системному администрированию. И сегодня я хочу рассказать о настройке squid, а точнее — об интеграции его с MS Active Directory. Несколько месяцев назад у меня возникла задача перевести шлюз под управлением Win2003 с MS ISA на что-нибудь open source. Причина банальна — лицензионная чистота. Тонкость заключалась в том, что разграничение выхода во внешний мир велось на основе доменных групп, в сети обитало пару сотен компьютеров, в домене — более тысячи юзверей, и надо было «подменить» шлюзовую машину как можно незаметнее. Т.к. MS ISA — это прокси сервер и firewall в одном лице, то заменой ему была выбрана связка squid + iptables. Про настройку первого я и буду сегодня говорить.

Итак, задача — установить кальмара, настроить ntlm и basic аутентификацию, прикрутить сюда же доменные группы и на их основе разрешать/запрещать доступ, резать скорость и прочие радости прокси-сервера. Кроме того, естественно, нам надо будет вести какую-то статистику. Я настраивал все это на Debian Lenny, соответственно для других дистрибутивов некоторые моменты будут выглядеть иначе, но общие идеи сохраняются.

Итак, первым делом нам надо включить шлюзовую машину в домен (в принципе, можно обойтись без этого, работая с AD как LDAP, но из-за нелюбви мелкомягких к стандартам, будут свои тонкости и ограничения — не получится работать с вложенными группами. Кроме того, не будет работать прозрачная авторизация через ntlm). Нам понадобятся samba и winbind — делаем
aptitude install samba winbind ,
и приступаем к конфигурации. Открываем /etc/samba/smb.conf и начинаем редактировать. Во первых, меняем строку
workgroup = domain,
где domain — имя вашего домена. Во вторых — добавляем строку
winbind use default domain = no
— указываем winbind, что имена пользователей и групп надо брать в виде domain\user (ну или domain\group). Для чего это надо? При прозрачной для пользователя ntlm аутентификации логин отдается именно в таком формате. Меняем cтроку
security = domain
— по умолчанию там стоит share. Далее находим и раскомментируем еще две строки
idmap uid = 10000-20000
idmap gid = 10000-20000

— задаем диапазон, в который будут преобразовыватся user id и group id из AD на нашей машине. Если этого не сделать — машина войдет в домен, аутентификация будет работать, но вот с доменными группами будут проблемы. На этом настройка samba закончена, делаем
/etc/init.d/samba restart
/etc/init.d/winbind restart,

что бы применить настройки, и пробуем войти в домен. Внимание, тонкий момент — если на машине уже настроен фаервол, то в нем надо разрешить входящие UDP пакеты с 137-го порта. Для iptables это выглядит примерно так —
iptables -A INPUT -i $LETH -p udp --sport 137 -j ACCEPT.

Собственно, присоединение к домену происходит командой
net join domainname -U username ,
где domainname- имя нашего домена, username — имя пользователя, обладающего соответствующими правами. Если все сделанно правильно, то нас спросят пароль юзера, и после этого машина успешно войдет в домен. Проверяем — wbinfo -t — должны получить ответ checking the trust secret via RPC calls succeeded
, потом wbinfo -u, wbinfo -g — список пользователей и групп соответственно. Если все работает — поздравляю, пора переходить непосредственно к настройке squid.

Кальмара стоит брать из второй ветки, потому что третий, несмотря на статус stable, еще полон мелких неприятных багов, и в связке с ntlm-auth работает нестабильно. Итак, делаем aptitude install squid, и начинаем редактировать конфиг, причем удобнее дефолтный переименовать и использовать просто как справочник, а «боевой» конфиг писать с нуля. Поскольку статей по настройке squid написанно уже огромное количество, то я не буду описывать весь процесс, а ограничусь только тем, что касается интеграции с AD. Первым делом добавляем строки
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 200
auth_param ntlm keep_alive on

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

Этим мы задаем хелпер для аутентификации. Особое внимание советую обратить на опцию children — количество запускаемых процессов. Не стоит стеснятся, лучше сразу ставить по-больше, иначе рискуете получить «подвисания» авторизации с записью в логе All ntlmauthenticator processes are busy. Кстати, этим грешит третий сквид — перестает авторизовывать пользователей через несколько часов работы, что и заставило меня после экспериментов с оным откатиться на вторую ветку. Далее описываем хелпер для работы с группами —
external_acl_type nt_group children=100 ttl=150 %LOGIN /usr/lib/squid/wbinfo_group.pl

Это скрипт на перле, идущий в комплекте со сквидом. На самом деле он вызывает wbinfo и парсит его вывод, потому работает не слишком быстро, но других вариантов полноценной работы с группами нет. nt_group — это название типа acl, сами группы описываются ниже примерно такой конструкцией:

acl squid_name external nt_group domain_group_name

где squid_name — это название для acl. Которое будет использоватся нами дальше в конфиге, а domain_group_name — имя группы в AD. Например в моем конфиге это выглядит так
acl no_inet external nt_group no_inet
acl speed_limit external nt_group speed_limit
acl full_inet external nt_group full_inet
acl Students external nt_group student
acl normal_inet external nt_group normal_inet

Далее добавляем в конфиг строки
acl mydomain proxy_auth REQUIRED
http_access deny !mydomain

разрешаем доступ только авторизованным пользователям, и начинаем раздавать права. Например так — http_access deny no_inet

#тут закрываем доступ к сайтам
acl deny_url url_regex "/etc/squid/badsites"
http_access deny Students deny_url

http_access allow speed_limit
http_access allow full_inet
http_access allow Students
http_access allow normal_inet

Аналогично настраиваются delay_pools, единственное, на что стоит обратить внимание — что бы пул на основе доменной группы корректно работал, обязательно должно срабатывать правило в http_access с названием этой группы. Для примера опять приведу кусок моего конфига —
delay_pools 3
delay_class 1 2 #для злосных качальщиков
delay_class 2 2 #привилегированные - без ограничений
delay_class 3 2 #все остальные

delay_access 1 allow speed_limit
delay_access 1 deny all
delay_access 2 allow full_inet

delay_access 2 deny all
delay_access 3 allow normal_inet
delay_access 3 allow Students
delay_access 3 deny all

Настроив и запустив прокси-сервер, пора задуматься о сборе статистики. Тут я могу дать ссылку на отличную статью, от себя же только добавлю несколько нюансов, касающихся sarg-reports. Дело в том, что по-умолчанию в Debian ротация логов происходит ежедневно (и это правильно, незачем собирать огромные текстовые файлы). Потому что бы сгенерить статистику за прошедшую неделю/месяц, придется несколько подредактировать sarg-reports — это скрипт для запуска sarg, лежит он в /usr/sbin. Открываем его любимым редактором, и находим два куска кода — weekly () и mounthly(), после чего приводим их к такому виду —
weekly ()
{
LOG_FILES=
for ((i=7;i>1;i--))
do
if [[ -s /var/log/squid/access.log.$i.gz ]]; then
LOG_FILES="$LOG_FILES -l /var/log/squid/access.log.$i.gz"
fi
done
if [[ -s /var/log/squid/access.log.1 ]]; then
LOG_FILES="$LOG_FILES -l /var/log/squid/access.log.1"
fi
if [[ -s /var/log/squid/access.log ]]; then
LOG_FILES="$LOG_FILES -l /var/log/squid/access.log"
fi
WEEKLYOUT=$HTMLOUT/$WEEKLY
mkdir -p $WEEKLYOUT
create_index_html
$SARG -f $CONFIG $LOG_FILES -d $WEEKAGO-$YESTERDAY -o $WEEKLYOUT >$ERRORS 2>&1
exclude_from_log
}

monthly ()
{
LOG_FILES=
for ((i=31;i>1;i--))
do
if [[ -s /var/log/squid/access.log.$i.gz ]]; then
LOG_FILES="$LOG_FILES -l /var/log/squid/access.log.$i.gz"
fi
done
if [[ -s /var/log/squid/access.log.1 ]]; then
LOG_FILES="$LOG_FILES -l /var/log/squid/access.log.1"
fi
if [[ -s /var/log/squid/access.log ]]; then
LOG_FILES="$LOG_FILES -l /var/log/squid/access.log"
fi
MONTHLYOUT=$HTMLOUT/$MONTHLY
mkdir -p $MONTHLYOUT
create_index_html
$SARG -f $CONFIG $LOG_FILES -d $MONTHAGO -o $MONTHLYOUT >$ERRORS 2>&1
exclude_from_log
}


Т.е., «натравливаем» sarg на все скопившиеся файлы. Для отчетов, генерируемых sarg, лучше всего выделить отдельный раздел, отформатированный в reiserfs, т.к. там будет очень много мелких файлов. На своем шлюзе я столкнулся с тем, что на ext3 через три месяца банально кончились иноды.
Кроме того, стоит поменять количество хранимых лог-файлов (по умолчанию хранится слишком мало). Для этого редактируем /etc/logrotate.d/squid
, меняя там параметр rotate — количество хранимых файлов. На этом настройку того, что относится к прокси-серверу, можно считать законченным.

В следующей статья я постараюсь описать вторую часть настройки шлюза — сборку ядра с патчами imq и level7, настройку iptables и шейпера, учет трафика и прочие нюансы.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.