Cred că este de așteptat să funcționeze în acest fel, uneori este destul de util să postezi mesaje de jurnal dintr-un script. Cu siguranță nu a fost destinat ca utilizatorii să polueze jurnalele de sistem. Soluția, în opinia mea, este să ai un sistem de logare bine configurat, care va împiedica utilizatorii să polueze jurnalele sau să falsifice mesajele sistemului, permițându-ți să identifici utilizatorii care au obiceiul să facă acest lucru.
eu folosesc rsyslogd
, așa că îl folosesc pentru exemple.
În primul rând, trebuie să configurați rsyslogd
pentru a stoca anumite variabile din socket se deschide:
modul (încărcare="imuxsock"
SysSock.Annotate="on"
SysSock.ParseTrusted="on"
)
Cu aceasta, puteți accesa următoarele variabile:
pid
: PID-ul procesului de înregistrare.
uid
și gid
: UID-ul și GID-ul în care rulează procesul de înregistrare.
numele aplicatiei
: numele procesului de înregistrare
cmd
: linia de comandă completă a procesului de înregistrare
În cazul în care logger
, pid
va fi PID-ul systemd-journald
, și numele aplicatiei
va fi intotdeauna jurnal-systemd
.
Cu acestea, puteți face câteva lucruri:
Pur și simplu înregistrează-le
Puteți folosi un șablon care include aceste variabile, astfel încât să puteți vedea dacă există o discrepanță între mesaj și parametrii obținuți. Într-un șablon, puteți accesa aceste variabile cum ar fi %$!pid%
. Deci, de exemplu, dintre voi folosiți un șablon ca acesta:
$template SomeLogFormat,"%TIMESTAMP:::date-rfc3339% <%pri-text%> %syslogtag%%msg% (înregistrat de pid=%$!pid% rulând ca %$!uid%)\n"
daemon.* /var/log/daemon.log;SomeLogFormat
va produce următoarea intrare:
2021-10-27T18:27:54.638759+02:00 <daemon.info> sshd[986]: Cheie publică acceptată de la portul 127.0.0.19.8 65537 sha2: RSA 2e:45:25:54:36o::3 z3:55:07:04 (doar un fals) (înregistrat de pid=540 rulând ca 1000)
Din el, puteți vedea dacă mesajul este legitim, iar dacă nu, obțineți UID-ul utilizatorului care este într-o dispoziție amuzantă. Rețineți că, în loc să furnizați parametrii unul câte unul, puteți utiliza %$!%
șablon, care va înregistra valorile de mai sus în format JSON.
Redirecționați jurnalele utilizatorilor
Puteți plasa jurnalele scrise de utilizatori într-un fișier separat (poate pe un sistem de fișiere separat, astfel încât utilizatorii să nu poată umple sistemul de fișiere rădăcină). Puteți redirecționa toate jurnalele care provin de la utilizatori cu următoarea configurație:
dacă $!uid > 999 atunci /opt/log/user.log;SomeLogFormat
& Stop
Utilizarea șablonului ( ; SomeLogFormat
parte) este opțională. În acest fel, totul care provine de la orice cu un UID de 1000+ va fi scris în /opt/log/user.log
. Puteți chiar să separați jurnalele utilizatorilor după UID astfel:
$template userLogFile,"/opt/log/userlog_%$!uid%.log"
dacă $!uid > 999 atunci ?userLogFile;SomeLogFormat
& Stop
În acest fel, fiecare utilizator va avea propriile sale userlog_xxxx.log
fişier.