ProFTPD – logowanie zdarzeń do bazy SQL

Serwer ProFTPD domyślnie pobiera konfigurację oraz loguje zdarzenia do plików tekstowych. Istnieje jednak moduł, który pozwala na integrację z bazą SQL. Jest to przydatne, gdy chcemy analizować dane (np. podliczać transfer) lub zarządzać użytkownikami z poziomu bazy.

W niniejszym wpisie opiszę sposób konfiguracji serwera FTP tak, aby informacje o poprawnych i błędnych logowaniach były zapisywane do bazy MySQL.

Instalujemy serwer FTP oraz moduł umożliwiający dostęp do bazy SQL.

apt-get install proftpd proftpd-mod-mysql

W pliku /etc/proftpd/modules.conf znajduje się lista modułów. Musimy włączyć mod_sql.c oraz mod_sql_mysql.c. Wyszukujemy poniższe linie i usuwamy komentarze (znak #) lub dodajemy je na koniec pliku w przypadku ich braku.

LoadModule mod_sql.c
LoadModule mod_sql_mysql.c

W głównym pliku z konfiguracją należy dodać plik z listą modułów. Jeżeli poniższej linii nie ma w pliku /etc/proftpd/proftpd.conf, to dodajemy ją na koniec.

Include /etc/proftpd/modules.conf

Teraz czas na konfigurację MySQL-a. Zakładamy nową bazę, użytkownika oraz tabelę na dane. Moja tabela wygląda następująco. Zamiast MyISAM możemy użyć silnik ARCHIVE.

CREATE TABLE `proftpd_auth_log` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `remote_ip` VARCHAR(50) NOT NULL,
  `time` DATETIME NOT NULL,
  `command` VARCHAR(50) NOT NULL,
  `status` VARCHAR(50) UNSIGNED NOT NULL,
  PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM;

Na koniec pliku /etc/proftpd/proftpd.conf dodajemy poniższe polecenia, które umożliwią nawiązanie połączenia oraz logowanie danych do bazy.

SQLConnectInfo mydatabase@192.168.1.1 myuser mypassword
SQLLogFile /var/log/proftpd/mod_sql.log
SQLBackend mysql

SQLLog USER,PASS,ERR_PASS sqlauthlog
SQLNamedQuery sqlauthlog FREEFORM "INSERT INTO proftpd_auth_log (`remote_ip`, `time`, `command`, `status`) VALUES ('%a', NOW(), '%r', '%s')"

SQLConnectInfo zawiera nazwę bazy, adres serwer oraz login i hasło. SQLogFile określa ścieżkę do pliku z dziennikiem operacji wykonywanych na bazie, a SQLBackend zawiera typ bazy.

Polecenie SQLLog określa operacje, które będą logowane do bazy. W moim przypadku, są to polecenia USER, PASS oraz ERR_PASS, czyli prawidłowe oraz błędne próby logowania na serwer FTP. SQLNamedQuery to zapytanie, które dodaje dane do bazy. Loguję adresy IP, datę operacji, login oraz status (prawidłowe lub błędne logowanie). Dodatkowe informacje na temat logowania można znaleźć w dokumentacji.

Po zapisaniu zmian, restarujemy serwer.

/etc/init.d/proftpd restart

Oraz podglądamy plik z logiem.

tail -f /var/log/proftpd/mod_sql.log

Jeżeli zalogujemy się teraz na FTP, to na ekranie pojawi się odpowiednia informacja, a w bazie rekord z naszym IP oraz użytym loginem.

Uwagi

Działanie powyższej konfiguracji oraz serwera FTP możemy sprawdzić włączając logowanie przy pomocy poleceń DebugLevel oraz SystemLog.

DebugLevel 9
SystemLog /var/log/proftpd/system.log

Następnie logujemy się na FTP, wykonujemy kilka operacji (np. pobieramy plik) i sprawdzamy czy komunikacja pomiędzy ProFTPD a MySQL-em działa.

cat /var/log/proftpd/system.log | grep sql

Wynik powyższego polecenia powinien zawierać informacje o przesyłaniu poszczególnych komand do modułu mod_sql.

Mar 04 16:15:20 some.domain.pl proftpd[4566] 192.168.1.1 (::ffff:192.168.1.2[::ffff:192.168.1.2]): dispatching LOG_CMD command 'OPTS_UTF8 ON' to mod_sql
Mar 04 16:15:20 some.domain.pl proftpd[4566] 192.168.1.1 (::ffff:192.168.1.2[::ffff:192.168.1.2]): dispatching POST_CMD command 'OPTS UTF8 ON' to mod_sql
Mar 04 16:15:20 some.domain.pl proftpd[4566] 192.168.1.1 (::ffff:192.168.1.2[::ffff:192.168.1.2]): dispatching LOG_CMD command 'OPTS UTF8 ON' to mod_sql
Mar 04 16:15:22 some.domain.pl proftpd[4566] 192.168.1.1 (::ffff:192.168.1.2[::ffff:192.168.1.2]): dispatching POST_CMD command 'CWD /' to mod_sql
Mar 04 16:15:22 some.domain.pl proftpd[4566] 192.168.1.1 (::ffff:192.168.1.2[::ffff:192.168.1.2]): dispatching LOG_CMD command 'CWD /' to mod_sql
Mar 04 16:15:22 some.domain.pl proftpd[4566] 192.168.1.1 (::ffff:192.168.1.2[::ffff:192.168.1.2]): dispatching POST_CMD command 'TYPE I' to mod_sql
Mar 04 16:15:22 some.domain.pl proftpd[4566] 192.168.1.1 (::ffff:192.168.1.2[::ffff:192.168.1.2]): dispatching LOG_CMD command 'TYPE I' to mod_sql
Ten wpis został opublikowany w kategorii Linux, MySQL. Dodaj zakładkę do bezpośredniego odnośnika.