Mein Blog - Liebes Tagebuch...

PS: Wenn ihr das hier gut oder schlecht findet - Anregungen / Fragen habt - hinterlasst mir eine Nachricht!

EMC Isilon IOps mit PRTG-Monitoring überwachen26.10.2016 14:30 anzeigen
Windows Sicherung Fehler 0X8078002A07.06.2016 10:58 anzeigen
VMware vSphere Update Manager Paket / Patch manuell entfernen08.12.2015 08:27 anzeigen
Fail2Ban für Teamspeak3 Server21.08.2015 10:46 anzeigen
PhpMyAdmin root Login auf bestimmte Clients beschränken17.06.2015 08:13 anzeigen
Debian 8 (Kernel >=3.9) VMware Konsole bleibt schwarz05.05.2015 11:20 anzeigen
Thunderbird Lightning Google Kalender (CalDAV)04.12.2014 07:41 anzeigen
Pure-FTPd TLS "PEM_read_bio:no start line"20.11.2014 08:44 anzeigen
PHP5 + MySQL load data local infile Error 114817.04.2014 13:27 anzeigen
Pure-FTPd und MySQL Last User Access Logging13.12.2013 11:55 ausblenden
Als FTP-Server Service ist Pure-FTPd einer meiner Lieblinge im Linuxumfeld und weltweit relativ verbreitet im Einsatz.
Das Ding betreibe ich mit MySQL-Athentifizierung, also "pure-ftpd-mysql" und VirtualChroot.
Ein Kollege von mir brachte mich auf folgende Idee:

Wieso kann man nicht (Anmerkung: doch geht, per cronjob, grep, tail, usw.) in einer Datenbank speichern, wann ein
FTP-User Account das letzte mal benutzt wurde und von welcher IP-Adresse das geschah?
Gute Frage. Also ein Auth-Logging für Pure-FTPd basteln, dass in Echtzeit - nicht per Cron über die Logfiles - läuft.

Wir gehen davon aus, dass es bereits eine Tabelle für die FTP-Nutzer gibt. In dem Beispiel steht in der Spalte "user" der
Login-Name. Die Tabelle heißt im Beispiel "ftp_users". Wer die MySQL-Variante des Daemons bereits benutzt weiß was ich meine.

Für das Login-Logging *Wortspiel* benötigen wir eine neue Tabelle, denn Ziel soll sein:
- Loggen der letzten 10 IP-/Datumsangaben je Nutzer bzw.
- Loggen der letzten Datumsangabe je IP-Adresse je Nutzer

Also die Tabellenstruktur für die neue Tabelle:

CREATE TABLE IF NOT EXISTS `ftp_login` (
`user` varchar(100) NOT NULL,
`last_login` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_ip` varchar(15) NOT NULL,
UNIQUE KEY `ip` (`user`,`last_ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Wer InnoDB nutzt kann auch Constraints anlegen:

ALTER TABLE `ftp_login` ADD CONSTRAINT `ftp_login_ibfk_1` FOREIGN KEY (`user`) REFERENCES `ftp_users` (`user`) ON DELETE CASCADE ON UPDATE CASCADE;


Nun kommt der Trick: Offiziell kann Pure-FTPd soetwas nicht, aber man kann dessen mysql.conf Datei dafür missbrauchen.
Wir suchen uns die Zeile mit MYSQLGetPW heraus, die sollte in etwa so aussehen:

MYSQLGetPW SELECT password FROM ftp_users WHERE user="\L" AND active="Y" AND (ipaccess = "*" OR ipaccess LIKE "\R")

und erweitern diese einfach. Dazu zuerst - wenn noch nicht vorhanden - ein Semikolon ";" dahinter und 2 weitere Queries anhängen.

Nummer 1: neuen Datensatz speichern
INSERT INTO ftp_login VALUES("\L",NOW(),"\R") ON DUPLICATE KEY UPDATE last_login=NOW();

Nummer 2: alte Einträge per User bis auf die letzten 10 löschen:
DELETE FROM ftp_login WHERE user="\L" AND last_login < (SELECT tmp.last_login FROM (SELECT last_login FROM ftp_login WHERE user="\L" ORDER BY last_login DESC LIMIT 10,1) as tmp);

Wer die letzten 50 aufheben will macht hinten ein LIMIT 50,1 draus usw...

Am Ende sollte die komplette Zeile in etwa so aussehen:
MYSQLGetPW SELECT password FROM ftp_users WHERE user="\L" AND active="Y" AND (ipaccess = "*" OR ipaccess LIKE "\R"); INSERT INTO ftp_login VALUES("\L",NOW(),"\R") ON DUPLICATE KEY UPDATE last_login=NOW(); DELETE FROM ftp_login WHERE user="\L" AND last_login < (SELECT tmp.last_login FROM (SELECT last_login FROM ftp_login WHERE user="\L" ORDER BY last_login DESC LIMIT 10,1) as tmp);


Wichtig ist dabei, dass alles IN EINER ZEILE steht. Danach den Pure-FTPd Dienst neu starten und fertig.
MySQL / PhpMyAdmin Fehler: Doppelte InnoDB Foreign Key Constraints25.10.2013 11:25 anzeigen
vSphere Replication Fehler: MISSING PLACEHOLDER14.10.2013 08:34 anzeigen
MySQL ERROR 130 (HY000)13.06.2013 11:46 anzeigen
MS-SQL Server 2008 - Aktivitätsmonitor Fehler06.03.2013 12:20 anzeigen
Thunderbird IMAP Posteingang (Inbox) & Papierkorb (Trash) doppelt vorhanden05.11.2012 13:18 anzeigen
Redirect Verzeichnis zu URL Parameter mit Apache2 mod_rewrite22.03.2012 08:22 anzeigen
DKIM und SPF mit united-domains.de12.01.2012 08:55 anzeigen
VMware vCenter 5 - Verbindung zu Diensten bricht manchmal ab & PlugIns werden deaktiviert29.09.2011 09:49 anzeigen
Linux V2V Konvertierung XEN -> VMware13.07.2011 12:30 anzeigen
VMware Workstation 7.x (und andere) Bandbreite beschränken10.03.2011 19:22 anzeigen
DSL Zugangsdaten / Kennwort vergessen - Herausfinden mit Fritz!Box20.02.2011 23:44 anzeigen
PHP 5.3.5 - Problem mit MySQL 5 und OLD_PASSWORD Kennwörtern04.02.2011 09:42 anzeigen
HP Proliant DL160 G6, B110i RAID und SLES11-SP1 X84_64 Installation14.12.2010 14:36 anzeigen
Informatiker-Wetter10.11.2010 11:59 anzeigen
Informatikerwitz10.11.2010 11:56 anzeigen
Das ist doch mal 'ne vernünftige Erklärung, die man auch begreift...20.09.2010 11:18 anzeigen
Windows: Zuletzt verwendet Einträge löschen (Recent)16.08.2010 09:13 anzeigen
Canon ScanLIDE 35 mit Windows 7 (64Bit)13.01.2010 07:00 anzeigen
MSI Eclipse Plus (MS-7566) DriveBooster für Windows 7 (64Bit)05.01.2010 10:05 anzeigen
MSI Eclipse Plus (MS-7566) BIOS05.01.2010 10:00 anzeigen
Archiv folgt... (todo!)

ADS: Kabel Digital komplett