CentOS 6.x 64 и Squid с авторизацией из Win2008AD

  • Tutorial
Установка Squid на CentOS 6.x 64 с авторизацией из Win2008AD, групповое распределение, привязка по mac адресам, фильтр расширений файлов и запрещенных сайтов.

Не будем описывать саму установку Win2008AD. Подразумеваем, что контроллер уже установлен и настроен. Наша первая задача создать структуру групп для распределения в них пользователей, которые в дальнейшем будут иметь определенные права.

Создаем пользователя squid, он будет отвечать за получение списка пользователей их паролей и групповую принадлежность. Назначаем ему делегирование на эти возможности.

Жмем правой клавишей мыши на корне нашего домена, выбираем Делегирование управления. Появляется мастер настройки. Жмем Далее. Жмем Добавить. Пишем нашего пользователя squid, который будет иметь права чтения из домена. Жмем ОК. Добавился наш пользователь. Жмем Далее. Включаем Чтение информации о всех пользователях и Чтение всей информации для intOrgPerson. Жмем Далее. Жмем Готово.

Создаем в корне дерева домена Подразделение proxy. Жмем правой клавишей мыши на корне нашего домена, выбираем Создать, выбираем Подразделение. Пишем имя proxy. Жмем ОК. В корне домена появится так называемый Организационный юнит с именем proxy.

В этом подразделении создаем структуру групп для распределения пользователей на получение разных прав доступа через Squid. Создаем группу admins-proxy и users-proxy.

Жмем правой клавишей мыши на proxy, выбираем Создать, выбираем Группа. Пишем имя группы admins-proxy. Жмем ОК. Повторяем для группы users-proxy.

Первая группа будет иметь полный доступ, вторая будет иметь ограничения. В каждую группу добавляем уже имеющихся пользователей. Пусть в группе admins-proxy будет находиться пользователь padmins, а в группе users-proxy будет находиться пользователь pusers, которые были созданы ранее и мы их сейчас добавили. Два раза жмем на имени группы. Выбираем закладку Члены группы. Жмем Добавить. Пишем нужного пользователя. Жмем ОК. Повторяем для остальных пользователей и групп.

Устанавливаем пакет Squid:

yum install squid

После успешной установки прописываем автозапуск squid:

chkconfig squid on

Авторизацию в squid будем использовать на основе LDAP. Для этого сначала необходимо проверить соединение с Win2008AD механизмом LDAP, который заложен в Squid.

Проверяем связку логина padmins и пароля VzRGI5xS пользователя из домена.

Выполняем:

echo «padmins VzRGI5xS» | /usr/lib64/squid/squid_ldap_auth -R -D squid@developer.com -w 3zdjK2H9 -b «dc=developer,dc=com» -f «sAMAccountName=%s» -h 192.168.151.2

padmins # /пользователь домена/
VzRGI5xS # /пароль пользователя padmins в домене/
squid@developer.com # /пользователь домена имеющий права просмотра списка пользователей их паролей и всех данных о них/
3zdjK2H9 # /пароль делегированного пользователя squid/
dc=developer,dc=com # /контроллер домена/
192.168.151.2 # /IP адрес домена/


И так, если это выполнено правильно, мы получим ответ OK. Это означает, что наш пользователь padmins найден в домене и он сверен с паролем VzRGI5xS. Если соответствия нет, то получим ответ ERR Success.

Теперь проверяем связку логина padmins и группы admins-proxy из домена в которую входит пользователь.

Выполняем:

echo «padmins admins-proxy» | /usr/lib64/squid/squid_ldap_group -R -D squid@developer.com -w 3zdjK2H9 -b «dc=developer,dc=com» -f "(&(objectclass=person) (sAMAccountName=%v)(memberof=cn=%a,ou=proxy,dc=developer,dc=com))" -h 192.168.151.2

И так, если это выполнено правильно, мы получим ответ OK. Это означает, что наш пользователь padmins найден в группе admins-proxy нашего домена. Если соответствия нет, то получим ответ ERR Success.

Принимаемся за настройку Squid.

Создаем каталог /etc/squid/rules:

mkdir /etc/squid/rules

В каталоге /etc/squid/rules создаем файлы для правил:

touch block-extension.txt

touch inet-mac.txt

touch url-block.txt

Содержимое файла block-extension.txt (фильтр расширений файлов):

\.exe$
\.mp3$
\.mpg$
\.mp4$
\.mpeg$
\.flv$
\.avi$
\.wmv$
\.swf$
\.mov$
\.mkv$
\.wav$
\.rar$
\.msi$
\.zip$
\.tar$
\.iso$
\.nrg$


Содержимое файла inet-mac.txt (фильтр mac адресов, разрешенные):

04:00:27:3a:45:13
10:6e:87:c4:8c
00:1f:d0:b5:c4:65


Содержимое файла url-block.txt (фильтр url):

odnoklassniki\.ru
vk\.com
facebook\.com

Открываем на редактирование файл конфиг /etc/squid/squid.conf и приводим его к виду:

squid.conf
################################################################################

# Squid normally listens to port 3128
http_port 3128

visible_hostname router-int.developer.com

#
# Recommended minimum configuration:
#
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines

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

#
# Recommended minimum Access Permission configuration:
#
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager

# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on «localhost» is a local user
#http_access deny to_localhost

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

################################################################################
### AD команды для подключения к AD2008R2 ###
################################################################################
auth_param basic program /usr/lib64/squid/squid_ldap_auth -R -D squid@developer.com -w 3zdjK2H9 -b «dc=developer,dc=com» -f «sAMAccountName=%s» -h 192.168.151.2
auth_param basic children 5
auth_param basic realm Please insert your Windows credentials to navigate
auth_param basic credentialsttl 1 hour
################################################################################

################################################################################
### AD команды для подключения к группам AD2008R2 ###
################################################################################
external_acl_type ldap_group %LOGIN /usr/lib64/squid/squid_ldap_group -R -D squid@developer.com -w 3zdjK2H9 -b «dc=developer,dc=com» -f "(&(objectclass=person) (sAMAccountName=%v)(memberof=cn=%a,ou=proxy,dc=developer,dc=com))" -h 192.168.151.2
################################################################################

################################################################################
### Листы доступа и блокировок по группам из AD2008R2 ###
################################################################################

# (лист доступа пользователей из группы admins-proxy находящаяся в AD2008R2)
acl admins-proxy external ldap_group admins-proxy

# (лист доступа пользователей из группы users-proxy находящаяся в AD2008R2)
acl users-proxy external ldap_group users-proxy

# (лист доступа пользователей по MAС-адресу)
acl inet-mac arp "/etc/squid/rules/inet-mac.txt"

# (лист блокировки по списку URL)
acl url-block url_regex "/etc/squid/rules/url-block.txt"

# (лист блокировки по списку расширений файлов)
acl block-extension url_regex -i "/etc/squid/rules/block-extension.txt"

# (блокировка стрим потоков)
acl media rep_mime_type -i ^audio/.*$
acl media rep_mime_type -i ^video/.*$
acl media rep_mime_type -i ^video/x-flv$
acl media rep_mime_type -i ^application/x-shockwave-flash$
acl media rep_mime_type -i ^application/octet-stream$

# (разрешаем все для группы admins-proxy с привязкой по mac адресу)
http_access allow admins-proxy inet-mac
# (запрещаем группе users-proxy список url-block)
http_access deny users-proxy url-block

# (запрещаем группе users-proxy список block-extension)
http_access deny users-proxy block-extension

# (запрещаем группе users-proxy список media)
http_reply_access deny users-proxy media

# (разрешаем группе users-proxy все, что осталось)
http_access allow users-proxy

################################################################################

# And finally deny all other access to this proxy
http_access deny all

# We recommend you to use at least the following line.
hierarchy_stoplist cgi-bin?

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/spool/squid 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/spool/squid

# Add any of your own refresh_pattern entries above these.
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern. 0 20% 4320

################################################################################

Приведенный конфиг 100% рабочий.

Стартуем Squid:

service squid start

Как это работает.

В настройках браузера прописываем адрес и порт 3128 нашего прокси сервера. Заходим на страницу сайта, получаем приглашение ввести логин и пароль.

Если наш пользователь padmins правильно ввел пароль, squid его пропускает и к нему применяются правила заданной группы. Из конфига видно, что для группы admins-proxy ограничений нет. Есть только привязка к mac адресам из списка.

Теперь если наш пользователь pusers правильно ввел пароль, squid его пропускает и к нему применяются правила заданной группы. Из конфига видно, что для группы users-proxy применяются фильтры url-block (список блокировки url), block-extension (список блокировки расширений) и media (списк блокировки стрим потоков).

И не забываем открыть порт, если он закрыт:

iptables -A INPUT -p tcp -m state -m tcp -s 192.168.0.0/16 --dport 3128 --state NEW -j ACCEPT
Поделиться публикацией

Комментарии 20

    0
    Спасибо за статью. Еще бы SAMS добавить
      +1
      Жмем правой клавишей мыши на корне нашего домена, выбираем Делегирование управления. Появляется мастер настройки. Жмем Далее. Жмем Добавить. Пишем нашего пользователя squid, который будет иметь права чтения из домена. Жмем ОК. Добавился наш пользователь. Жмем Далее. Включаем Чтение информации о всех пользователях и Чтение всей информации для intOrgPerson. Жмем Далее. Жмем Готово.

      Зачем? Не хватило стандартного набора прав пользователя? Вполне должно было хватить для описанных в статье действий.
      Кстати, стоит не забыть установить созданному пользователю не истекающий пароль.

      Авторизацию в squid будем использовать на основе LDAP. Для этого сначала необходимо проверить соединение с Win2008AD механизмом LDAP, который заложен в Squid.

      А вот это плохо:
      1. Вы создаёте лишнюю нагрузку на контроллер домена — при каждой аутентификации пользователя на прокси — squid будет делать авторизацию от его имени в AD. При количестве пользователей более 100 это создаст кучу мусора в журнале безопасности (у вас ведь настроен аудит!). А при более 1000 — нагрузку на контроллер.
      2. При отказе контроллера имя которого задано в конфигурации squid перестанет работать (в принципе это разрешимо...)
      3. Пользователю для доступа в интернет придётся вводить пароль --> пользователи будут сохранять свой пароль в хранилищах браузеров --> это не безопасно + пользователей будет лочить после смены пароля и они будут выедать вам мозг

      Гораздо:
      • безопасней (не будет служебной учётки пользователя с не истекающим паролем, пользователи не будут хранить свои доменные пароли в хранилище браузеров, авторизация будет проходить с использованием более безопасного механизма)
      • надёжней (squid будет работать с любым доступным контроллером домена)
      • удобней (и для пользователя и для админа)

      настроить авторизацию посредством kerberos (что-то как-то так: wiki.squid-cache.org/ConfigExamples/Authenticate/Kerberos)
        +1
        SSO это конечно здорово, но как быть с группами в таком случае? все равно использовать ldap для этого? если есть какой мануал, то ткните носом плиз.
          0
          Вот годная статья по настройке аутентификации kerberos с авторизацией по группам ldap www.k-max.name/linux/squid-auth-kerberos-ldap-grupp-active-directory/
          К сожалению там архитектурно не получится вытянуть из билета членство в группах…
            0
            Но, кстати, ещё можно «поиграться» с OpenPBIS — он возьмёт на себя актуальность keytab'а и наполнит окружение доменными группами. Тогда членство в группах можно будет проверять без дополнительного запроса к LDAP. Но это чисто теоретически — я не пробовал такой вариант.
          0
          Скорость авторизации из 100-300 юзеров меня устраивает. Ничего не тормозит. Хотел сделать на основе кербероса, но мне это оказалось быстрее и практичнее. Т.к. нужно авторизовать юзера именно по паролю, а потом если надо еще и по мак адресу.
          0
          не забудьте сказать что фильтр по MAC будет рабтоать если прокси в одной сети с клиентами
            0
            А вот с группами скорее всего придётся использовать ldap… но ldap будет использоваться только для acl:
            • будет в 2 раза меньше bind операций (только bind служебного пользователя)
            • авторизация пользователя будет работать прозрачно
            • можно будет подумать над кэшированием результатов ldap запросов...
              0
              У меня одна сеть и группы все в ней, ну это и так должно быть понятно.
              Но если никто не понял это можно дописать. Но как я понял основная масса настраивает по своему и это высказывают.
              –2
              Работать не будет, ни где не было указано, что надо открыть iptables на порт 3128
                0
                Я не указал это в посте, но это следует из потребностей службы squid.
                  –1
                  Позанудствую, но вы указали столько команд, которые следуют из потребностей службы сквида, включая yum install, chkconfig, service start, но ни словом не обмолвились про ключевую операцию открытия порта в брандмауэре — думается мне, вы просто забыли это сделать.
                  Администратор с опытом поймет интуитивно, но новичок, наткнувшийся на ваш мини гайд разобьет себе голову.
                  Тягу к минусованию бы в наблюдательность.
                    0
                    Дописал, а то совсем какашками закидают.
                +2
                Ужас то какой, блин.

                0. Вот у меня есть RDP ферма, где работает 80% сотрудников организации с тонких клиентов — как по Вашему мануалу я им разграничу уровни доступа? Учитывая, что это не VDI, а именно RDP и я не хочу привязывать каждую учётку в AD к каждому серверу и думать про балансировку нагрузки на несколько десятков серверов для нескольких сотен пользователей.

                1. Squid прекрасно авторизуется в AD через самбу, которую можно ввести в AD и для этого таки да, понадобится учётка админа или кому там у Вас разрешён join машин в домен.
                2. Сквид прекрасно кушает группы пользователей AD для настройки им доступа и ограничения скорости (социалки, реклама, поиск работы, аськи/скайпы), авторизацию по макам -глупо, сейчас нормальные люди делают это исключительно для привязки IP, NAP и в AD, автонастройка порта коммутатора при валидной авторизации юзера.
                3. в нормальной инфраструктуре — юзеру должно быть всё равно, с какой рабочей станции работать.

                статье минус.

                У меня лежит где-то мануал с одной из прошлых работ, как раз по мною описанной настройке прокси сервера, что ли его оформить в статью
                  0
                  Оформляйте.
                    +1
                    заодно опишите как побороть тормоза winbind при большом количестве пользователей.
                      +1
                      0. У меня RDP фермы, и не планируется, сотрудников 200 человек, физические компы, соединения лишние и не планируется далее.
                      1. Мне зачем нужна Самба на роутере, только для закачки авторизации? Мне не надо.
                      2. Кушает сейчас, и не спрашивает добавки. Когда денег выделяется выше кармана, то можно рулить и свичами, но тут тупо надо любому юзеру со своим паролем зайти в инет, а привилегированным иметь полные права, но они слабы на передок и могут рассказать пароль другим вот им и установлен мак фильтр…
                      3. В нормальной да, а у меня все сделано предыдущими через… опу, и приходится применять хоть как то разнообразие, чтобы привести к уму.

                      п.с. Можно ставить хоть 5ть минусов статье.
                        0
                        0. У многих рдп ферм и не планируется, но делать лучше изначально по человечески.
                        1. Самба? на роутере? извините, по хорошему, прокси сервер стоит отделять от маршрутизатора.
                        2. Разглашение личного пароля другим элементарно вычисляется по логам, после чего докладная на стол руководству это раз, а а нагромождение лишних сущностей усложняет сложность системы
                          0
                          Подскажите, а Вы как-нибудь решили проблему RDweb и прокси (Squid)? А то у нас сотрудники подключаются к RDWEB, в обход Squid. с ним не хочет подключатся, так как ругается на сертификат. Уже пробовал wpad не помогает
                            0
                            У меня все сертификаты раздавались через gpo или ставились ручками на не-доменные машины, так что я не помню чтобы у меня эта проблема возникала. Сквид, кстати в этом не участвовал — все ходили изнутри периметра

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое