Ciele
- Priprav si zálohu, ku ktorej sa vieš vrátiť
- Daj používateľovi právo na jednu jedinú vec
- Over, že pravidlo naozaj nič iné nedovolí
- Nastav výnimku pre jedného človeka cez prístupový zoznam
- Nájdi masku, ktorá ti výnimku vypne
- Uzavri vzdialený prístup
- Postav firewall a over ho zvonka
Úvod
Na prednáške sme hovorili o tom, že medzi bežným používateľom a rootom nie je nič, a o troch nástrojoch, ktorými sa to dá vyplniť. Dnes si to postavíš vo vlastnej virtuálke.
Upozornenie: V šiestom a siedmom kroku budeš zasahovať do vzdialeného prístupu. Prvý krok preto nie je nepovinný. Bez snapshotu sa môžeš zamknúť vonku a začínať odznova.
Všetko robíš vo svojej virtuálke. Celé to trvá zhruba hodinu a pol. Nie je to za body, mentori to s tebou preberú.
Postup
Krok 1: Priprav si zálohu, ku ktorej sa vieš vrátiť
Úloha 1.1
Vo virtualizačnom nástroji si vytvor snapshot a pomenuj ho tak, aby si vedel, že je spravený pred hardeningom.
Úloha 1.2
Otvor si dve samostatné prihlásenia do virtuálky a obe nechaj otvorené až do konca cvičenia. Jedno bude pracovné, druhé je tvoja záchranná sieť.
Poznámka: Toto je jediná ochrana pred chybou, ktorú raz v živote urobí každý — zakázať prihlásenie heslom, odhlásiť sa a zistiť, že kľúč nefunguje. V druhom, už otvorenom spojení sa to dá opraviť. Po jeho zatvorení nie.
Krok 2: Daj používateľovi právo na jednu jedinú vec
Vytvor si testovacieho používateľa, na ktorom budeš skúšať.
sudo adduser tester
Teraz mu daj vymedzené oprávnenie. Nezapisuj do hlavného súboru, vytvor si vlastný:
sudo visudo -f /etc/sudoers.d/tester
Do súboru napíš jeden riadok. Over si najprv, kde máš systemctl, a použi tú cestu:
tester ALL=(root) /usr/bin/systemctl restart ssh
Úloha 2.1
Ulož súbor. Ak ti visudo ohlási chybu syntaxe, oprav ju — súbor s chybou by vyradil sudo pre všetkých.
Poznámka: Prečo samostatný súbor a nie hlavný sudoers? Lebo zmena jedného pravidla potom nemôže pokaziť ostatné a súbor sa dá zmazať bez stopy v ostatnom nastavení.
Krok 3: Over, že pravidlo naozaj nič iné nedovolí
Prepni sa na testovacieho používateľa a vyskúšaj, čo smie:
su - tester
sudo systemctl restart ssh # malo by prejst
sudo systemctl restart cron # malo by byt odmietnute
sudo systemctl stop ssh # malo by byt odmietnute
sudo -l # vypise, co tento ucet smie
sudo cat /etc/shadow # malo by byt odmietnute
Úloha 3.1
Zapíš si, ktoré z tých piatich príkazov prešli a ktoré systém odmietol. Posledný výpis si odlož, budeš ho potrebovať pre mentora.
Teraz si over, že záznam naozaj vzniká:
exit
sudo journalctl -t sudo --since "10 min ago" | tail -20
Úloha 3.2
Nájdi v zázname svoj úspešný príkaz aj odmietnutý pokus. Všimni si, že je tam uvedené meno používateľa, čas a celý príkaz s parametrami.
Poznámka: Práve toto pri práci priamo pod kontom root neexistuje. Zo záznamu sa nedá zistiť, ktorý človek príkaz spustil, lebo všetci sú root.
Krok 4: Nastav výnimku pre jedného človeka cez prístupový zoznam
Vytvor si adresár a súbor, na ktorom budeš skúšať:
mkdir ~/projekt
echo "obsah" > ~/projekt/navrh.txt
chmod 640 ~/projekt/navrh.txt
ls -l ~/projekt/navrh.txt
Teraz daj testovaciemu používateľovi právo čítať ten súbor — bez toho, aby si ho pridával do akejkoľvek skupiny:
setfacl -m u:tester:r-- ~/projekt/navrh.txt
getfacl ~/projekt/navrh.txt
ls -l ~/projekt/navrh.txt
Úloha 4.1
Porovnaj oba výpisy. Zapíš si, čím presne sa bežný výpis adresára líši od výpisu prístupového zoznamu a aký jediný znak ti prezradí, že na súbore nejaký zoznam je.
Úloha 4.2
Aby sa tester k súboru dostal, potrebuje právo vstúpiť aj do adresára. Nastav mu ho a over, že čítanie funguje:
setfacl -m u:tester:--x ~/projekt
sudo -u tester cat ~/projekt/navrh.txt
Krok 5: Nájdi masku, ktorá ti výnimku vypne
Toto je jadro celého cvičenia. Výnimka funguje. Teraz ju pokazíš jedným úplne nevinným príkazom.
getfacl ~/projekt/navrh.txt | grep mask
chmod 600 ~/projekt/navrh.txt
getfacl ~/projekt/navrh.txt
sudo -u tester cat ~/projekt/navrh.txt
Úloha 5.1
Zapíš si, ako vyzeral riadok mask pred zmenou a ako po nej. A zapíš si,
či je riadok s výnimkou pre testera v zoznamu stále zapísaný.
Poznámka: Výnimka tam stále je. Len sa neuplatní, pretože výsledné právo je prienikom položky a masky. Klasická zmena práv na súbore s prístupovým zoznamom nemení skupinové právo — mení masku. Toto je najčastejší dôvod, prečo niekomu prístupové zoznamy „nefungujú".
Úloha 5.2
Vráť masku späť a over, že čítanie znova funguje:
setfacl -m m::rw- ~/projekt/navrh.txt
sudo -u tester cat ~/projekt/navrh.txt
Krok 6: Uzavri vzdialený prístup
Upozornenie: Od tejto chvíle platí poradie. Najprv over kľúč, potom zakáž heslá. Opačne sa zamkneš vonku.
Najprv si vytvor kľúč a nahraj ho. Kľúč vytvor na hostiteľskom počítači, nie vo virtuálke:
ssh-keygen -t ed25519 -C "virtualka-os"
ssh-copy-id -p 22 tvoj_ucet@adresa_virtualky
Úloha 6.1
Over, že prihlásenie kľúčom funguje — prihlás sa a už sa ťa nemá na nič pýtať. Toto musí prejsť, kým pokračuješ ďalej.
Teraz uprav nastavenie služby vzdialeného prístupu:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.zaloha
sudo nano /etc/ssh/sshd_config
Nastav tieto tri položky:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Over syntax a až potom službu znovunačítaj:
sudo sshd -t
sudo systemctl reload ssh
Úloha 6.2
V druhom, stále otvorenom spojení si teraz vyskúšaj tri veci a zapíš výsledky. Prihlásenie kľúčom. Prihlásenie heslom. Prihlásenie ako root.
ssh tvoj_ucet@adresa_virtualky
ssh -o PubkeyAuthentication=no tvoj_ucet@adresa_virtualky
ssh root@adresa_virtualky
Poznámka: Prvé má prejsť, druhé a tretie majú byť odmietnuté. Neúspech je tu výsledok, ktorý chceš. A všimni si, že si použil
reload, nierestart— prebiehajúce spojenia sa tým neprerušia.
Krok 7: Postav firewall a over ho zvonka
Pravidlá nastav v tomto poradí. Povolenie vzdialeného prístupu je pred zapnutím.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status verbose
Upozornenie: Keby si zapol firewall skôr, než povolíš port 22, odstrihne ťa to v tej istej sekunde. Preto je povolenie prvé.
Úloha 7.1
Porovnaj dva pohľady na ten istý systém. Zvnútra si vypíš, čo počúva, a zvonka z hostiteľa skús, čo je naozaj dostupné.
# vo virtualke
sudo ss -tulpn
# na hostitelskom pocitaci
nc -zv adresa_virtualky 22
nc -zv adresa_virtualky 80
Úloha 7.2
Zapíš si, či sa niektorý port javí vnútri ako počúvajúci, a pritom zvonka nedostupný. Vysvetli si, prečo to tak je.
Poznámka: Toto je dôvod, prečo sa výsledok hardeningu overuje z iného stroja. Pohľad zvnútra ukáže aj to, čo firewall zvonka nikdy neprepustí.
Záver
Čo budeš mať po tomto cvičení pripravené pre mentora:
- Obsah svojho súboru s pravidlom sudo a výpis toho, čo testovací účet smie.
- Zoznam piatich vyskúšaných príkazov s tým, ktoré prešli a ktoré boli odmietnuté.
- Jeden riadok zo systémového záznamu o použití sudo.
- Výpis prístupového zoznamu pred zmenou práv a po nej, s oboma hodnotami masky.
- Výsledky troch pokusov o prihlásenie po uzavretí vzdialeného prístupu.
- Výpis stavu firewallu a porovnanie pohľadu zvnútra a zvonka.
A odpovede na tieto otázky:
- Prečo si pravidlo sudo zapísal do samostatného súboru a nie do hlavného?
- Výnimka v prístupovom zoznamu zostala zapísaná, a prestala sa uplatňovať. Prečo?
- Prečo sa pri zmene nastavenia vzdialeného prístupu použije znovunačítanie a nie reštart?
- Prečo nestačí overiť hardening zvnútra systému?
Doplňujúce úlohy
Úloha A.1
Nastav na adresári predvolený prístupový zoznam tak, aby každý nový súbor v ňom automaticky dostal výnimku pre testovacieho používateľa. Potom v tom adresári vytvor nový súbor a over, že výnimku naozaj zdedil.
Úloha A.2
Nájdi v systéme program, ktorý má nastavený bit setuid, a zisti príkazom
getcap, či niektorý program namiesto toho používa pridelené schopnosti.
Porovnaj, ktorý z tých dvoch prístupov dáva programu menej práv.