Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


Показаны сообщения с ярлыком squid. Показать все сообщения
Показаны сообщения с ярлыком squid. Показать все сообщения

среда, 13 июня 2018 г.

И снова о просмотре логов squid и выводе полей в awk.

Очередной способ получить человеко-читаемое время в логах прокси-сервера.

awk '{print strftime("%Y-%m-%d %H:%M:%S",$1) " " substr($0, index($0,$2))}' FILENAME

Основная идея: по умолчанию поля в этом логе отделяются пробелами. Awk преобразует первое поле (дата и время в юникс-формате) в читаемый вид и выводит его. Далее печатается пробел, после которого печатается всё от начала второго поля до конца строки.

Как выяснилось, это самый быстрый способ заставить awk вывести "всё остальное", не перебирая поля последовательно в цикле.

Решение найдено здесь.

пятница, 26 мая 2017 г.

SQUID, AWK и статистика

Итак, выяснилось, что какой-то специфичный анализатор лога, чтобы собирать ежедневную обобщенную статистику, мне не требуется.

Что нужно? Нужно посчитать, сколько всего трафика за сутки израсходовал тот или иной пользователь.

Решаем задачу наличными силами и подручными средствами. Лог сквида имеет вполне определенный формат, гугл в помощь. Мне нужны поля: передано байт (5), имя пользователя (8) и результат запроса (4). Ну и воспользуемся такой прелестью авка, как ассоциативные массивы. Дальше - просто копипаста рабочего скрипта.
MAWK давно не обновлялся, поэтому я явно указал интерпретатор GAWK.

#!/usr/bin/gawk -f
# usage:
# 1) get_sqlog.awk filename
# 2) cat filename|get_sqlog.awk

# Если нет пользователя или есть один из двух отлупов, то переходим к следующей строке
{if ($8 == "-" || $4 == "TCP_DENIED/407" || $4 == "TCP_DENIED/403") { next }
# Ассоциативные массивы, в качестве индекса - имя пользователя
# Сколько раз он нам попался
    ++occurrences[$8]
# Его трафик
    summary[$8]=summary[$8]+$5
}
END {
# Проходим по всем элементам массива и красиво печатаем их
# Переменная а принимает значения индексов, определенные во время анализа
for (a in occurences){
    printf "%-30s:%10d:%10d\n",a,occurrences[a],summary[a]
    }
}

Под катом подробное описание.

среда, 24 мая 2017 г.

SQUID: вывод лога в человеческом виде

Ищу нормальный анализатор лога, который не будет рисовать красивые html-картинки, а просто тупо подобьет бабки и выдаст статистику за нужный период в разрезе пользователей.

Не нашел. Пока изучаю побочные действия и буду рисовать сам. Когда-то я уже приводил чью-то идею о преобразовании даты в логе в человеческий вид. Довольно известная "шутка" на Perl.

Но awk мне как-то милее.

awk '{ print strftime("%Y-%m-%d %H:%M:%S",$1)","$2","$5","$8}' имя_логфайла

Печатает дату и время в европейском формате,чего-то непонятное, объем данных, имя пользователя. Что мне и надо.

Да, работает это только с gawk. А mawk почему-то заявляет, что у него нет функции strftime.

понедельник, 11 августа 2014 г.

sed: чистка логов

Сошел с ума SARG: после настройки авторизации в сквиде через AD в логах стали появляться записи вида:

что-то-там ... домен\имя_пользователя ...

SARG, видя такое безобразие, в итоговом отчете всем пользователям присваивает имя "домен", из-за чего отчет становится нечитаемым.

Пришлось думать, как почистить логи прежде чем скормить SARG-у

cat лог|sed 's/домен\\//'|sed 's/.*TCP_DENIED.*$//'|sed '/^$/d'

первый sed убирает из лога упоминания про "домен\"
второй убирает все строки, где пользователь получил отказ в доступе
третий убирает оставшиеся пустые строки.

Наверное, будет логичнее совместить второй и третий и поставить их перед первым, чтобы не делать лишние замены "домен\" в строках, которые всё равно будут удалены.

Да, более правильной и быстрой оказалась такая конструкция:

cat лог|sed '/^.*TCP_DENIED.*$/d'|sed 's/[дД][оО][мМ][еЕ][нН]\\//'

Возможно, удалось бы совместить обе замены в одну, но уже лень.

вторник, 4 июня 2013 г.

Авторизация на прокси Squid 3 через ADDS

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

Задача не новая, но решать надо "как в первый раз", тем более, что это и есть первый раз, когда я такое проделал. Два месяца назад я забил сюда как в закладки ссылку на блог Лиссяры. Всё бы ничего, но он описывает работу с FreeBSD, а у меня таки "неправославная" ОС в его понимании. Ага, всё та же убунта-сервер (10.04.4, Lucid) с третьим сквидом. Кроме того, статье на данный момент около 6 лет, а за это время космические корабли избороздили еще кусок вселенной... В общем, мысленно поблагодарив Лиссяру за наводку, я отправился дальше.

Куда более подходящую статью я нашел у Макродмина. Статье нет еще и года, поэтому информация актуальна.

1. sudo apt-get install ntp
настраиваем синхронизацию времени со своим контроллером, вписывая его в нужное место в /etc/ntp.conf:

server имя_или_IP_контроллера_домена

Макродмин советует ставить туда IP, у меня нормально работает и с FQDN, тем более, что в примерах внутри самого этого файла указан ntp.ubuntu.com, а не его IP.

2. В /etc/resolv.conf у меня уже были прописаны нужный домен и в правильном порядке серверы DNS - первым сервером стоял адрес контроллера. Порядок здесь имеет значение - если на первом откликнувшемся сервере нет нужных SRV и т.п. записей, то не удастся ввести прокси в домен - будет тупо не находить контроллер.

3. Поскольку на этой "машине" (сервер крутится в виртуалке) отродясь не было ни самбы, ни злой собаки-цербера, то согласился с Макродмином и тупо установил рекомендованное:

sudo apt-get install samba winbind krb5-admin-server krb5-clients krb5-config krb5-doc krb5-kdc krb5-user

 При установке пакетов вылезали различные интересные параметры конфигурации, которые я установил в соответствии с подобными им, которые уже сделаны у меня на двух самбовских файл-серверах.

4. В этом месте у Макродмина опечатка, которая стоила мне нескольких седых волос. Вот мой рабочий конфиг самбы:

# cat smb.conf
[global]
workgroup = MYDOMAIN
realm = MYDOMAIN.FQDN.RU
netbios name = VMPROXY
server string =_
security = ADS
encrypt passwords = true
password server = pdc.mydomain.fqdn.ru
winbind enum users = yes
winbind enum groups = yes
winbind use default domain = yes
winbind uid = 10000-20000
winbind gid = 10000-20000
wins server = xxx.yyy.zzz.ttt

В качестве wins-сервера указан именно IP  моего PDC, остальное самоочевидно.
Оранжевый прямоугольник обозначает то же самое, что и у Макродмина - после знака равенства ставим пробел, чтобы самба не формировала серверную строку типа "samba server (ubuntu чего-то там)".
А вот подчеркнутое жирное "yes" - это как раз то место с опечаткой: в оригинале написано "yse", и я долго не мог понять, на что же самба ругается разными нехорошими словами вроде "lp_bool(yse): value is not boolean!". То, что это следствие опечатки, заметил совершенно случайно.

5. Править файл /etc/krb5.conf сильно не пришлось: как я уже сказал, при установке пакетов мне было задано много вопросов, ответы на которые были автоматически вписаны в нужные конфиги. Часок работы напильником и всё готово. (из текста конфига я удалил оригинальные комментарии)

# cat krb5.conf
[libdefaults]
    default_realm = MYDOMAIN.FQDN.RU

    krb4_config = /etc/krb.conf
    krb4_realms = /etc/krb.realms
    kdc_timesync = 1
    ccache_type = 4
    forwardable = true
    proxiable = true

    v4_instance_resolve = false
    v4_name_convert = {
        host = {
            rcmd = host
            ftp = ftp
        }
        plain = {
            something = something-else
        }
    }
    fcc-mit-ticketflags = true

[realms]
    MYDOMAIN.FQDN.RU = {
        kdc = pdc.mydomain.fqdn.ru
        kdc = bdc.mydomain.fqdn.ru
        kdc = 3rddc.mydomain.fqdn.ru
        admin_server = pdc.mydomain.fqdn.ru
        default_domain = MYDOMAIN.FQDN.RU    }


[domain_realm]
    .mydomain.fqdn.ru = MYDOMAIN.FQDN.RU
     mydomain.fqdn.ru = MYDOMAIN.FQDN.RU

[login]
    krb4_convert = true
    krb4_get_tickets = false

Обращаем внимание на регистр букв!!!

6. После внесения правок просим билетик у кербероса:

kinit administrator

где administrator - логин администратора домена.
Если не последовало ругани и klist выдал что-то осмысленное, то вводим прокси в домен:

net ads join -U admin

Как сообщают разные источники и мой личный опыт, может вылезти невразумительная ошибка насчет сервера DNS (у меня в этот раз не вылезла, но с прежними самбами бывало), ее можно смело игнорировать.

7. Сквид у меня уже был настроен, поэтому не заморачиваюсь общими вопросами, а сразу лезем править конфиги. Для большей гибкости, конфиг сквида у меня разбит на три файла - основной конфиг (squid3.conf), файл "учёток" (squid3.acl.conf) и файл ограничений (squid3.restrictions.conf), причем два последних подключаются директивой include к первому.

При правке возникли некоторые вопросы, ответы на которые я нашел на вики сквида: авторизация ntlm и авторизация ntlm с использованием групп. Существенная грабля: нельзя тупо копипастить! Я сидел и тихо сходил с ума, пытаясь понять, почему же сквид жалуется "хелпер слишком часто падает и я отключаюсь". У меня сквид третьей версии и установлен в squid3. Но в абсолютном большинстве примеров речь о второй версии, установленной в просто squid. И естественно, что хелпер вылетал - трудно запустить что-то вроде /usr/lib/squid/program, если на самом деле оно находится в /usr/lib/squid3/program.

В домене я создал отдельную ОЕ: domain/groups/ACL/Internet. В ней находятся группы разрешения и запрета доступа - по одной группе на каждую службу. Все эти группы в зависимости от того, что они делают, входят в супергруппы inet_allow или inet_deny, живущие уровнем выше в domain/groups/ACL.

8.Итак, конфиги сквида (частичные):

SQUID3.CONF
#http://wiki.squid-cache.org/ConfigExamples/Authenticate/Ntlm
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 30

auth_param basic program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-basic
auth_param basic children 15
auth_param basic realm Proxy Autentification Required
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

SQUID3.ACL.CONF
#Проверка работы через AD
    acl    nt_group    proxy_auth    REQUIRED
    external_acl_type    nt_group %LOGIN /usr/lib/squid3/wbinfo_group.pl
    acl    dom-white-list    external    nt_group    inet_allow
    acl    dom-black-list    external    nt_group    inet_deny

SQUID3.RESTRICTIONS.CONF
#Через домен
    http_access    allow    dom-white-list
    http_access    deny    dom-black-list


Как раз из-за последнего "/usr/lib/squid3/wbinfo_group.pl" у меня и вылезали ошибки, о которых я говорил - в примерах везде было "squid", а не "squid3".

9. Ну и финальный штрих. Winbind при запуске создает каталог /var/run/samba/winbindd_privileged, на который дает права группе winbindd_priv. Сквид в нее не входит и сильно расстраивается из-за невозможности проверить права доступа. Фигня. Просто добавляем его в эту группу. У меня сквид работает от имени пользователя proxy:

gpasswd -a proxy winbindd_priv

Перезапускаем самбовские службы и сквид.

В некоторых источниках предлагают изменить стартовый скрипт самого winbind-a, но это неправильно, я считаю.

10. Осталось внести нужных пользователей в соответствующие группы, а дальше уже раздавать полномочия по мере необходимости... После внесения пользователя в группу разрешения/запрета не помешает сделать

sudo service squid3 force-reload

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

Для проверки работы хелпера можно воспользоваться командой:

# ntlm_auth --username=логин
password:
NT_STATUS_OK: Success (0x0)

Где вместо "логин" подставляем имя пользователя из домена.

суббота, 6 апреля 2013 г.

SQUID: авторизация через AD

Явно предстоит этим заниматься, поэтому поискал информацию. Весьма поучительный материал в старых записях Лисяры. Надо будет поэкспериментировать, скорее всего, эту схему и использую.

понедельник, 11 марта 2013 г.

SQUID access.log: преобразование времени

Сквид в своем логе пишет время в формате UNIX, что ни разу не есть удобно для чтения.
Где-то я уже разбирался с преобразованием времени, но для анализа конкретно этого лога нашлось такое решение:

grep rush access.log|perl -nwe's/^(\d+)/localtime($1)/e; print'

В данном случае ищем в логе обращения к сайту, содержащему в имени последовательность "rush" и выводим в найденных строках время по-человечески.

Но для одноразовой конверсии лучше воспользоваться стандартной командой date:

$ date --date='@1362981179.186'
Пн. марта 11 16:52:59 VLAT 2013


После "@" вписываем время из лога в формате UNIX. И телемаркет!

среда, 1 февраля 2012 г.

Squid: еще об аутентификации

Настройка аутентификации по имени и паролю в Squid

Оригинал.


Howto: Squid proxy authentication using ncsa_auth helper

by Vivek Gite on December 21, 2006 · 62 comments
For fine control you may need to use Squid proxy server authentication. This will only allow authorized users to use proxy server.
You need to use proxy_auth ACLs to configure ncsa_auth module. Browsers send the user's authentication in the Authorization request header. If Squid gets a request and the http_access rule list gets to a proxy_auth ACL, Squid looks for the Authorization header. If the header is present, Squid decodes it and extracts a username and password.
However squid is not equipped with password authentication. You need to take help of authentication helpers. Following are included by default in most squid and most Linux distros: