====== 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 статистика}}