Итак, я все же решил написать статью для хабра (а может, и цикл статей), посвященную системному администрированию. И сегодня я хочу рассказать о настройке squid, а точнее — об интеграции его с MS Active Directory. Несколько месяцев назад у меня возникла задача перевести шлюз под управлением Win2003 с MS ISA на что-нибудь open source. Причина банальна — лицензионная чистота. Тонкость заключалась в том, что разграничение выхода во внешний мир велось на основе доменных групп, в сети обитало пару сотен компьютеров, в домене — более тысячи юзверей, и надо было «подменить» шлюзовую машину как можно незаметнее. Т.к. MS ISA — это прокси сервер и firewall в одном лице, то заменой ему была выбрана связка squid + iptables. Про настройку первого я и буду сегодня говорить.
Итак, задача — установить кальмара, настроить ntlm и basic аутентификацию, прикрутить сюда же доменные группы и на их основе разрешать/запрещать доступ, резать скорость и прочие радости прокси-сервера. Кроме того, естественно, нам надо будет вести какую-то статистику. Я настраивал все это на Debian Lenny, соответственно для других дистрибутивов некоторые моменты будут выглядеть иначе, но общие идеи сохраняются.
Итак, первым делом нам надо включить шлюзовую машину в домен (в принципе, можно обойтись без этого, работая с AD как LDAP, но из-за нелюбви мелкомягких к стандартам, будут свои тонкости и ограничения — не получится работать с вложенными группами. Кроме того, не будет работать прозрачная авторизация через ntlm). Нам понадобятся samba и winbind — делаем
и приступаем к конфигурации. Открываем /etc/samba/smb.conf и начинаем редактировать. Во первых, меняем строку
где domain — имя вашего домена. Во вторых — добавляем строку
— указываем winbind, что имена пользователей и групп надо брать в виде domain\user (ну или domain\group). Для чего это надо? При прозрачной для пользователя ntlm аутентификации логин отдается именно в таком формате. Меняем cтроку
— по умолчанию там стоит share. Далее находим и раскомментируем еще две строки
— задаем диапазон, в который будут преобразовыватся user id и group id из AD на нашей машине. Если этого не сделать — машина войдет в домен, аутентификация будет работать, но вот с доменными группами будут проблемы. На этом настройка samba закончена, делаем
что бы применить настройки, и пробуем войти в домен. Внимание, тонкий момент — если на машине уже настроен фаервол, то в нем надо разрешить входящие UDP пакеты с 137-го порта. Для iptables это выглядит примерно так —
Собственно, присоединение к домену происходит командой
где 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. Первым делом добавляем строки
Этим мы задаем хелпер для аутентификации. Особое внимание советую обратить на опцию children — количество запускаемых процессов. Не стоит стеснятся, лучше сразу ставить по-больше, иначе рискуете получить «подвисания» авторизации с записью в логе All ntlmauthenticator processes are busy. Кстати, этим грешит третий сквид — перестает авторизовывать пользователей через несколько часов работы, что и заставило меня после экспериментов с оным откатиться на вторую ветку. Далее описываем хелпер для работы с группами —
Это скрипт на перле, идущий в комплекте со сквидом. На самом деле он вызывает wbinfo и парсит его вывод, потому работает не слишком быстро, но других вариантов полноценной работы с группами нет. nt_group — это название типа acl, сами группы описываются ниже примерно такой конструкцией:
где squid_name — это название для acl. Которое будет использоватся нами дальше в конфиге, а domain_group_name — имя группы в AD. Например в моем конфиге это выглядит так
Далее добавляем в конфиг строки
разрешаем доступ только авторизованным пользователям, и начинаем раздавать права. Например так —
Аналогично настраиваются delay_pools, единственное, на что стоит обратить внимание — что бы пул на основе доменной группы корректно работал, обязательно должно срабатывать правило в http_access с названием этой группы. Для примера опять приведу кусок моего конфига —
Настроив и запустив прокси-сервер, пора задуматься о сборе статистики. Тут я могу дать ссылку на отличную статью, от себя же только добавлю несколько нюансов, касающихся sarg-reports. Дело в том, что по-умолчанию в Debian ротация логов происходит ежедневно (и это правильно, незачем собирать огромные текстовые файлы). Потому что бы сгенерить статистику за прошедшую неделю/месяц, придется несколько подредактировать sarg-reports — это скрипт для запуска sarg, лежит он в /usr/sbin. Открываем его любимым редактором, и находим два куска кода — weekly () и mounthly(), после чего приводим их к такому виду —
Т.е., «натравливаем» sarg на все скопившиеся файлы. Для отчетов, генерируемых sarg, лучше всего выделить отдельный раздел, отформатированный в reiserfs, т.к. там будет очень много мелких файлов. На своем шлюзе я столкнулся с тем, что на ext3 через три месяца банально кончились иноды.
Кроме того, стоит поменять количество хранимых лог-файлов (по умолчанию хранится слишком мало). Для этого редактируем /etc/logrotate.d/squid
, меняя там параметр rotate — количество хранимых файлов. На этом настройку того, что относится к прокси-серверу, можно считать законченным.
В следующей статья я постараюсь описать вторую часть настройки шлюза — сборку ядра с патчами imq и level7, настройку 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 и шейпера, учет трафика и прочие нюансы.