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 - выход
Обсуждение