====== SQUID и NTLM-авторизация через Active Directory ====== По мотивам http://macrodmin.ru/2012/07/proksi-squid-s-avtorizaciej-v-domene-active-directory Данный вид авторизации в настоящее время небезопасен, лучше использовать Kerberos-аутентификацию ===== Исходные данные ===== * Сервер PROXY с установленным Ubuntu Server (в описанном примере это 14.04.1) * Сеть настроена верно, прописаны DNS/Gateway, все сервера сети разыменовываются верно * 192.168.1.1 - IP нашего PROXY * 192.168.1.3 - IP DNS-сервера нашей сети * Домен Active Directory * MYDOMAIN.RU - имя домена * ntp.mydomain.ru - сервер времени домена * dc.mydomain.ru - контроллер домена ===== Требования ===== * Авторизация через Active Directory * Разным пользователям - разные уровни доступа к сайтам * Черный и белый списки сайтов * Отчет по использованию интернета с указанием ФИО пользователей ===== Установка ===== Первое что нужно сделать - это присоединить наш сервер к домену Active Directory. Для этого в обязательном порядке необходимо синхронизировать время на всех серверах. ==== Установка службы времени и синхронизация ==== # apt-get install ntp Редактируем /etc/ntp.conf - отключаем все сервера по умолчанию и добавляем свой: server ntp.mydomain.ru И перезапускаем сервис: # service ntpd restart ==== Присоединяемся к домену ==== Для подключения нам нужны следующие пакеты: Samba и Kerberos Устанавливаем Samba: # apt-get install samba winbind Настраиваем Samba, рекомендую оригинальный конфигурационный файл куда-нибудь убрать и создать новый smb.conf со следующим содержимым: [global] workgroup = MYDOMAIN netbios name = PROXY realm = MYDOMAIN.RU server string = Proxy server security = ads encrypt passwords = true password server = dc.mydomain.ru winbind enum users = yes winbind enum groups = yes winbind use default domain = yes winbind uid = 10000-20000 winbind gid = 10000-20000 server role = standalone server # disable printers error printing = bsd printcap name = /dev/null Небольшой косячок в Samba По умолчанию в Ubuntu Server 14.04.1 неверно выставлены права для папки /var/lib/samba/winbindd_privileged в результате чего winbind работает криво (не может авторизоваться по NTLM и выдается окно с запросом имени/пароля). Исправляется следующим образом: * Добавляем пользователя proxy в группу winbindd_priv командой # usermod -G winbindd_priv -a proxy * Устанавливаем права на папку: # chgrp proxy /var/lib/samba/winbindd_privileged Перезапускаем Samba: # service samba restart # service winbind restart Устанавливаем Kerberos: # apt-get install krb5-admin-server krb5-config krb5-kdc krb5-user Удаляем или переименовываем оригинальный файл /etc/krb5.conf и создаем новый со следующими настройками: Регистр написания - очень важен! [logging] Default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmin.log [libdefaults] default_realm = MYDOMAIN.RU [realms] MYDOMAIN.RU = { kdc = dc.mydomain.ru admin_server = dc.mydomain.ru default_domain = mydomain.ru } [domain_realm] .mydomain.ru = MYDOMAIN.RU mydomain.ru = MYDOMAIN.RU Получаем билет от контроллера домена: # kinit domain_admin где domain_admin - логин с правами Domain Administrator, а пароль будет запрошен в приглашении. Теперь присоединяем наш прокси к домену: # net ads join -U domain_admin Если после выполнения команды написано что-то про ошибку DNS - можно не переживать. Проверяем как прошло наше подключение, должно быть примерно так: # wbinfo -p Ping to winbindd succeeded # wbinfo -t checking the trust secret for domain MYDOMAIN.RU via RPC calls succeeded а команды # wbinfo -g # wbinfo -u должны показать список всех групп и пользователей домена. ==== Установка Squid ==== Устанавливаем: # apt-get install squid И приводим конфигурационный файл /etc/squid3/squid.conf к такому виду (описание групп доступа и их настройки см. ниже): # Аутентификация в Active Directory auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp auth_param ntlm children 25 # basic-авторизация, абсолютно небезопасно, только для тестирования #auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic #auth_param basic children 25 external_acl_type nt_group %LOGIN /usr/lib/squid3/ext_wbinfo_group_acl authenticate_ttl 10 minutes # Стандартные порты 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 white_list url_regex -i "/etc/squid3/white_list" acl black_list url_regex -i "/etc/squid3/black_list" # Определяем группы доступа acl Full external nt_group Internet_Full acl Medium external nt_group Internet acl Low external nt_group Internet_Low # Перечень сетей acl all src all acl our_networks src 192.168.102.0/24 # Авторизация требуется ОБЯЗАТЕЛЬНО, без нее никого не пускать acl nt_group proxy_auth REQUIRED # Стандартные разрешения http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost manager http_access deny manager # Права доступа для наших групп пользователей http_access allow Low white_list http_access deny Low http_access deny Medium black_list http_access allow Medium http_access allow Full # Разрешаем локалхост http_access allow localhost # Запрещаем все остальное http_access deny all # Ограничение пропускной способности интернет-канала delay_pools 3 delay_class 1 1 delay_class 2 1 delay_class 3 1 delay_parameters 1 -1/-1 -1/-1 delay_parameters 2 384000/384000 delay_parameters 3 32000/32000 delay_access 1 allow Full delay_access 2 allow Medium delay_access 3 allow Low # Порты прокси-сервера http_port 192.168.1.1:3128 http_port 192.168.1.1:3127 transparent # Выделяем 3,5 Гб памяти для прокси cache_mem 3584 MB # Выделяем место на жестком диске для хранения файлов кэша cache_dir ufs /var/spool/squid3 100 16 256 # Куда и в каком объеме будем писать логи access_log /var/log/squid3/access.log logfile_rotate 100 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 -i \.(gif|png|jpg|jpeg|ico)$ 3600 90% 43200 refresh_pattern . 0 20% 4320 # Запрещаем отображение версии прокси-сервера и имени httpd_suppress_version_string on visible_hostname PROXYSERVER # Включаем русский язык для сообщений сервера error_directory /usr/share/squid3/errors/Russian-1251 error_default_language ru # Принудительно задаем желаемый DNS-сервер dns_nameservers 192.168.1.3 dns_v4_first on Проверяем конфиг на ошибки: # squid3 -k parse Если парсер не обнаружил никаких ошибок, можно применить новую конфигурацию Squid: # squid3 -k reconfigure или # service squid3 restart ==== Немного подробнее о группах доступа ==== По условиям у нас в Active Directory есть 3 группы доступа: * Internet_Full - пользователи, входящие в нее имеют доступ на любые сайты, скорость доступа не лимитирована * Internet - пользователи имеют доступ на любые сайты, кроме запрещенных в файле /etc/squid3/black-list со скоростью 4 Мбит/сек ( 48000 Кбайт/сек * 8 = 4 Мбит/сек) на всю группу * Internet_Low - пользователи имеют доступ только на сайты, перечисленные в файле /etc/squid3/white_list со скоростью 256 Кбит/сек (32000 Кбайт/сек * 8 = 256 Кбит/сек) на всю группу Сопоставление групп идет в следующем кусочке: # Определяем группы доступа acl Full external nt_group Internet_Full acl Medium external nt_group Internet acl Low external nt_group Internet_Low ===== Правила для iptables ===== Примечание: при работе в прозрачном (transparent) режиме аутентификация пользователей невозможна! Подробнее: http://wiki.squid-cache.org/Features/Authentication#Authentication_in_interception_and_transparent_modes Завернуть всех пользователей (если PROXY является еще и шлюзом): iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp —dport 80 -j REDIRECT —to-port 3127 Завернуть если PROXY - отдельный сервер: iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp —dport 80 -j DNAT —to 192.168.1.1:3127 где 192.168.1.1 - IP нашего PROXY Так же можно средствами Group Policy прописать прокси-сервер требуемым объектам GPO ===== Статистика пользователей ===== Остался последний этап - отображать красивую статистику посещений сайтов пользователями. Самый простой и красивый инструмент для этого - LightSquid. ==== Устанавливаем ==== # apt-get install apache2 lightsquid ==== Настраиваем Apache ==== Приводим файл /etc/apache2/conf-available/lightsquid.conf в такой вид (доступ на просмотр даем всем): Alias /lightsquid/ /usr/lib/cgi-bin/lightsquid/ Options +ExecCGI Require local Require ip 192.168.1.0/24 Раскомментируем строку 219 в файле /etc/apache2/mods-enabled/mime.conf AddHandler cgi-script .cgi .pl Запускаем все это дело: # a2enmod cgi # a2enconf lightsquid # service apache2 restart ==== Настраиваем LightSquid ==== Очень хочется чтобы в отчете фигурировало полное ФИО пользователя, а не доменное имя или IP-адрес. Для этого нужно заменить оригинальный файл /usr/share/lightsquid/ip2name/ip2name.squidauth следующим: #contributor: esl #specialy for squid with turned on user authentication #simple version use strict; use warnings; use Net::LDAP; use Encode; my $ldap; my $message; my %hDisplayName; sub StartIp2Name() { my $server = "ldap://dc.mydomain.ru"; $ldap = Net::LDAP->new( $server ); return if(!defined $ldap); $message = $ldap->bind(q(MYDOMAIN.RU\LightSquid), password => "PASSWORD"); } sub Ip2Name($$$) { # $Lhost,$user,$Ltimestamp my $Lhost=shift; my $user =shift; $user =URLDecode($user); #decode user name return $Lhost if ($user eq "-"); return $user if (!defined $ldap); return $user if ($message->code()); if (!defined $hDisplayName{$user}) { my $result = $ldap->search( base => "dc=MYDOMAIN,dc=RU", filter => "(&(objectCategory=person)(objectClass=user)(sAMAccountName=" . $user . "))", ); my $first_entry = $result->entry(0); if (!defined $first_entry) { return $Lhost; } my $pure_displayName = $first_entry->get_value("displayName"); $pure_displayName =~ s/ /_/g; Encode::from_to($pure_displayName, 'utf-8', 'windows-1251'); $hDisplayName{$user}=$pure_displayName; } return $hDisplayName{$user}; } sub StopIp2Name() { return if (!defined $ldap); $message = $ldap->unbind; } #warning !!! 1; В этом файле исправляем нижеуказанные строки на свои: ... my $server = "ldap://dc.mydomain.ru"; ... $message = $ldap->bind(q(MYDOMAIN.RU\LightSquid), password => "PASSWORD"); ... base => "dc=MYDOMAIN,dc=RU", ... Теперь в /etc/lightsquid/lightsquid.cfg включаем преобразование логина в ФИО: $ip2name="squidauth" Запускаем /usr/share/lightsquid/check-setup.pl и если все хорошо, можно запускать /usr/share/lightsquid/lightparser.pl В папке /var/lib/lightsquid/report должны появиться отчеты, которые можно поглядеть по адресу: http://192.168.1.1/lightsquid/ {{tag>squid AC active_directory kerberos krb прокси сквид авторизация домен lightsquid статистика}}