Monitorizare VPS cu agent: ce primești
Pe un server la care ai root instalezi agentul complet: un script shell care raportează semnat, la 5 minute, ce se întâmplă în interior. Din afară verificăm adresa publică. Problemele reale devin un incident și te anunță; restul rămâne în fișa hostului.
- agent, instalat ca root
- raport semnat la 5 min
Ce primești
Ce instalezi
Agentul, cu o singură comandă rulată ca root. Pe systemd rulează dintr-un timer cu prioritate scăzută; fără systemd, din cron. Nu are dependențe în afară de unelte standard: sh, curl, openssl și sha256sum; python3 e recomandat.
Ce vede din interior
Autentificări SSH, chei și conturi noi, sudo, procese suspecte, conexiuni spre pool-uri de mining, executabile noi în /tmp, fișierele site-urilor (amprente și tipare de backdoor), traficul web, mailul (unde există), firewall, porturi, cron, disc, servicii căzute, actualizări și configurația sshd.
Ce vede din afară
Dacă adresa hostului e un IP: listele de blocare și 16 porturi sensibile. Dacă e un domeniu: disponibilitatea, DNS-ul, certificatul, listele de blocare și expirarea domeniului. În ambele cazuri, fiecare site găzduit care răspunde primește o sondă HTTP, iar certificatele tuturor sunt urmărite.
Ce te anunță
Intrări SSH suspecte, chei sau conturi noi, procese și conexiuni de mining, executabile noi, malware în site, campanii web, disc plin, IP listat, porturi de baze de date expuse, site căzut, certificat aproape expirat, agent tăcut.
Ce poate repara
Patru, doar cu aprobarea ta: blochezi o adresă în firewall (expiră după 24 de ore), oprești un proces, muți un fișier din /tmp în carantină, repornești serverul web după testul configurației. Pornite din două locuri: la instalare și din panou.
Ce nu vede
Antetele de securitate, conținutul paginii, postura de e-mail și fișierele expuse ale site-ului nu se verifică din afară pe un VPS: pentru ele adaugi același domeniu și ca site extern. Și nimic din interiorul aplicațiilor: agentul vede serverul, nu baza de date sau codul aplicației.
Ce vezi în panou
Fișa hostului are filele Overview, Availability, System, Security, Files, Inventory, Checks, Activity și Agent (panoul e în engleză): grafice, autentificări, procese, rețea, fișierele site-urilor, inventarul, verificările din afară și starea agentului.
Cât ocupă din plan
Un host din plan. Site-urile găzduite descoperite pe server primesc sondă fără să ocupe hosturi în plus.
Lista completă, rând cu rând
Fiecare rând spune cât de des se uită, ce compară și ce face: te anunță, apare doar în fișa hostului sau e o remediere pe care o aprobi tu.
din raport
- CPU, ca încărcare per nucleu (la 5 min) [în fișa hostului]: Î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. Se vede în graficele fișei; nu trimite alertă.
- Memorie și discul / (la 5 min) [în fișa hostului]: În panou cifra se colorează de la 85% memorie și 80% disc, ca să ai zile în care să faci curat. Memoria plină nu trimite alertă singură; trimit procesele oprite din lipsă de memorie și discul de la 97% (rândurile de mai jos).
- Load average și uptime (la 5 min) [în fișa hostului]: 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) [te anunță]: Sursă, utilizator și metodă. Trei lucruri deschid incident: o intrare cu o cheie pe care n-o cunoaștem (critic), o intrare reușită după cel puțin 10 eșecuri de la aceeași adresă în două ore (critic) și o intrare cu parolă de la o adresă nouă (avertisment). Valul obișnuit de eșecuri rămâne în fișă.
- Chei SSH, conturi și sudo (la 5 min) [te anunță]: O cheie nouă în authorized_keys, o autoritate de certificare SSH, un cont nou cu shell, un membru nou în sudo, wheel sau docker, o linie nouă în sudoers, ori un cont creat sau modificat (useradd, usermod, passwd): incident critic imediat, fără prag.
- Procese suspecte, după comportament (la 5 min) [te anunță]: Nu semnături, ci un scor: binar pornit din /tmp sau șters de pe disc după pornire, interpretor care rulează un script din /tmp, procesor peste 80% timp de cel puțin 10 minute, utilizator neobișnuit. De la scorul 7 e incident critic. Așa a fost prins minerul care se dădea drept proces de sistem.
- Conexiuni spre porturi de mining (la 5 min) [te anunță]: Conexiuni stabilite spre porturile folosite de pool-uri (3333, 4444, 14444 și încă zece), fără adresele private și fără conexiunile care au intrat pe un port pe care ascultă chiar serverul. Incident critic. Un miner mutat pe portul 443 nu se vede aici; îl prinde regula de procese, după procesorul ocupat.
- Executabile noi în directoare volatile (la 5 min) [te anunță]: /tmp, /var/tmp și /dev/shm: fișiere ELF sau scripturi cu drept de execuție, apărute de la raportul trecut, cu amprentă sha256. Incident critic: acolo aterizează prima dată aproape orice payload.
- Tipare de backdoor și amprente în webroot (la 5 min) [te anunță]: Webshell-uri, eval ofuscat, uploadere și linii riscante în .htaccess sau .user.ini, în rădăcinile de site din configurația nginx și Apache. Se citesc doar fișierele noi sau modificate (primii și ultimii 64 KB), iar un tipar sigur deschide incident critic. Fiecare fișier are o amprentă: unul nou, modificat sau șters apare în fișă, fără alertă.
- Traficul web al site-urilor (la 5 min) [te anunță]: Logurile nginx și Apache ale serverului, rezumate pe fiecare sursă: câte căi diferite încearcă într-o oră, câte erori primește, dacă se anunță ca unealtă de scanare, cereri spre forme de backdoor. O campanie susținută deschide un incident; un bot obișnuit rămâne o notă în fișă.
- Mailul serverului, unde există (la 5 min) [te anunță]: Doar unde rulează postfix, exim sau dovecot. Un cont care trimite peste 1.000 de mesaje pe oră sau o coadă de peste 2.000 de mesaje deschid incident critic; încercările repetate de parolă și volumele mai mici rămân în fișă. Numele tastate la autentificările eșuate nu pleacă de pe server.
- Blocări de firewall și fail2ban (la 5 min) [în fișa hostului]: 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 spune doar cine a fost blocat.
- Regulile de firewall, ca linie de bază (la 5 min) [în fișa hostului]: Citim regulile direct din nftables, firewalld, ufw sau iptables și le comparăm cu cele de dinainte. O regulă ștearsă e jumătatea care contează: așa se deschide o ușă. Dacă nu găsim niciun firewall cu reguli, o spunem: un server fără firewall nu produce nicio blocare.
- Porturi noi în ascultare (la 5 min) [în fișa hostului]: Diferență față de starea aprobată, pe adresă și port. Un port apărut fără să fi instalat nimic e întrebarea zilei. Din afară, porturile chiar expuse spre internet le verifică sonda pe IP (mai jos).
- Sarcini cron și timere systemd (la 5 min) [în fișa hostului]: /etc/crontab, cron.d, crontab-urile utilizatorilor și timerele systemd, cu comanda întreagă. Persistența se face prin cron mai des decât prin orice altceva.
starea sistemului
- Disc și inoduri, pe toate partițiile (la 5 min) [te anunță]: Nu doar /: un /var plin oprește baza de date și logurile în timp ce / arată bine. Avertisment în fișă de la 90%, incident critic de la 97%.
- Servicii systemd căzute (la 5 min) [în fișa hostului]: 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) [în fișa hostului]: 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) [în fișa hostului]: Câte actualizări sunt disponibile și câte sunt de securitate, simulat din listele deja aflate pe server: agentul nu instalează nimic. Actualizările de securitate și o repornire amânată peste 7 zile devin avertisment.
- Autentificare SSH cu parolă (la 6 ore) [în fișa hostului]: Din configurația efectivă a sshd, nu din fișier. Root cu parolă e avertisment; parola pentru restul conturilor e notată.
- Postura sistemului, într-o singură verificare (la 5 min) [în fișa hostului]: Actualizări de securitate, repornire amânată, root cu parolă, firewall lipsă sau care nu filtrează: adunate într-o verificare care se vede în fișă și în scorul de securitate. E igienă, deci nu trimite alertă.
- PHP-ul serverului, față de PHP2Shell (la 5 min) [te anunță]: Fiecare versiune PHP instalată, cu pachetul din care vine: dacă cea folosită de site-uri e afectată de PHP2Shell (CVE-2026-109618, CVE-2026-109619), dacă distribuția a pus fixul sub numărul vechi și dacă PHP-ul a fost repornit după actualizare. Inventarul se reface la 6 ore; o versiune afectată aflată în uz deschide incident.
- Sistem de operare ieșit din suport (la 5 min) [în fișa hostului]: 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 afară, dacă adresa e un IP
- Liste de blocare pentru IP (la 6 ore) [te anunță]: Adresa serverului, pe Spamhaus ZEN, SpamCop și Barracuda. Un IP listat e incident critic: mailul serverului nu mai ajunge. O listă care nu răspunde înseamnă „nu știm”, nu „curat”.
- Porturi expuse spre internet (la 12 ore) [te anunță]: Încercăm 16 porturi din afară, pe IP-ul serverului. O bază de date (MySQL, PostgreSQL, Redis, MongoDB, Elasticsearch, Memcached), API-ul Docker, VNC sau Telnet accesibile din internet sunt incident critic; RDP, FTP și Kibana, avertisment.
din afară, dacă adresa e un domeniu
- Disponibilitate HTTP (la 1 min) [te anunță]: Site-ul de la adresa hostului, văzut ca de un vizitator: cod, timp de răspuns, redirecturi. O cădere se confirmă cu a doua sondă, după 15 secunde, înainte de alertă.
- Înregistrări DNS (la 1 oră) [te anunță]: A, NS și MX, comparate cu linia de bază, de pe resolvere publice. O schimbare de A sau NS e incident critic.
- Certificat TLS și liste de blocare (la 6 ore) [te anunță]: Certificatul servit efectiv (lanț, nume, zile rămase: 21 și 7) și prezența IP-ului domeniului pe listele care afectează mailul.
- Expirarea domeniului (la 12 ore) [te anunță]: 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.
site-urile găzduite pe server
- Site-urile găzduite, fiecare cu sonda lui (la 1 min) [te anunță]: Domeniile din configurația nginx și Apache pe care le raportează agentul sunt încercate o dată; cele care răspund primesc o sondă HTTP, fără să ocupe un host din plan. O cădere se confirmă cu a doua sondă, după 15 secunde, înainte de alertă.
- Certificatele tuturor site-urilor găzduite (la 10 min) [te anunță]: Certificatul servit de fiecare site care are sondă: avertisment cu 21 de zile înainte de expirare sau dacă browserele îl refuză, critic de la 7 zile. Un singur incident pe server, cu lista site-urilor.
remedieri, numai cu aprobarea ta
- Blochează o adresă în firewall (la cerere) [cu aprobarea ta]: Doar IPv4, pe nftables, firewalld sau ufw. Regula expiră după 24 de ore: pe nftables chiar în kernel, pe firewalld și ufw la următoarea rulare a agentului, deci și dacă panoul nu mai răspunde. Agentul refuză adresele private, adresa proprie a serverului, gateway-ul, resolverele DNS și adresele panoului: blocarea oricăreia ar tăia exact canalul prin care s-ar putea anula.
- Oprește un proces (la cerere) [cu aprobarea ta]: Înainte să trimită semnalul, agentul verifică din nou că pid-ul e tot al aceluiași program: nume, executabil și momentul pornirii din kernel. Un pid reciclat între propunere și aprobare e refuzat, nu oprit. Nu se ating niciodată systemd, sshd, journald sau restul proceselor fără de care serverul nu mai e administrabil.
- Mută un fișier în carantină (la cerere) [cu aprobarea ta]: 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 /tmp, /var/tmp și /dev/shm, niciodată prin symlink, și doar dacă amprenta e aceeași cu cea din momentul deciziei.
- Repornește serverul web (la cerere) [cu aprobarea ta]: nginx, Apache, LiteSpeed sau PHP-FPM, doar unitățile pe care le raportează agentul. Întâi se testează configurația (nginx -t, apachectl -t, php-fpm -t): dacă testul pică, nu se repornește nimic și vezi de ce. Apoi reîncărcare sau repornire, verificarea că serviciul rulează și după două secunde, ultimele linii din jurnalul lui și o nouă sondă a site-ului din afară. Cel mult trei reporniri pe oră pentru același serviciu. Se poate opri pe server cu VPSDASH_ACTIONS_SERVICES=0.
de pe partea noastră
- Agent tăcut: incident critic (permanent) [te anunță]: Dacă trei rapoarte la rând nu vin, 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ă.
- Colector care nu mai poate citi (la 5 min) [te anunță]: Un jurnal mutat, un drept pierdut, o unealtă lipsă: colectorul afectat e numit, cu motivul. Tăcerea unui colector nu are voie să arate ca un server curat.
- Comandă cu semnătură greșită: incident critic (permanent) [te anunță]: 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. Dacă semnătura nu se verifică, agentul refuză și raportează: cineva încearcă să comande serverul.
remedierile sunt oprite din fabrică și se activează din două locuri: o dată la instalarea agentului, pe serverul tău, și o dată din panou. Fără ambele, o comandă corect semnată e tot refuzată
Cum pornești
- În panou alegi „Add a host”, tipul „VPS with agent”, cu adresa serverului (IP sau domeniu).
- Copiezi comanda de instalare generată acolo și o rulezi pe server, ca root. Cheia și secretul trec prin variabile de mediu, nu prin adresă.
- Instalatorul trimite primul raport și îți spune dacă panoul l-a primit. De acolo agentul raportează singur, la 5 minute.
- Opțional: remedierile. Le pornești la instalare și din panou; fără ambele, nicio comandă nu rulează.
Întrebări despre acest tip de host
Are nevoie agentul de root?
Pe un VPS, da: agentul complet citește jurnalul de autentificare, regulile de firewall și procesele tuturor utilizatorilor. Rulat fără root, instalatorul trece singur pe modul de hosting partajat, care vede doar fișierele site-ului, cronul contului și logurile de acces.
Cât consumă pe server?
Rulează la 5 minute, cu prioritate scăzută la procesor și la disc, și cu limită de timp pe fiecare comandă. Amprentele de fișiere au un buget de 20 de secunde și cel mult 2.000 de fișiere pe rulare, iar pe un site neatins o rulare nu recitește nimic.
Ce date pleacă de pe server?
Cifre, nume, amprente și rezumate. La un incident critic se adaugă dovezi scurte: linia de comandă a procesului, ultimele 60 de linii din jurnalul de autentificare la schimbarea unui cont sau a unei chei, primii 256 de octeți ai unui executabil nou. Nu pleacă fișiere întregi, .env, baze de date sau chei private.
Poate agentul să schimbe ceva pe server?
Implicit, nu: doar citește. Cele patru remedieri se activează din două locuri și rulează doar după ce le aprobi. Actualizarea agentului din panou e o opțiune separată, bifată implicit la înrolare (o poți debifa), și verifică amprenta fișierului înainte de a-l rula.