Monitorizare pentru servere, hosting și site-uri, verificare cu verificare
Patru tipuri de host, fiecare cu verificările lui: ce măsurăm, la ce interval și de ce contează. Plus ce rămâne în afara vederii, spus pe față.
Toate verificările, pe tipuri de host
VPS cu agent
Server cu acces root, unde e instalat agentul complet. Agentul trimite raportul, semnat, implicit la fiecare 5 minute (între 1 și 60, la alegere). Spre server nu deschidem conexiuni, în afara sondelor de site când adresa hostului e un domeniu.
din raport
- CPU, ca încărcare per nucleu (la 5 min): Încărcare normalizată pe fiecare nucleu, nu utilizare reală: atât poate calcula ieftin un script shell. Poate depăși 100% când se formează coadă de execuție.
- Memorie și spațiu pe disc (la 5 min): Avertisment de la 85% pe memorie și 80% pe disc, nu la 100%: rostul cifrei e să-ți dea zile în care poți șterge logurile în tihnă, nu o repornire la trei dimineața.
- Load average și uptime (la 5 min): O repornire despre care nu știai apare ca uptime resetat între două rapoarte, chiar dacă nimic altceva nu s-a schimbat.
ce urmărește agentul
- Autentificări SSH acceptate și eșuate (la 5 min): Sursă, utilizator și metodă. Semnalul care contează nu e valul de eșecuri, ci o reușită cu o cheie pe care n-o cunoaștem.
- Blocări de firewall și fail2ban (la 5 min): Numărăm din contoarele regulilor, nu din jurnal: firewalld vine din fabrică cu jurnalizarea oprită, deci pe majoritatea serverelor RHEL jurnalul e gol în timp ce contoarele cresc. Jurnalul rămâne folosit doar ca să spună cine a fost blocat.
- Regulile de firewall, ca linie de bază (la 5 min): Citim ruleset-ul direct din nftables, firewalld, ufw sau iptables și îl comparăm cu cel de dinainte. O regulă ștearsă e jumătatea care contează: așa se deschide o ușă. Iar dacă nu găsim niciun firewall cu reguli, o spunem - un server fără firewall nu produce nicio blocare, deci prin vechea sondă arăta ca unul perfect apărat.
- Procese suspecte, după comportament (la 5 min): Nu semnături: proces fără binar pe disc, nume mascat, părinte anormal. Așa a fost prins minerul care se dădea drept proces de sistem.
- Conexiuni spre porturi de mining (la 5 min): Destinații și pool-uri cunoscute, plus tiparul de trafic constant care le însoțește chiar și când portul e schimbat.
- Porturi noi în ascultare (la 5 min): Diferență față de starea de dinainte, cu procesul care le deține. Un port apărut fără să fi instalat nimic e întrebarea zilei.
- Executabile noi în directoare volatile (la 5 min): /tmp, /var/tmp și /dev/shm, cu amprentă și momentul apariției. Acolo aterizează prima dată aproape orice payload.
- Sarcini cron adăugate sau șterse (la 5 min): Per utilizator, cu comanda întreagă. Persistența se face prin cron mai des decât prin orice altceva.
- Chei SSH și sudo, cu incident critic (la 5 min): O cheie apărută în authorized_keys sau o regulă sudo nouă deschid incident imediat, fără prag și fără așteptare.
- Tipare de backdoor în webroot (la 5 min): Webshell-uri, eval ofuscat, uploadere. Se uită la fișierele noi și modificate, nu la tot arborele de fiecare dată.
starea sistemului
- Disc și inoduri, pe toate partițiile (la 5 min): Nu doar /: un /var plin oprește baza de date și logurile în timp ce / arată bine. Avertisment de la 90%, critic de la 97%.
- Servicii systemd căzute (la 5 min): Orice serviciu pe care systemd l-a declarat eșuat, cu numele lui. Un certbot căzut la trei dimineața se vede aici înainte să expire certificatul.
- Procese oprite de kernel din lipsă de memorie (la 5 min): Ce a oprit OOM killer-ul de la raportul trecut. Baza de date omorâtă noaptea lasă doar urma asta.
- Actualizări în așteptare și repornire necesară (la 6 ore): Câte actualizări sunt disponibile și câte sunt de securitate, simulat din listele deja aflate pe server: agentul nu instalează nimic. O repornire amânată peste 7 zile devine avertisment.
- Autentificare SSH cu parolă (la 6 ore): Din configurația efectivă a sshd, nu din fișier. Root cu parolă e avertisment; parola pentru restul conturilor e notată.
- Sistem de operare ieșit din suport (la 5 min): O versiune fără suport nu mai primește actualizări de securitate, oricât de des rulezi upgrade. Avertizăm cu 90 de zile înainte.
din exterior, dacă adresa e un domeniu
- Disponibilitate HTTP (la 5 min): Site-ul servit de acest server, văzut ca de un vizitator. O cădere se confirmă cu a doua sondă înainte de alertă.
- Înregistrări DNS (la 1 oră): A, NS și MX, comparate cu linia de bază, de pe resolvere publice.
- Certificat TLS și liste de blocare (la 6 ore): Certificatul servit efectiv și prezența IP-ului pe listele care afectează mailul.
- Expirarea domeniului (la 12 ore): Prin RDAP, cu whois ca rezervă. Pentru .ro registrul nu publică data, deci urmărim starea domeniului.
remedieri, numai cu aprobarea ta
- Blochează o adresă în firewall (la cerere): Regula expiră singură după 24 de ore, pe orice backend: dacă panoul moare, serverul tău se deblochează fără noi. Agentul refuză adresa proprie a serverului, gateway-ul, resolverele DNS, adresa sesiunii tale SSH și adresa panoului - blocarea oricăreia ar tăia exact canalul prin care s-ar putea anula.
- Oprește un proces (la cerere): Înainte să trimită semnalul, agentul verifică din nou că pid-ul e tot al aceluiași program - nume, executabil și contorul de generație din kernel. Un pid reciclat între propunere și aprobare e refuzat, nu oprit. Nu se ating niciodată systemd, sshd sau restul proceselor fără de care serverul nu mai e administrabil.
- Mută un fișier în carantină (la cerere): Se mută, nu se șterge și nu se rescrie: fișierul rămâne ca dovadă și se poate pune înapoi cu un clic. Doar din directoarele volatile, niciodată prin symlink, și doar dacă amprenta e aceeași cu cea din momentul deciziei.
de pe partea noastră
- Tăcerea agentului deschide incident critic (permanent): Dacă raportul nu vine, tratăm absența ca semnal, nu ca liniște. Fie serverul e oprit, fie agentul a fost oprit, iar a doua variantă e felul în care arată o compromitere reușită.
- O comandă cu semnătură greșită e incident critic (permanent): Fiecare comandă e semnată cu secretul serverului tău, peste un număr aleator pe care agentul l-a generat cu câteva secunde înainte - deci un răspuns înregistrat nu poate fi rejucat mai târziu, de nimeni. Dacă semnătura nu se verifică, agentul refuză și raportează: cineva încearcă să comande serverul.
Ce nu vede: Cum se vede site-ul din afară, când adresa hostului e doar un IP. Cu un domeniu ca adresă, verificările din exterior de mai sus pornesc singure; antetele, conținutul paginii și porturile expuse rămân pe hostul verificat din exterior.
Hosting partajat
Cont fără root. Agentul rulează din interiorul contului, iar site-ul e interogat în paralel din exterior. Două unghiuri, fiindcă niciunul singur nu ajunge.
din cont
- Amprente sha256 pe fișierele din webroot (la 5 min): Comparăm amprentă cu amprentă, nu data modificării, care se poate falsifica. Se recitesc doar fișierele cu dimensiunea, data sau inode-ul schimbate - pe un site pe care nu s-a atins nimeni, o rulare nu citește niciun fișier. Până la 40.000 de fișiere pe cont; peste plafon, panoul spune pe față că inventarul e trunchiat. Pe lângă PHP, HTML și JS sunt urmărite .htaccess, .user.ini, php.ini și extensiile rare (.php7, .pht, .phar, .shtml) pe care le folosesc backdoor-urile.
- Tipare de injecție în conținutul fișierelor (la 5 min): Până acum tiparele se căutau doar în logurile de acces: se vedea cine cere ?cmd=, nu ce s-a scris în index.php - deci un backdoor injectat într-un site fără trafic era invizibil. Acum se citește și conținutul, dar numai al fișierelor care oricum se recitesc, deci costul e aproape zero. Conținutul nu pleacă niciodată de pe server: primești numele familiei și numărul liniei.
- Logurile de acces ale contului (la 5 min): Tipare de forțare, scanare de căi și cereri POST în rădăcină, citite din domlogs-ul contului.
- Crontab-ul contului (la 5 min): Orice sarcină nouă sau ștearsă, cu comanda completă. E singura formă de persistență pe care o poate folosi un cont fără root.
- Curățare într-un clic, cu aprobarea ta (la cerere): Bifezi fișierele infectate și le muți în carantină dintr-un singur clic - care propune lotul, nu îl execută: fiecare mutare se aprobă în panou, cu toate căile la vedere. Fișierele se mută în afara webroot-ului, deci nu mai sunt accesibile din web, dar rămân ca dovadă și se pun înapoi tot cu un clic. Nu rescriem niciodată conținutul unui fișier. wp-config.php și .htaccess sunt refuzate: dacă unul dintre ele e infectat, se rezolvă editându-l, nu scoțându-l - altfel o infecție devine o pană totală.
din exterior
- Disponibilitate HTTP (la 5 min): Cod, timp de răspuns și redirecturi, de pe un server fără legătură cu al tău. Un apex care trimite spre alt domeniu rămâne avertisment, nu verde. O cădere se confirmă cu a doua sondă înainte de alertă.
- Înregistrări DNS și delegare (la 1 oră): A, NS și MX, comparate cu linia de bază. Interogăm resolvere publice, nu pe cel al serverului, ca o pană locală să nu treacă drept domeniu dispărut.
- Certificat TLS (la 6 ore): Emitent, lanț și zile rămase. Avertisment la 21 de zile, critic la 7, ca reînnoirea să nu cadă în weekend.
- Antete de securitate (la 6 ore): HSTS, CSP, X-Frame-Options, Referrer-Policy. Se măsoară pe pagina finală, nu pe redirect, altfel verdictul e despre altceva.
- Liste de blocare (la 6 ore): Trei liste care chiar afectează livrarea mailului. Un răspuns refuzat de listă e „nu știm”, nu „curat”.
- Scripturi terțe și cookie-uri (la 6 ore): Ce se încarcă din afară și ce se scrie fără protecție. Un script nou pe care nu l-a pus nimeni din echipă e primul semn de compromitere a paginii.
- SPF, DMARC, DKIM, CAA, DNSSEC (la 12 ore): Sintaxă, duplicate și politici prea permisive, inclusiv cazul a două înregistrări SPF, unde standardul cere exact una.
- Fișiere sensibile expuse (la 12 ore): .git, .env, backup-uri și dumpuri. O sondă de control cu nume aleatoriu stabilește întâi cum arată „nu există”, ca un site care redirecționează tot să nu pară plin de fișiere expuse.
- Calitatea TLS: protocoale și cifruri (la 12 ore): Versiuni depășite încă acceptate și cifruri slabe, testate prin handshake real, nu deduse din banner.
- Expirarea domeniului (la 12 ore): Prin RDAP, cu whois ca rezervă. Avertisment la 30 de zile, critic la 7. Pentru .ro registrul nu publică data, deci urmărim starea domeniului: blocat sau expirat e critic.
Ce nu vede: Procese, porturi, CPU și memorie. Nu sunt ale contului, ci ale serverului, iar a le raporta ca ale tale ar fi dezinformare, nu date. Nici scanare de porturi: toate conturile ies pe același server.
Verificat din exterior
Nu se instalează nimic. Site-ul e interogat din afara rețelei, ca de orice vizitator, de pe un server care nu are legătură cu al tău.
disponibilitate
- Cod HTTP și timp de răspuns (la 2 min): Praguri pe timpul de răspuns, nu doar pe cod: un site care răspunde în cinci secunde e căzut pentru vizitator, chiar dacă întoarce 200. O cădere se confirmă cu a doua sondă, după 15 secunde, înainte de alertă. Opțional, pagina trebuie să conțină un text ales de tine: așa se prind și pagina de cont suspendat sau un site defăimat, care răspund tot cu 200.
- Înregistrări DNS, cu alertă la schimbare (la 15 min): O schimbare de A sau de NS e critică și trimite la registrar: așa arată o deturnare de domeniu înainte să o observe cineva.
certificat și conținut
- Certificat TLS, zile rămase (la 1 oră): Emitent, lanț complet și potrivirea numelui, inclusiv wildcard-urile. Schimbarea autorității emitente e raportată separat.
- Antete de securitate (la 1 oră): Ce lipsește și ce e configurat prea permisiv. Incidentul se redeschide când lista se schimbă, ca o reparație parțială să nu treacă drept rezolvare.
- Scripturi terțe, cookie-uri, derivă structurală (la 1 oră): Origini externe încărcate de pagină, cookie-uri fără protecție și schimbări de structură față de ultima citire.
postură
- Liste de blocare pentru IP-urile tale (la 6 ore): Apariție și motiv, pe listele relevante pentru mail și web. Verificăm până la patru adrese ale domeniului.
- SPF, DMARC, DKIM, CAA, DNSSEC (la 6 ore): Sintaxă, duplicate și politici prea permisive. Fără DMARC, oricine îți poate trimite mail în numele domeniului.
- Fișiere sensibile expuse: .git, .env, backup (la 12 ore): Căi verificate direct, ca de pe internet, cu control împotriva site-urilor care întorc pagina de start pentru orice cale inexistentă.
- Calitatea TLS: protocoale, cifruri, chei (la 12 ore): Handshake real pe fiecare versiune de protocol. TLS 1.0 și 1.1 încă acceptate sunt avertisment, nu detaliu.
- Porturi expuse spre internet (la 12 ore): Ce răspunde public pe adresa domeniului. O bază de date accesibilă din internet e critică imediat; adresele de CDN sunt sărite, fiindcă nu sunt ale tale.
- Expirarea domeniului (la 12 ore): Prin RDAP, cu whois ca rezervă. Avertisment la 30 de zile, critic la 7. Pentru .ro registrul nu publică data, deci urmărim starea domeniului: blocat sau expirat e critic.
Ce nu vede: Nimic din interior: nici procese, nici fișiere, nici loguri. În schimb e singurul unghi care vede exact ce vede clientul tău.
Reseller cPanel
Nu e un server, ci un index. Interogăm WHM cu credențialele pe care le salvezi tu în panou și adăugăm câte un host pentru fiecare cont găsit, inclusiv cele apărute fără știrea ta.
serverul
- Versiune cPanel și load average (la 10 min): Versiune rămasă în urmă și încărcare susținută, ca semnal de vecini zgomotoși pe serverul pe care revinzi.
- Tokenuri API și politica de 2FA (la 6 ore): Un token API apărut e critic: e cheia cu care cineva poate face din exterior tot ce faci tu din WHM.
conturile
- Conturi apărute, șterse sau suspendate (la 30 min): Diferență față de inventarul anterior. Nu poți proteja ce nu știi că există, iar un cont apărut fără știrea ta e chiar definiția asta. Un cont șters sau suspendat își pune sondele de site pe pauză, iar la reactivare ele pornesc din nou.
- Înrolarea agentului pe conturile noi (la 30 min): Poți instala agentul pe toate conturile neînrolate dintr-o comandă, sau poți lăsa conturile noi să se înroleze singure pe măsură ce apar. Fereastra dintre crearea unui cont și prima privire a unui om e exact când e cel mai vulnerabil: WordPress proaspăt, parole implicite, nimeni care se uită. Conturile care raportează deja sunt sărite, nu reinstalate - instalarea rotește cheia, iar o rotire peste un agent care merge l-ar omorî.
- Cote de disc și inode, per cont (la 30 min): Cotele vin din WHM ca text cu sufix, „698M” sau „1.2G”. Le convertim explicit, fiindcă o parsare naivă raportează un cont plin la 0,13% ocupare.
- Shell, plan, IP și reținerea mailului (la 30 min): cPanel pune singur marcajul de reținere când un cont depășește rata de mail. E verdictul serverului care vede coada de trimitere: nu există semnal mai direct de WordPress compromis.
domeniile
- Domeniu expirat sau delegare retrasă (la 1 oră): Contul rămâne pe server, cu fișiere și cu mail, dar domeniul nu mai rezolvă nicăieri. Din WHM e invizibil: listarea îl arată la fel de sănătos ca pe oricare altul.
- Domeniu care răspunde de pe alt server (la 1 oră): Delegarea s-a mutat, dar contul e tot la tine. Îl poți marca „nu mai e al meu”: sondele se opresc, contul rămâne monitorizat, fiindcă ocupă în continuare spațiu.
Ce nu vede: Ce se întâmplă în interiorul conturilor. Pentru asta se instalează agentul în contul respectiv, iar contul devine un host de hosting partajat.