SQUID настройка ACL и http_access

Сентябрь 16th, 2013 Рубрики: Linux, SQUID, Настройка сервера Linux

http_access, acl в squid Привет, посетитель и постоянный читатель блога! Сегодня небольшая заметка о тюнинге squid. Причина размещения данной статьи следующая: очень часто на форумах встречаю как TC приводят примеры своих конфигов с чудовищной мешаниной директив acl и http_access, особенно в темах рассматривающих проблемы с доступом к squid. Настраивая какую-либо систему я стараюсь придерживаться какого-то логичного порядка. Постараюсь сегодня Вам донести, какого порядка http_access придерживаюсь я.

Основная идея заключается во фразе выдернутой из сквидового мануала по http_access:

If none of the "access" lines cause a match, the default is the
opposite of the last line in the list.  If the last line was
deny, the default is allow.  Conversely, if the last line
is allow, the default will be deny.  For these reasons, it is a
good idea to have an "deny all" entry at the end of your access
lists to avoid potential confusion.

Дословно следующее:

Если не попалось правило "access", то по умолчанию
будет применено правило, противоположное последнему в списке. Если последнее правило 
deny, то по умолчанию применится allow. Наоборот, если последняя строчка
allow, по умолчанию будет deny. Поэтому хорошей идеей будет 
иметь правило "deny all" в конце вашего списка 
правил во избежании возможных недоразумений.

Я уже рассматривал некоторые советы и правила в статье SQUID вводный пост. Сейчас постараюсь донести свое видение порядка acl и http_access. Собственно, порядок директив acl абсолютно не имеет никакого значения. Главное, чтобы acl были определены ДО правил http_access (я не нашел этому подтверждения в мануалах, но я имел некоторые проблемы с доступом при размещении acl после http_access). Я стараюсь группировать acl по одинаковым типам.

Настройка http_access в squid

Именно порядком размещения директив http_access определяется, получит клиент доступ к кэшу или нет. Алгоритм обработки запроса к кэшу следующий:

  1. Каждый запрос последовательно сравнивается с каждой строчкой правил http_access.
  2. Пока запрос не совпадет с одним из правил access или deny он будет следовать от правила к правилу и сверять свои полномочия.
    Тут все просто. Давайте разберем следующие правила:
  3. Если в http_access указано несколько acl, то применяется логическое И. Пример:
    http_access allow|deny acl И acl И ...
           ИЛИ
    http_access allow|deny acl И acl И ...
           ИЛИ
  4. Если запрос не попал ни под какое правило, то по-умолчанию, squid использует  правило противоположное последнему.
    # у нас есть единственное разрешающее правило для некоторого acl user:
    http_access allow user
    # если при доступе к squid, запрос не попал в этот acl, то к нему будет применено действие deny.
    # А если у нас есть два правила
    http_access allow user
    http_access deny user2
    # и запрос не входит ни в acl user, ни в acl user2, то к нему применится allow.
    # То есть действие противоположное последнему http_access deny user2

Это основы основ. Но есть некоторые нюансы, выявленные при эксплуатации.

Тюнинг http_access )

Мы знаем, что существуют acl, использующие внешние модули аутентификации. Либо другие модули (например, srcdomain и srcdom_regex требующие DNS резолвинга). Можно сделать логический теоретический вывод, что данные acl могут работать несколько медленней, нежели acl src или dst или аналогичные. Согласно wiki, разработчики делят быстрые\медленные acl по следующим группам (с версии squid 3.1.0.7):

Показать быстрые ACL »

  • all (built-in)
  • src
  • dstdomain
  • dstdom_regex
  • myip
  • arp
  • src_as
  • peername
  • time
  • url_regex
  • urlpath_regex
  • port
  • myport
  • myportname
  • proto
  • method
  • http_status {R}
  • browser
  • referer_regex
  • snmp_community
  • maxconn
  • max_user_ip
  • req_mime_type
  • req_header
  • rep_mime_type {R}
  • user_cert
  • ca_cert

Показать медленные ACL »

  • dst
  • dst_as
  • srcdomain
  • srcdom_regex
  • ident
  • ident_regex
  • proxy_auth
  • proxy_auth_regex
  • external
  • ext_user
  • ext_user_regex

Соответственно, если мы указываем первыми правила запрета, особенно если они "быстрые" (например такие

http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports

) то они очень быстро отрабатывают, снижая нагрузку за счет того, что до правил использующих аутентификацию доходят меньше запросов, те которые действительно в этом нуждаются. Итак, старайтесь размещать запрещающие правила http_access, использующие acl без внешних модулей как можно выше, далее размещайте разрешающие правила. Ну и последним не забываем указать deny all (to avoid potential confusion).

Траблшуттинг acl и http_access

Если при компоновке директивы http_access все же есть некоторые проблемы и нужный пользователь не получает доступа можно попытаться использовать опцию debug_options в squid. Пример:

debug_options ALL,1 33,2

После реконфигурирования squid в cache.log начнут падать сообщения о разрешении\запрещении доступа по каждой сессии и имя acl, согласно которого доступ предоставлен или нет. Если же данной информации недостаточно, то можно включить большую детализацию:

debug_options ALL,1 33,2 28,9

Резюме

На этом сегодня все.Сегодня рассмотрели вопрос настройки acl и http_access. Логику обработки директив http_access и познакомились с некоторыми рекомендациями. Возможно, кто-то из читателей меня поправит, за что буду очень благодарен. Кроме данной статьи рекомендую ознакомиться с http://wiki.squid-cache.org/SquidFaq/SquidAcl.

С Уважением, Mc.Sim!




Теги: , ,

3 комментария к “SQUID настройка ACL и http_access”

  1. Антон
    Март 19th, 2014 at 23:45
    1

    А есть ли возможность настроить сквид так, чтобы в access.log за носилась информация на основании какой именно acl был разрешен или запрещён доступ? А то действие в логе видно, а на основании какого правила — не ясно.

    • Март 20th, 2014 at 11:19
      2

      Я не нашел в секции logformat возможности вставить ACL, поэтому можно пойти 2мя путями:
      1. настроить временно debug_options в squid, задав уровень 2 для 33 секции (debug_options ALL,1 33,2). Но в таком случае, информация об ACL будет размещаться в cache.log.
      2. настроить изолированные журналы для каждого ACL, задав параметры access_log. Например:
      acl log_this src x.x.x.x. y.y.y.y.y z.z.z.z.z
      access_log /var/log/squid/log_for_logthis logformat=squid log_this

      В таком случае, все запросы от acl log_this попадут в файл /var/log/squid/log_for_logthis

      • Март 20th, 2014 at 11:24
        3

        Но, необходимо понимать, что если в лог /var/log/squid/log_for_logthis попала строка, то это не значит, что согласно этому acl предоставлен доступ. Это значит, что запрос соответствовал данному acl.

Написать комментарий