28 апреля 2012

Squid

Возможно кому-то будет интересен мой опыт настройки прокси-сервера Squid 3.1.16 с кучей плюшек и фенечек =)

Итак, задача: поднять прокси-сервер, который будет авторизовывать пользователей по нескольким схемам (Kerberos, NTLM, BASIC через LDAP-запрос в AD), раздавать права на возможность скачивания определённых файлов и ограничения по скорости согласно группам безопасности из домена Windows 2003 Active Directory и проверять скачиваемые файлы антивирусом ClamAV, снимать онлайн-статистику через Sq_stat и генерировать отчёты через LightSquid.


В общей сложности, надо поставить (в скобках нужные USE-флаги):
net-proxy/squid (caps ecap epoll icap-client kerberos kernel_linux ldap logrotate pam samba sasl ssl)
net-proxy/c-icap
app-antivirus/clamav (bzip2 iconv)
net-proxy/squidclamav
app-crypt/mit-krb5 (keyutils pkinit threads)
net-fs/samba (acl ads aio avahi caps client cups ldap netapi pam readline server smbclient smbtav2 winbind)

Итак, приводим конфиг Squid к чему-то подобному:

## Общие настройки
    http_port myhostname:3128
    http_port 127.0.0.1:3128
    visible_hostname myvisiblehostname
    maximum_object_size 16 MB
    maximum_object_size_in_memory 1 MB

    # столько отдадим оперативки под кэш
    cache_mem 512 MB

    cache_dir aufs /mnt/squid/cache 19000 24 256

    cache_access_log /var/log/squid/access.log
    cache_log /var/log/squid/cache.log

    # Выключим ведение лога менеджера кэша
    cache_store_log none
    cache_mgr mymail@mydomain

    # Время ожидания при выключении
    shutdown_lifetime 5 seconds

    # Говорим использовать русские язык на страницах ошибок
    error_directory /etc/squid/errors/ru

    # Форсируем кэширование определённых типов файлов и протоколов
    refresh_pattern -i \.gif$ 43200 90% 86400 override-lastmod override-expire
    refresh_pattern -i \.png$ 43200 90% 86400 override-lastmod override-expire
    refresh_pattern -i \.jpg$ 43200 90% 86400 override-lastmod override-expire
    refresh_pattern -i \.jpeg$ 43200 90% 86400 override-lastmod override-expire
    refresh_pattern -i \.zip$ 43200 90% 86400 override-lastmod override-expire
    refresh_pattern ^ftp: 720 20% 10080
    refresh_pattern . 1440 50% 86400

    # пароль для менеджера кэша, используется sq_stat'ом
    cachemgr_passwd megapass all

    # Так как у нас нет других сквидов для обмена кэшами - заблокируем такой обмен
    icp_access deny all


## Параметры авторизации

    # Попытка №1
    # Аутентифицируем по Kerberos-тикету залогоненного юзвера в домене AD
    # используется файл ключей /etc/krb5.keytab и принципал "http/MY-LOCALDOMAIN-FQDN@MY-LOCALREALM" из него
    auth_param negotiate program /usr/libexec/squid/squid_kerb_auth \
        -s http/MY-LOCALDOMAIN-FQDN@MY-LOCALREALM \
#        -d
    auth_param negotiate children 10
    auth_param negotiate keep_alive on

    # Попытка №2
    # Аутентифицируем через NTLM/SSP-запрос с помощью Samba и winbind
    auth_param ntlm program /usr/bin/ntlm_auth \
        --domain=MY-LOCALREALM \
        --helper-protocol=squid-2.5-ntlmssp \
        --use-cached-creds \
#        --diagnostics
    auth_param ntlm children 10
    auth_param ntlm keep_alive on

    # Попытка №3
    # Аутентифицируем простым запросом имени и пароля с проверкой через LDAP-запрос в домене AD
    auth_param basic program /usr/libexec/squid/squid_ldap_auth -R \
        -D MY-LDAP-QUERY-USER@MY-LOCALREALM -W /etc/squid/ldap_pass \
        -b "dc=MY-LOCALREALM" \
        -f "sAMAccountname=%s" \
        MY-FQDN-PDC
    auth_param basic children 5
    auth_param basic realm MegaProxy MegaAuthentication =)
    auth_param basic credentialsttl 2 hours
    auth_param basic casesensitive off
    auth_param basic utf8 on

    # Правило проверки принадлежности аутентифицированного пользователя к определённой группе в AD
    # Это и есть авторизация =)
    external_acl_type AD_users %LOGIN /usr/libexec/squid/squid_ldap_group -K -R \
        -b "DC=MY-LOCALREALM" \
        -f "(&(sAMAccountname=%v)(memberOf=CN=%a,OU=MY-AD-SQUID-OU,DC=MY-LOCALREALM))" \
        -D MY-LDAP-QUERY-USER@MY-LOCALREALM -W /etc/squid/ldap_pass \
        MY-FQDN-PDC


## Политики разграничения доступа

    # Требование к пользователю, чтобы тот однозначно авторизовался
    acl auth_user proxy_auth REQUIRED

    # Внешние группы для офисных пользователей, берутся проверкой из AD
    # полная скорость
    acl group_inet-max_speed external AD_users SQUID_max_speed
    acl group_inet-slow_speed external AD_users SQUID_slow_speed
    acl group_inet-no_download external AD_users SQUID_deny_download_files


    ## Группы адресов

    # сервера
    acl servers_net src 10.1.1.0/24 10.1.11.0/24

    # офисная сеть
    acl office_net src 10.1.16.0/24

    acl local_dst dst 10.0.0.0/8 192.168.1.0/24 192.168.2.0/24 192.168.3.0/24
    acl loopback_src src 127.0.0.1
    acl loopback_dst dst 127.0.0.1
    acl all_src src all
    acl all_dst dst all

    # Список внешних важных адресов, куда пускаем напрямую всех
    acl whitelist_ips dst "/etc/squid/lists/whitelist_ips"
    acl whitelist_urls url_regex "/etc/squid/lists/whitelist_urls"

    # Ограничение по "чёрному" списку доменов с привязкой по времени. Во внерабочее время список не действует
    acl blacklist_urls url_regex "/etc/squid/lists/blacklist_urls"
    acl worktime_1 time MTWHF 09:00-12:30
    acl worktime_2 time MTWH 13:20-18:00
    acl worktime_3 time F 13:20-17:00

    # Типы файлов
    acl filetype_video urlpath_regex -i \.mp3$ \.mpeg$ \.avi$ \.flv$ \.mov$ \.mpg$ \.wmv$
    acl filetype_exe urlpath_regex -i \.exe$ \.bat$ \.cmd$ \.dll$ \.vbs$ \.cab$ \.scr$ \.pif$ \.jar$ \.com$ \.class$ \.ocx$ \.flv$ \.iflv$ \.mp3$
    acl filetype_ole urlpath_regex -i \.dll$ \.js$ \.vbs$ \.doc$ \.xls$ \.msp$ \.swf$
    acl filetype_archive urlpath_regex -i \.zip$ \.arj$ \.rar$ \.7z$

    acl proto_ftp proto FTP

    # Для ручного удаления объекта из кэша
    acl purge_method method PURGE

    # Менеджер управления кэшем
    acl cache_manager proto cache_object

    # Типы портов
    acl SSL_ports port 443 563
    acl Safe_ports port 21 80 443 563

    # Специальный метод туннелирования через наш прокси. Юзается для SSL и других специальных типов соединений
    # В частности, ICQ/Skype могут использовать его для связи если идут через наш прокси
    acl connect_method method CONNECT


## Расределение трафика
# предполагается, что у нас канал обеспечивающий 500 kbytes/s up/down

    # 2 очереди
    delay_pools 2

    # Inet_full_speed
    # 400kb общий лимит, временный разгон до 500kb. На каждого по 100kb, временный разгон до 300kb
    delay_class 1 2
    delay_parameters 1 400000/500000 100000/300000
    delay_access 1 allow group_inet-max_speed
    delay_access 1 allow servers_net
    delay_access 1 allow whitelist_ips
    delay_access 1 allow whitelist_urls
    delay_access 1 deny all

    # Inet_slow_speed
    # 100kb общий лимит, временный разгон до 200kb. На каждого по 32kb, временный разгон до 64kb
    # пускаем сюда всех, кто не прошёл по первой очереди
    delay_class 2 2
    delay_parameters 2 100000/200000 32768/65536
    delay_access 2 deny group_inet-max_speed
    delay_access 2 deny servers_net
    delay_access 2 deny whitelist_ips
    delay_access 2 deny whitelist_urls
    delay_access 2 allow all


## Применение политик доступа
# важен порядок следования правил !!!

    # ручное удаление объектов из кэша доступно только на самом сервере
    http_access allow purge_method loopback_src
    http_access deny purge_method

    # доступ самого сквида
    http_access allow cache_manager loopback_src
    http_access deny cache_manager

    # чёрный список сайтов в рабочее время
    http_access deny blacklist_urls worktime_1
    http_access deny blacklist_urls worktime_2
    http_access deny blacklist_urls worktime_3

    # пропускаем к важным внешним серверам (whitelist)
    http_access allow whitelist_ips
    http_access allow whitelist_urls

    # пропускаем сервера
    http_access allow servers_net

    # пропускаем к локальным ресурсам (если вдруг)
    http_access allow local_dst

    # только разрешённые порты, туннель только для SSL (исключая локальные передачи)
    http_access deny !Safe_ports !local_dst
    http_access deny connect_method !SSL_ports !local_dst

    # запрещаем ftp
    http_access deny proto_ftp

    # блокируем скачивание видео-файлов
    http_access deny filetype_video group_inet-no_download
    http_access deny filetype_exe group_inet-no_download
    http_access deny filetype_archive group_inet-no_download

    # пропускаем max_speed
    http_access allow group_inet-max_speed auth_user

    # пропускаем slow_speed
    http_access allow group_inet-slow_speed auth_user

    http_access deny all

    # Ответы разрешаем получать всем, т.к. мы фильтруем только запросы
    http_reply_access allow all


## Специальные указания на пропуск кэширования

    always_direct allow whitelist_ips
    always_direct allow whitelist_urls
    always_direct allow local_dst
    cache deny whitelist_ips
    cache deny whitelist_urls
    cache deny local_dst
    cache deny loopback_dst
    hierarchy_stoplist cgi-bin ?
    acl QUERY urlpath_regex cgi-bin \?
    no_cache deny QUERY


## Проверка антивирусом

    # Проверяем транзитные файлы антивирусом Clamav используя посредника c-icap и его модуль squidclamav
    icap_enable on
    icap_send_client_ip on
    icap_send_client_username on
    icap_service antivirus respmod_precache bypass=0 icap://localhost:1344/clamav

    # Запрещаем использовать антивирус при локальной передаче
    adaptation_access antivirus deny local_dst

    # Запрещаем для доверенных сайтов (whitelist)
    adaptation_access antivirus deny whitelist_ips
    adaptation_access antivirus deny whitelist_urls

    # Всем остальным включаем
    adaptation_access antivirus allow all



Небольшие пояснения:
 MY-LOCALDOMAIN-FQDN - полное DNS-имя нашего прокси в локальной сети (шото типа proxy.local)
 MY-LOCALREALM - название домена Windows (вроде MEGAFIRMA.LOCAL). Его ОБЯЗАТЕЛЬНО надо писать заглавными буквами!
 MY-LDAP-QUERY-USER - имя пользователя в домене, от имени которого Squid будет делать поиск в LDAP-дереве AD
 MY-FQDN-PDC - полное DNS-имя (можно просто ip-адрес) контроллера домена (вроде server.megafirma.local)
 MY-AD-SQUID-OU - название подразделения (Organizational unit) в дереве AD, где будут лежать группы безопасности для Squid'а). На самом деле, пофиг где будет лежать, главное правильно потом написать DN (distinguished name) - в данном случае, DN= OU=MY-AD-SQUID-OU,DC=MY-LOCALREALM
SQUID_max_speedSQUID_slow_speedSQUID_deny_download_files - группы безопасности в домене (должны лежать в MY-AD-SQUID-OU). Пользователи, которые будут принадлежать первой будут иметь максимальную скорость, ко второй - поменьше, в третьей - которым будет запрещено скачивать файлы с определёнными расширениями.

Далее, нам надо завести 2 пользователя в домене - MY-LDAP-QUERY-USER и MY-SQUID-KERBEROS-USER с правами "Гость домена", обоим убрать истечение срока действия пароля и запретить его смену. Пользователю MY-LDAP-QUERY-USER задать какой-нибудь пароль и сохранить его в текстовый файл в папке со Squid'ом под именем /etc/squid/ldap_pass (сохранение в текстовик необязательно, просто иначе этот пароль будет светиться в списке процессов ps).

Далее, заходим на наш контроллер домена и выполняем следующую комманду:
ktpass -princ http/MY-LOCALDOMAIN-FQDN@MY-LOCALREALM -mapuser MY-SQUID-KERBEROS-USER -crypto rc4-hmac-nt-pass <пароль пользователя MY-SQUID-KERBEROS-USER> -ptype KRB5_NT_SRV_HST -out pdc.keytab

Собственно, эта команда создаст файл с KERBEROS-ключом для пользователя MY-SQUID-KERBEROS-USER. Этот файл надо перенести на машину со Squid'ом в файл krb5.keytab

Далее, открываем наш конфиг Kerberos /etc/krb5.conf и приводим к такому виду:

[libdefaults]
    default_realm = MY-LOCALREALM
    clockskew = 300
    v4_instance_resolve = false
    v4_name_convert = {
        host = {
            rcmd = host
            ftp = ftp
        }
        plain = {
            something = something-else
        }
    }
    dns_lookup_realm = false
    dns_lookup_kdc = false
    ticket_lifetime = 24h
    forwardable = yes
    default_keytab_name = /etc/krb5.keytab
    default_tgs_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    default_tkt_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5
    permitted_enctypes = aes256-cts-hmac-sha1-96 rc4-hmac des-cbc-crc des-cbc-md5

[realms]
    MY-LOCALREALM = {
        kdc = MY-FQDN-PDC
        admin_server = MY-FQDN-PDC
        default_domain = MY-FQDN-PDC
        kpasswd_server = MY-FQDN-PDC
    }

[domain_realm]
    .MY-LOCALREALM = MY-LOCALREALM
    MY-LOCALREALM = MY-LOCALREALM


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

Отправить комментарий