[[ mod_sql - Логи ]]

mod_sql - Логи

Модуль mod_sql можно использвать не только для хранения списка пользователей в БД, но хранить в БД логи.

СУБД MySQL.

Теория

SQLLog - задает выполнение запроса SQLNamedQuery после успешного выполнения команды FTP сервером
Если команда завершилось с ошибкой и это действие нужно записать, то запись команды будет ERR_<команда>

Синтаксис SQLNamedQuery определяет 4 вида запросов:

  • SELECT, UPDATE, INSERT - видимо призваны упростить текст синтаксиса
  • FREEFORM - произвольный запрос

В описание SQLNamedQuery можно использовать различные спецификаторы :

%u текущий пользователь (под которым открыта сессия)
%U имя пользователя, которое принимает сервер от клиента (актуально для ERR_PASS)
%f полный путь и имя файла который был скачан
%b число байт, которые были скачаны
%h адрес клиента (DNS) или IP
%a IP-адрес клиента
%m имя команды полученной от клиента (RETR/STOR)
%T время (секунд) ушедшее на передачу файла клиенту

еще

Стоит упомянуть только один момент в настройках:

config

## Режим работы модуля
# on=auth+log
# auth - используется только для аутентификации
# log  - используется только для логирования
# default = on
SQLEngine on


Лог входов

Будем сохранять, кто/когда/откуда выполнял вход/выход/'не угадал пароль'
Настройки mod_sql:

sql.conf

## Лог удачных входов
SQLLog          PASS            user_login
SQLNamedQuery   user_login      FREEFORM "INSERT INTO `log_login` (`username`,`host`,`action` ) VALUES ('%u','%h','0');"

## Лог неудачных заходов
SQLLog          ERR_PASS        user_fail
# Так как пользователь не вошел в систему в данном случае используется %U (%u - будет пользователь под которым запущен сервер)
SQLNamedQuery   user_fail       FREEFORM "INSERT INTO `log_login` (`username`,`host`,`action` ) VALUES ('%U','%h','1');"

## Лог выхода из системы
# EXIT - !не ftp команда!, обозначает закрытие соединения (если пользователь вышел не корректно, поэтому используем ее вместо команды QUIT)
# Но возникает ситуация когда пользователь не прошедший проверку отключается сервером - в этом случаем он также попадет в лог, 
# с именем пользователя, под которым работает сервер 'proftpd' - эти запросы будут отфильтрованы триггером в таблице БД 
SQLLog          EXIT            user_quit
SQLNamedQuery   user_quit       FREEFORM "INSERT INTO `log_login` (`username`,`host`,`action` ) VALUES ('%u','%h','2');"

## Может пригодиться для отладки
#SQLLogFile     /var/log/proftpd/sql.log


Теперь создадим таблицу log_login в которую будут вноситься записи

log_login.sql

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for log_login
-- ----------------------------
CREATE TABLE `log_login` (
  `key` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(30) NOT NULL,
  `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `host` VARCHAR(250) DEFAULT NULL,
  `action` INT(1) NOT NULL,
  PRIMARY KEY  (`key`)
) ENGINE=MyISAM AUTO_INCREMENT=73 DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Trigger structure for usernametrg
-- ----------------------------
DELIMITER ;;
CREATE TRIGGER `usernametrg` BEFORE INSERT ON `log_login` FOR EACH ROW IF NEW.`username` LIKE 'proftpd'
 THEN SET NEW.`username` = NULL;
END IF;;
DELIMITER ;

mysql -u proftpd  -p ftp < log_login.sql

Коментарий: поле action может быть и текстовым, что бы сразу записывать фразы типа : «Пользователь выполнил вход» и т.д.
В данном примере сделано кодами: 0 - удачно, 1 - неудачно, 2 - выход

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
53 +13᠎ = 
 
howto/proftpd/log_sql.txt · Последнее изменение: 2022/08/31 14:53 — 127.0.0.1
Gentoo Linux Gentoo Linux Driven by DokuWiki