При развёртывании разнообразных вариантов высоко-доступных конфигураций Squid может возникнуть задача централизованного сбора, хранения и обработки access-логов с нескольких прокси-серверов Squid. Для решения этой задачи может использоваться система SquidARM, которую мы хотим представить в данной статье.
Архитектура и системные требования
SquidARM - это система предназначенная для накопления и аналитики журналов посещений прокси серверов Squid (access-логов). Система может быть полезна в качестве инструмента для анализа посещаемости тех или иных веб-ресурсов и анализа пользовательской активности в сети Интернет. Архитектурно система состоит из коллектора логов прокси-сервера Squid, передаваемых по сети, процесса парсинга и записи логов в файлы и базу данных, а также веб-интерфейса для формирования отчётности.
SquidARM - это открытый свободнораспространяемый проект с исходными кодами, доступными на GitHub: p5-App-SquidArm - непосредственно коллектор и squidarm – веб-интерфейс. Проект был создан ещё в 2015 году и использовался для собственных нужд. Функционал скромен, но покрывает базовые потребности.
Минимальные требования для установки SquidARM:
1) Виртуальная машина с Linux, например, Debian 12
- Процессор: 2 CPU
- Память: 4 Гб
- Сетевой интерфейс: 1
- Диск: разделы на LVM, файловая система ext4
- / - от 20 Гб
- /var - 150 Гб (ёмкость зависит от объёма логов прокси за месяц)
- swap - 8 Гб
2) Базовые настройки системы:
- Сеть (IP-адрес, шлюз, DNS)
- Имя сервера
- Клиент точного времени (например, systemd-timesyncd)
- Сервис sshd
Установка SquidARM
Рассмотрим установку из пакета, на примере Debian 12.
Создайте каталог для ключей репозитория, если не существует:
$ sudo mkdir /etc/apt/keyrings/
Загрузите публичный ключ, которым подписан репозиторий:
$ curl -sSfL https://squidarm.ru/squidarm.asc | sudo tee /etc/apt/keyrings/squidarm.asc
Добавьте репозиторий SquidARM:
$ echo "deb [signed-by=/etc/apt/keyrings/squidarm.asc] https://squidarm.ru/repo/ bookworm main" \
| sudo tee /etc/apt/sources.list.d/squidarm.list
Установка:
$ sudo apt update
$ sudo apt install squidarm
Настройка SquidARM
Конфигурационный файл расположен по пути /etc/squidarm/sarm.conf , по синтаксису напоминает squid.conf и по-умолчанию выглядит так:
port 8000
memcache_host 127.0.0.1
memcache_port 8080
#allowed 10.0.0.1
access_log /var/log/sarm/squid_access.log
db_driver sqlite
db_dir /var/lib/sarm
db_update_interval 5
ignore_denied true
log_level note
log_file /var/log/sarm/sarm.log
#debug_unixsocket /var/log/sarm/sarm_debug
tz Europe/Moscow
dist_dir /usr/share/squidarm-web
#usernames_source system
Пояснения по возможным параметрам конфигурации:
- port 8000 – TCP-порт, на котором ожидается приём логов;
- host x.x.x.x - можно явно задать IP-адрес, на котором запускается прослушиватель логов,
если параметр host не указан, то прослушиватель запускается на всех IP-адресах сервера; - memcache_host 127.0.0.1 - адрес, на котором запускается прослушиватель процесса memcache;
- memcache_port 8080 - порт прослушивателя memcache;
- allowed 10.0.0.1 - Явно указывается IP-адрес прокси-сервера, с которого ожидается приём
логов. По-умолчанию всё запрещено. Если прокси-серверов несколько, то каждый сервер
прописывается директивой allowed в отдельной строке; - access_log /var/log/sarm/squid_access.log - путь к файлу для сохранения получаемых суммарных
логов всех прокси-серверов; - db_driver , db_dir , db_update_interval - параметры СУБД, не требуют изменения;
- ignore_denied true - в СУБД не сохраняются логи о запрещённых попытках загрузки с прокси (например, коды ответов 407), которые бесполезны для статистики, но могут занимать
существенный объём; - log_level , log_file - параметры журнала службы SquidARM;
- debug_unixsocket /var/log/sarm/sarm_debug - параметры сокета для отладки работы процессов SquidARM. По умолчанию закомментирован, так как может замедлять работу сервиса. Не рекомендуется включать в продуктиве;
- tz Europe/Moscow - временная зона, в которой работают прокси-сервера и их пользователи.
Имя зоны должно быть каноническим. Корректность имени можно проверить по наличию файла в /usr/share/zoneinfo. Например, Asia/Yekaterinburg, Europe/Samara, Asia/Irkutsk; - dist_dir /usr/share/squidarm-web - каталог с веб-интерфейсом SquidARM;
- usernames_source system - источник полных имён пользователей в отчётах. По умолчанию
закомментирован, пользователи представлены именем учётной записи, с которой они
авторизовались на прокси. Если авторизация на прокси не используется, в статистике будут отображаться IP-адреса. Если задан источник "system", то имена пользователей берутся через системный вызов getent passwd. Если сервер, на котором развёрнут squidarm, введён в AD домен это будет полное имя пользователя.
Настройка прокси-сервера Squid
Для отправки логов с прокси-сервера Squid, можно использовать штатную директиву в конфигурации squid.conf:
access_log tcp://10.X.X.X:8000 logformat=squid on-error=drop
где 10.X.X.X - это IP-адрес коллектора SquidARM
После внесения изменений в squid.conf перезапускается служба Squid:
# systemctl restart squid
Настройка веб-интерфейса SquidARM
По умолчанию веб-интерфейс запускается на loopback-интерфейсе (http://127.0.0.1:5000). Чтобы обеспечить доступ к веб-интерфейсу из сети, можно настроить фронтенд веб-сервер для проксирования доступа. Например, apache2
Установка apache2:
$ sudo apt install apache2
Минимальный вариант конфигурации сайта:
$ cat << 'EOF' | sudo tee /etc/apache2/sites-available/squidarm.conf
<VirtualHost _default_:80>
ProxyRequests off
ErrorLog ${APACHE_LOG_DIR}/sarm-error.log
CustomLog ${APACHE_LOG_DIR}/sarm-access.log combined
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
</VirtualHost>
EOF
Включение модулей apache2 и веб-сайта:
$ sudo a2enmod proxy
$ sudo a2enmod proxy_http
$ sudo a2ensite squidarm
При необходимости можно добавить SSL, авторизацию или ограничения доступа по IP-адресу.
Запуск
Запуск сервиса сбора логов прокси:
$ sudo systemctl start squidarm
Запуск веб-интерфейса SquidARM:
$ sudo systemctl start squidarm_web
Сопровождение СУБД и журналов прокси
Передаваемые журналы прокси-сервера squid сохраняются в текстовом виде в каталоге /var/log/sarm в виде отдельных файлов. Необходимо периодически удалять старые логи, чтобы не исчерпать всё доступное пространство на диске. Например, создав задачу в cron (глубина 8 дней):
05 05 * * * root /usr/bin/find /var/log/sarm -name 'squid_access.log_*' -mtime +8 -type f -delete
В каталоге /var/lib/sarm файлы базы данных сегментируются помесячно. Также через cron
можно управлять глубиной хранения СУБД (например, 180 дней):
10 05 1 * * root /usr/bin/find /var/lib/sarm -name 'access_log_*' -mtime +180 -type f -delete
Веб-интерфейс SquidARM
В интерфейсе доступно три вида отчётов:
- Трафик пользователей за месяц;
- Трафик по дням;
- Сайты за месяц
Трафик пользователей за месяц
На странице показана статистика по всем пользователям за текущий месяц, отсортированным по уменьшению трафика, начиная с лидеров. Можно выбрать произвольный месяц/год. В таблице доступен поиск по имени учётной записи или IP-адресу, можно менять сортировки столбцов. При клике на имени пользователя можно посмотреть его детальную статистику по посещённым сайтам за выбранный месяц.
Трафик по дням
Данный отчёт показывает общую загрузку по каждым дням месяца. При клике на ячейку с датой открывается отчёт с подробной статистикой по всем пользователям за выбранный день.
Сайты за месяц
Отчёт показывает то, какие сайты посещались за выбранный месяц, начиная с самого популярного. При клике по названию сайта открывается перечень пользователей, который посещали данный сайт.
Время загрузки отчётов
Иногда загрузка отчётов занимает существенное время (1-3 минуты). Определить то, что страница загружается, можно по вращающемуся индикатору загрузки в углу страницы:
Web API для отчётов
В SquidARM реализована возможность получения отчётов в машиночитаемом формате (json) через Web API.
Пример запроса к Web API с помощью утилиты curl:
curl -sSf http://squidarm.holding.com/api/users/2024/4.json
{"data":[["vasya001",0,123456,10,0],....]}
Возвращаемые данные представляют собой массив, состоящий из массивов со статистикой: пользователь/IP-адрес, байт из кэша, байт загружено, число запросов, число отказов (например, ошибка 407).
Для получения отчёта по трафику по всем пользователям за определённый месяц делается GET-запрос:
GET /api/users/2024/3.json
где 2024 - год, 3 – месяц.
Для получения отчёта по трафику по всем пользователям за определённый день:
GET /api/users/2024/3/21.json
где 2024 - год, 3 - месяц, 21 – день.
Для получения отчёта по трафику определённого пользователя за месяц:
GET /api/user/vasya001/2024/3.json
где vasya001 - имя пользователя, где 2024 - год, 3 – месяц.
Для получения отчёта по трафику пользователя за день:
GET /api/user/vasya001/2024/3/21.json
где vasya001 - имя пользователя, где 2024 - год, 3 - месяц, 21 –день.
Для получения отчёта по трафику по дням месяца:
GET /api/traf/2024/3.json
где 2024 - год, 3 – месяц.
Для получения отчёта по сайтам за месяц:
GET /api/sites/2024/3.json
где 2024 - год, 3 – месяц
С помощью возможностей Web API и собственных скриптовых наработок можно реализовать дополнительные варианты кастомизированной отчётности. Например, с помощью PowerShell скрипта можно быстро получить HTML отчёт об использовании Интернет-ресурсов за любой период времени по любому пользователю:
Хорошее