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