4. týždeň

Týždeň 4 – Cvičenie: Zúž oprávnenia a uzavri systém

Cvičenie

Ciele

  1. Priprav si zálohu, ku ktorej sa vieš vrátiť
  2. Daj používateľovi právo na jednu jedinú vec
  3. Over, že pravidlo naozaj nič iné nedovolí
  4. Nastav výnimku pre jedného človeka cez prístupový zoznam
  5. Nájdi masku, ktorá ti výnimku vypne
  6. Uzavri vzdialený prístup
  7. 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, nie restart — 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.