Murto näyttää harvoin siltä kuin elokuvissa. Kukaan ei kirjoita mitään päätteeseen eikä ruudulle ilmesty pääkalloja. Tavallinen tapaus on tylsempi: palvelin hidastuu, hosting-palveluntarjoaja lähettää kirjeen lähtevästä roskapostista, tai sivusto alkaa ohjata kävijöitä vieraaseen osoitteeseen.

Alla seitsemän tarkistusta siinä järjestyksessä, jossa ne kannattaa tehdä. Yhteensä ne vievät noin kymmenen minuuttia.

1. Mikä syö suoritinta

top -c
ps aux --sort=-%cpu | head -20

Etsittävä on prosessi, jolla on merkityksetön nimi ja joka pitää suoritinta lähes sadassa prosentissa. Kryptolouhijat ovat murron yleisin seuraus yksinkertaisesti siksi, että se on nopein tapa tehdä rahaa toisen palvelimella.

Kahteen asiaan kannattaa katsoa tarkemmin. Prosessit, jotka käynnistyvät hakemistoista /tmp, /dev/shm tai /var/tmp — sieltä ei käynnisty normaalisti mitään. Ja nimet, jotka muistuttavat järjestelmäprosesseja mutta eivät aivan täsmää: kswapd0 korkealla suoritinkuormalla väärästä hakemistosta ajettuna, tai crond isolla C-kirjaimella.

sudo ls -l /proc/<pid>/exe
sudo ls -l /proc/<pid>/cwd

Ensimmäinen komento näyttää suoritettavan tiedoston todellisen polun, toinen sen hakemiston, jossa prosessi työskentelee. Se riittää yleensä ymmärtämään, mistä on kyse.

2. Lähtevät yhteydet

sudo ss -tupn
sudo ss -tupn state established

Tavallinen verkkopalvelin ottaa harvoin yhteyttä ulospäin: paketinhallinnan peileihin, maksuyhdyskäytävään, sähköpostin lähetyspalveluun. Pysyvät yhteydet tuntemattomiin osoitteisiin korkeissa porteissa ovat joko louhinta-allas tai yhteys ohjauspalvelimeen.

Muista, että tämä tarkistus on yksinään heikko: haittaohjelma ottaa usein yhteyden vain aikataulun mukaan. Se ettei juuri nyt näy mitään, ei tarkoita ettei mitään olisi.

3. Kaikkien käyttäjien cron-tehtävät

Tänne juurrutaan niin, että siivottu palaa takaisin.

for u in $(cut -f1 -d: /etc/passwd); do echo "== $u"; sudo crontab -u "$u" -l 2>/dev/null; done
sudo ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/
sudo cat /etc/crontab

Epäilyttävää: rivit @reboot, pitkät koodatut komennot, curl- tai wget-kutsut, jotka putkitetaan komentotulkkiin, kaikki mikä käynnistyy väliaikaishakemistoista.

4. SSH-avaimet ja käyttäjät

sudo find /home /root -name authorized_keys -exec ls -l {} \; -exec cat {} \;
sudo awk -F: '$3 == 0 {print $1}' /etc/passwd
sudo lastlog | head -20

Jokainen rivi tiedostossa authorized_keys on jonkun pysyvä pääsy, joka selviää sekä salasanan vaihdosta että uudelleenkäynnistyksestä. Jos et osaa sanoa kenen avain on, pidä sitä vieraana — rivin lopun kommentti on vapaata tekstiä eikä todista mitään.

Toinen komento listaa kaikki tilit, joilla on uid 0. Siellä pitää olla vain root.

5. Kirjautumislokit

sudo grep 'Accepted' /var/log/auth.log | tail -30
sudo last -20
who

Tärkeitä ovat onnistuneet kirjautumiset, eivät epäonnistuneet. Epäonnistuneet yritykset ovat taustakohinaa, jota on jokaisella internetin palvelimella. Onnistunut kirjautuminen tuntemattomasta osoitteesta hetkellä, jolloin kukaan ei työskennellyt, on konkreettinen vastaus.

Debian 12:ssa ja Ubuntu 24.04:ssä tiedostoa /var/log/auth.log ei usein ole lainkaan — rsyslog-pakettia ei enää asenneta oletuksena. Lue sen sijaan journalia:

sudo journalctl -u ssh --since '7 days ago' | grep Accepted

6. Muuttuneet järjestelmätiedostot

Debianissa ja Ubuntussa on valmis vertailukohta: jokainen paketti kantaa mukanaan tiedostojensa tarkistussummat.

sudo apt install debsums
sudo debsums -c

Muuttuneet asetustiedostot hakemistossa /etc ovat normaalia — ne olet muuttanut itse. Muuttuneet suoritettavat tiedostot hakemistoissa /usr/bin, /bin tai /usr/sbin ovat juuri sitä, mitä etsit.

7. Epätavalliset tiedostot verkkojuuressa

sudo find /var/www -name '*.php' -mtime -7 -ls
sudo find /var/www/uploads -name '*.php'

Toinen komento on tärkeämpi kuin ensimmäinen. PHP-tiedostolla ei ole mitään laillista syytä olla latauskansiossa, ja se on yleisin paikka verkkokuorelle.

Jos jotain todella löytyy

Ensimmäinen impulssi on poistaa löydös heti. Se on väärin: tiedoston mukana katoaa tieto siitä, miten se sinne päätyi, ja ilman vastausta siihen kysymykseen kaikki toistuu muutamassa päivässä.

  1. Ota kopio tiedostosta ja sen muutosajankohdasta.
  2. Etsi verkkopalvelimen lokeista, mitä samaan aikaan tapahtui — sieltä löytyy yleensä sisäänpääsy.
  3. Käy läpi kaikki seitsemän kohtaa, ei vain sitä, josta jotain löytyi. Takaovia ei jätetä lähes koskaan yhtä ainoaa.
  4. Vasta sen jälkeen siivoa ja tuki itse haavoittuvuus.

Ja rehellinen rajaus: jos hyökkääjä sai rootin, mihinkään sisältä tehtyyn tarkistukseen ei voi täysin luottaa — työkalut itsessään voivat olla vaihdettuja. Syvän murron tapauksessa ainoa luotettava tie on uusi palvelin ja läpikäyty palautus varmuuskopiosta.

Mikä tekee tarkistuksesta vaikean

Suurin vaikeus tässä eivät ole komennot vaan se, ettei tuntematon rivi näytä epäilyttävältä, kun ei muista miltä lista näytti viime viikolla. Palvelimella, jonka joku muu on pystyttänyt, omaa ja vierasta on lähes mahdotonta erottaa.

Siksi johtopäätös on käytännöllinen: ota tilannekuva silloin, kun palvelin on kunnossa. Prosessien, porttien, cron-tehtävien ja avainten lista terveellä koneella on se vertailukohta, johon myöhemmin verrataan — ja silloin tuntien etsimisestä tulee kahden listan vertailu. Miltä se näyttää yhdelle sivulle koottuna, näkyy alla olevassa esittelyssä.