Moodul 10 · 10.2
Mida mitte teha
Moodul 10: Turvaliseks jäämine · Lugemisaeg: 12 minutit
Õpieesmärk: Pärast seda õppetundi tunned ära vead, mis kõige sagedamini viivad häkitud või katkise serverini, oskad selgitada, miks need on ohtlikud, ja tead, mida selle asemel teha.
Põhimõisted: root-sisselogimine parooliga, nõrk või vaikimisi parool, avatud andmebaas, Docker-API pordil 2375, docker.sock konteineris, chmod 777, curl | bash, saladused Gitis, haldusliides ilma kaheastmelise kinnitamiseta, tulemüür "korraks väljas", uuendusi pole, varukoopiat pole
Miks õppetund vigadest?
Enamikku servereid ei häki geniaalne ründaja tundmatu turvaauguga. Neid häkivad botid, mis käivad läbi kogu interneti ja otsivad teadaolevaid vigu: arvatavat parooli, avatud andmebaasi, programmi, millel on uuendus juba kuid tegemata. Kes väldib selle õppetunni vigu, langeb nende bottide sihtmärkide hulgast välja. See ongi suurem osa kaitsest, mida saada võid.
Iga vea juures on kirjas, miks see on ohtlik ja mida selle asemel teha. Peaaegu kõike oled õppinud varasemates õppetundides, see õppetund võtab selle kokku.
1. Root-sisselogimine parooliga
Probleem. Iga server saab kogu päeva sisselogimiskatseid pordile root (õppetund 5.3). Kui root saab parooliga sisse logida, on see parool ainus asi boti ja täieliku kontrolli vahel. Korduvkasutatud või liiga lühikesed paroolid arvatakse varem või hiljem ära või on need juba lekkinud nimekirjas.
Tee nii. Logi sisse ainult võtmetega: PasswordAuthentication no ja KbdInteractiveAuthentication no, root kõige rohkem võtmega (PermitRootLogin prohibit-password) või üldse mitte (no), igapäevane töö tavakasutajana sudoga (õppetunnid 2.2 ja 3.2). Kontrolli väljastpoolt, milliseid sisselogimisviise su server pakub (ülesanne Z2.2).
2. Andmebaas, vahemälu või otsinguklaster avatud internetti
Probleem. MySQL/MariaDB (3306), PostgreSQL (5432), Redis (6379), Elasticsearch või OpenSearch (9200) ja MongoDB (27017) on tehtud usaldusväärsetele programmidele usaldusväärses võrgus. Kui need kuulavad aadressil 0.0.0.0 ilma tulemüürita, leiavad skännerid need kiiresti üles. Redis ütleb oma dokumentatsioonis, et teda ei tohi internetile avada ja et ligipääsuga inimene võib kustutada kogu andmestiku; käsuga CONFIG saab ründaja isegi faile serverisse kirjutada. Avatud andmebaasid ja otsinguklastrid on juba aastaid olnud suurte andmelekete ja sinu andmete asemel jäetud "lunaraha"-teadete tuntud põhjus.
Tee nii. Lase sellistel teenustel kuulata aadressil 127.0.0.1 (õppetund 5.1), hoia neid tulemüüri taga (õppetund 5.2) ja ära avalda neid Dockeris või avalda ainult aadressil 127.0.0.1 (õppetund 9.3). Kui ise oma sülearvutist ligi vaja: SSH-tunnel (õppetund 2.3). Kontrolli väljastpoolt (ülesanne Z5.1).
3. Docker-API avatud või docker.sock konteineris
Probleem. Kes saab Dockeri deemonit juhtida, on sisuliselt serveris root: Dockeri dokumentatsioon ütleb, et deemonit tohivad juhtida ainult usaldusväärsed kasutajad, ja võrdsustab ligipääsu deemonile root-ligipääsuga. Sellel veal on kaks varianti:
- Deemon kuulab TCP-pordil ilma TLS-ita (tavaliselt 2375). Igaüks, kes selle pordini jõuab, saab käivitada konteinereid, millesse on haagitud su serveri ketas.
- Konteiner saab köiteks
/var/run/docker.sock("siis saab ta ise konteinereid hallata"). Kui see konteiner häkitakse, on kogu server ründaja käes.
Ka grupp docker võrdub rootiga (õppetund 9.2): lisa sinna ainult haldurid.
Tee nii. Lase Dockeril töötada ainult kohaliku sokli kaudu. Kaughaldus käib üle SSH (docker context koos ssh://) või, kui tõesti on vaja TCP-d, TLS-iga pordil 2376 ja kliendisertifikaatidega. Haagi docker.sock ainult konteinerisse, mida täielikult usaldad ja mida päriselt vajad, ning eelistatult ainult lugemiseks piirava puhverserveri kaudu.
4. chmod 777, et veateatest lahti saada
Probleem. Üleslaadimisel tuleb "Permission denied" ja foorum soovitab: chmod -R 777 /var/www. Pärast seda võib iga kasutaja ja iga protsess serveris kirjutada su veebisaidis kõike, ka häkitud plugin või mõni teine konto. Kood, mis on veebiserverile kirjutatav, võidakse turvaaugu kaudu tagauksega asendada.
Tee nii. Uuri välja, kes peab kirjutama ja kuhu (õppetund 3.1): tavaliselt ainult veebiserveri kasutaja ühes üleslaadimiste või vahemälu kaustas. Koodi omanik peab olema keegi muu kui veebiserver, õigused 644/755, üleslaadimised 750/640 või sarnased.
5. curl ... | bash ja tarkvara ükskõik kust
Probleem. Skript, mille käivitad rootina läbi lugemata, saab teha kõike: lisada allikaid ja võtmeid, faile üle kirjutada, teenust avada. Isegi kui kavatsus on hea, ei tea sa pärast, mis muutus, ja järgmisel väljalaske uuendamisel läheb midagi katki (õppetund 4.3).
Tee nii. Laadi skript alla ja loe see läbi. Eelista paigaldamist oma distributsiooni pakettide allikast või tegija ametlikust allikast, oma võtmega (Signed-By, õppetund 4.1). Pane kirja, mida paigaldad ja miks.
6. Uuendusi pole või uuendused "hiljem"
Probleem. Turvaaugud parandatakse ja seejärel kuritarvitatakse, tihti mõne päeva jooksul. Server, mis pole kuid uuendusi saanud või mis töötab toeta väljalaskel, kannab endas nimekirja teadaolevatest avaustest. Konteinereid apt ei uuenda.
Tee nii. Lülita automaatsed turvauuendused sisse (õppetund 4.2), määra taaskäivitamiseks kindel aeg, pane oma väljalaske toe lõppkuupäev kalendrisse (õppetund 4.3) ja uuenda konteinereid regulaarselt (õppetund 9.4).
7. Varukoopiat pole või seda pole kunagi testitud
Probleem. Hetktõmmis samal salvestusel ei ole varukoopia (õppetund 8.1). Serveris endas asuv varukoopia kaob häkkimise või lunavara korral koos sellega. Ja varukoopia, mida pole kunagi taastatud, on lootus, mitte kindlus.
Tee nii. Krüpteeritud varukoopiad väljaspool serverit (restic, õppetund 8.2), jälgimine, et need toimuvad, ja vähemalt kord kvartalis taastamise test.
8. Haldusliidesed avatud kõigile, ilma kaheastmelise kinnitamiseta
Probleem. Andmebaasi haldusliides (nt phpMyAdmin), Dockeri oma (nt Portainer), su rakenduse või paroolihoidla oma on ahvatlev sihtmärk: üks parool annab ligipääsu kõigele. Vaikimisi paroolid nagu admin/admin ja avatuks jäetud registreerimine (Vaultwarden, õppetund 9.4) teevad selle veel lihtsamaks.
Tee nii. Ära ava haldusliideseid internetti: kasuta SSH-tunnelit või luba ligipääs ainult kindlalt aadressilt. Kui liides peab siiski avalik olema: https, tugev unikaalne parool paroolihaldurist, kaheastmeline kinnitamine ja registreerimine suletud. Muuda alati vaikimisi paroolid.
9. Saladused Gitis või compose-failis
Probleem. Parool, API-võti või privaatvõti failis, mis satub Git-repositooriumisse, jääb sinna ajalukku igaveseks, ka siis, kui selle hiljem eemaldad. Botid otsivad avalikest repositooriumidest just selliseid võtmeid.
Tee nii. Hoia saladusi eraldi failis õigustega 600 (EnvironmentFile, õppetund 6.3; .env Docker Compose'i puhul, õppetund 9.3), mis on kirjas failis .gitignore. Kui saladus siiski lekkis: asenda see kohe (uus parool, uus võti), ainult Gitis koristamisest ei piisa.
10. Tulemüür "korraks" väljas, kõik rootina ja märkmeid pole
Probleem. "Lülitan tulemüüri testimiseks korraks välja" ununeb. "Teen selle korraks rootina" muutub harjumuseks. Ja serverit, mille kohta keegi ei tea, mis seal töötab ja miks, ei saa hallata ega taastada.
Tee nii. Testi ajutise, kitsa reegliga (üks port, üks lähteaadress) ja eemalda see pärast. Tööta tavakasutajana sudoga. Pea lühikest serveritoimikut: mis töötab, millised pordid on avatud, kus on varukoopiad, millal lõpeb väljalaske tugi (õppetund 10.4).
Praktikas
Kõiki neid vigu saab teha igas VPS-is, WebOké juures samamoodi nagu teiste pakkujate juures: mis su serveris toimub, haldad sa ise. Pakkuja võib serveri võrgust eemaldada, kui see saadab rämpsposti või korraldab rünnakuid, sest see mõjutab teisi kliente. Ennetamine on seega oluline ka su enda kättesaadavuse jaoks.
Kokkuvõte
- Enamik häkkimisi kasutab teadaolevaid vigu, mitte tundmatuid turvaauke.
- Logi sisse võtmetega, paroolisisselogimine välja; andmebaasid, vahemälud ja Docker-API mitte kunagi internetile avatud;
docker.sockmitte konteineritesse, mida sa täielikult ei usalda. - Ei mingit
chmod 777egacurl | bash: tea, kes mida tohib ja mida sa paigaldad. - Uuendused automaatselt, varukoopiad väljaspool serverit ja testitud, haldusliidesed tunneli taga või kaheastmelise kinnitamisega.
- Saladused väljaspool Giti ja compose-faile; lekkinud tähendab asendatud.
Test (quiz)
Ülesanne
Ülesanne Z10.2: Mis viga see on? Näidisfailis casussen-z10-2.md on kaheksa lühikest juhtumit serveritest, millega on midagi valesti. Vali iga juhtumi kohta, milline viga see on selle õppetunni nimekirjast (A kuni J) ja mis on parim esimene samm. Programm võrdleb vastuseid kindla võtmega ja näitab seejärel iga juhtumi selgitust.
Loe edasi
- Oma VPS-i turvamine: esimesed viis minutit
- Paroolihaldur ja pääsuvõtmed: nii korraldad oma sisselogimise turvaliselt
- Dockeri dokumentatsioon, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Dockeri dokumentatsioon, Protect the Docker daemon socket: https://docs.docker.com/engine/security/protect-access/
- Redis, Security: https://redis.io/docs/latest/operate/oss_and_stack/management/security/
