Rulez un server de producție (Debian 10, pachet standard OpenSSH) care rulează Pure-FTPD pentru conexiunile vechi și SFTP pentru toate conexiunile noastre actuale. Serverul SFTP este configurat cu o închisoare chroot care se înregistrează printr-un dispozitiv legat în închisoarea chroot a utilizatorului. Acesta este preluat de rsyslog și trimis la /var/log/sftp.log, după care folosesc logstash pentru a analiza acel fișier și a trimite totul către un server de vizualizare pentru superutilizatorii noștri. Superutilizatorii se conectează la vizualizare pentru a vedea toate jurnalele SFTP și FTP/FTPS într-un singur loc.
Jurnalele pur-ftpd sunt formatate într-un mod în care super-utilizatorii noștri le place:
pure-ftpd: (testuser@hostname) [NOTIZARE] /home/ftpusers/testuser//outbound/testfile.pdf descărcat (1765060 bytes, 5989.55KB/sec)
Acest lucru este grozav, deoarece într-o singură linie arată exact utilizatorul și fișierul exact pe care l-au încărcat sau descărcat. Cu toate acestea, pentru SFTP situația nu este la fel de frumoasă:
internal-sftp[8848]: sesiune deschisă pentru utilizatorul local testuser de la [{ip_address}]
internal-sftp[8848]: opendir „/inbound”
internal-sftp[8848]: realpath "/inbound/."
internal-sftp[8848]: deschideți steaguri „/inbound/testfile.pdf” modul WRITE,CREATE,TRUNCATE 0666
internal-sftp[8848]: închideți „/inbound/testfile.pdf” octeți citiți 0 scrisi 1734445
În acest caz, jurnalele sunt ușor de urmărit. testuser
se conectează, scrie fișierul, gata. DAR avem mulți utilizatori care se conectează la un moment dat, iar jurnalele din mai multe instanțe de internal-sftp pot apărea simultan. Dacă se întâmplă acest lucru, singura modalitate de a urmări activitatea unui utilizator este să căutați numele de utilizator testuser
, găsiți ID-ul procesului care este înregistrat (8848
în exemplul de mai sus), apoi găsiți orice mesaje care au acel ID de proces. Mulți utilizatori se conectează printr-un cronjob, așa că acest lucru se întâmplă la fiecare 2 minute sau cam asa ceva... când avem 300 de utilizatori care se conectează la intervale regulate, vă puteți imagina că vânătoarea prin atâtea ID-uri de proces ar fi o durere.
Intrebarea mea
Există o modalitate de a prefața fiecare mesaj de jurnal de la sftp-internal cu numele utilizatorului care generează jurnalul? Acest lucru ar trebui să funcționeze într-o închisoare chroot. Nu găsesc nimic despre cum să modific mesajul pe care rsyslog îl generează pentru a include numele de utilizator.
Aș dori să văd ceva similar din jurnalele mele SFTP:
internal-sftp[8848]: (testuser) deschide „/inbound/testfile.pdf” flags WRITE,CREATE,TRUNCATE 0666
internal-sftp[8848]: (testuser) închide „/inbound/testfile.pdf” octeți citiți 0 scrisi 1734445
Starea actuală a configurației
Lanțul meu de proces merge:
ssh -> sftp-internal -> rsyslog (pe local3.*) -> fișier /var/log/sftp.log -> logstash -> export pe serverul de vizualizare
Extras din grupul meu chroot din /etc/ssh/sshd_config
Grupul de meciuri sftpusers
ChrootDirectory %h
AuthorizedKeysFile %h/.ssh/authorized_keys
ForceCommand internal-sftp -f local3 -l INFO
# ForceCommand internal-sftp -l VERBOSE
AllowTcpForwarding nr
X11Redirecționare nr
și /etc/rsyslog.d/sftp.conf al meu
local3.* -/var/log/sftp.log
Întrebări similare:
Această întrebare este despre înregistrarea SFTP în fișiere separate, dar menționează acest intrare waybackmachine pentru un articol vechi care includea intrări de jurnal SFTP destul de formatate pentru a arăta ca xferlog-urile standard.Articolul menționează un script Perl (sfântul graal) care îl va formata pentru tine, dar din păcate, linkul este mort. Aș putea scrie un script Python sau Perl care să găsească mesajul specific pentru transferuri, să ia id-ul procesului și să caute invers pentru a găsi utilizatorul, apoi să imprime un mesaj xfer reformatat cu numele de utilizator într-un fișier. Dar cu siguranță cineva a rezolvat această problemă înainte și are o soluție mai bună.
Vă mulțumesc pentru orice ajutor.