Karol Szafrański

Twierdza Linux.

Bezpieczeństwo dla dociekliwych

Naucz się, jak zamienić swój system w Twierdzę Linux

Rozmowy Maćka Szymczaka z Karolem Szafrańskim nt. Twierdzy Linux...

O książce

[Autor] omawia najistotniejsze obszary z perspektywy administratora/właściciela środowiska, systemu, aplikacji w XXI wieku, w którym system Linux – mimo iż często niewidoczny – występuje praktycznie w każdej infrastrukturze produkcyjnej.

Twierdza… pozwala zrozumieć cały ekosystem, często w ujęciu niezwykle szczegółowym lub punktowo, skupiając się na istotności danej zmien­nej konfiguracyjnej w bardzo specyficznym kontekście.

[…] jeśli jesteś na początku przygody z Linuksem, przeczytaj tę książkę nie raz i nie dwa. Przeczytaj ją wie­lokrotnie, wracając do rozdziałów, które interesują Cię najbardziej. Jestem prze­konany, że rozległa wiedza Autora, ciekawe komentarze i historie z życia wzięte, częste skupianie uwagi na drobnych szczegółach sprawią, że zarazisz się tytułową dociekliwością. Bo generalnie o skupienie się na szczegółach tutaj chodzi. 

Leszek Miś, ze Wstępu

13 rozdziałów, Słownik, spis tabel i rysunków, 540 stron, druk w kolorze

Fragment książki

Spis treści

Pobierz 

Wstęp

Pobierz 

Rozdział 5. Powłoka i GUI – jak pracować bezpiecznie

Pobierz 

Spis treści

Co to jest [GNU/]Linux?
Nazewnictwo w książce
Bezpieczeństwo systemu: co to właściwie znaczy?
Po co zabezpieczenia?
Atak na system linuksowy z lotu ptaka
Przed kim się bronimy?
Reguły postępowania w zabezpieczaniu systemów
Ciągły proces, nie jednorazowe działanie
Model F/LOSS a bezpieczeństwo
Po co te wszystkie aktualizacje?
Okres wsparcia dystrybucji
Wersja dystrybucji a wersja jądra
Samodzielna kompilacja jądra
Aktualizowanie jądra w locie: livepatching
Różne źródła programów i ich wpływ na bezpieczeństwo
Pakiety .deb/.rpm i mechanizm repozytoriów APT/RPM
DNF: szczegóły konfiguracji
APT: szczegóły konfiguracji
Repozytoria inne niż bazowe
Serwery lustrzane
Bezpieczeństwo pojedynczych pakietów
Jak przeanalizować zawartość pliku .deb lub .rpm
Weryfikacja pochodzenia i spójności plików zainstalowanych z pakietów
Pochodzenie plików i mechanizm alternatyw
Jak skutecznie ustalić listę zainstalowanych pakietów?
Aktualizacje automatyczne dla „małych i prostych” systemów
Mechanizmy Snap i Flatpak
Dystrybucje typu niezmiennego (immutable/atomic)
Deklaratywne (functional) menedżery pakietów: Nix i Guix
Bezpieczeństwo oprogramowania z innych źródeł
Pojedyncze pliki binarne (np. AppImage), binarne instalatory, skrypty instalacyjne
Programy kompilowane ze źródeł
Menedżery pakietów/bibliotek specyficzne dla języków programowania
Docker i inne mechanizmy konteneryzacji
Serwery aplikacji dla Javy, Pythona i innych oraz pozostałe aplikacje serwerowe
Wtyczki, dodatki, rozszerzenia
Pliki konfiguracyjne środowiska i bibliotek
Kiedy restart po aktualizacji jest konieczny?
Co należy odinstalować?
Ataki na łańcuch dostaw (supply chain attacks)
Checklista: źródła i aktualność oprogramowania
Linuksowy model uprawnień – przypomnienie
Uprawnienia w praktyce: przykłady i problemy
„Ślepe przejście” przez katalog
Pliki wykonywalne a setuid (u+s) i setgid (g+s)
Uprawnienia nowo tworzonych plików: umask, setgid na katalogu
Czy można kasować cudze pliki? Czyli o sticky bit
Nadawanie uprawnień, zmiana właściciela – czy rozumiesz, co robisz?
Mechanizm ACL: listy kontroli dostępu
Użytkownicy i grupy
Systemowa baza kont
Zarządzanie kontami: kwestie praktyczne
Zawartość katalogu domowego nowo tworzonego użytkownika
Imię i nazwisko użytkownika lub pełna nazwa usługi
Okresy ważności kont
Powłoka konta
Członkostwo w grupach
Grupy dające podwyższone uprawnienia
Konta usług/systemowe
Usuwanie kont a właścicielstwo plików
Limity zasobów użytkowników
Sudo i su
Pozornie bezpieczne: sudo a funkcjonalność narzędzi
Pozornie bezpieczne: symbole wieloznaczne w regułach
Program su
Inne narzędzia służące do wykonywania poleceń z podniesionymi uprawnieniami
Atrybuty (lsattr, chattr)
Capabilities
Nadawanie capabilities wybranym użytkownikom za pomocą PAM
PAM – moduły uwierzytelnienia
Wywołania modułów
Przykład: wzmocnienie wymagań dla haseł
Przykład: uwierzytelnianie kluczami a przeterminowane hasła
Ograniczenie uruchamiania aplikacji: fapolicyd
Checklista: konta i uprawnienia
Czym jest SSH
Po pierwsze: protokół bezpiecznej komunikacji
Po drugie: protokoły aplikacyjne zaimplementowane jako część SSH
Implementacje serwera
Implementacje klienta
Jak nawiązywane jest bezpieczne połączenie SSH klient–serwer
Konfiguracja i zabezpieczenie serwera
Port 22 czy inny?
Protokoły szyfrowania i klucze serwera
Zaufanie do klucza serwera, atak MiTM, rekordy DNS SSHFP
Ograniczanie uprawnień kont i grup
Blokada/zezwolenie na logowanie kont i grup
Selektywne ograniczanie uprawnień kont i grup
Konta przeznaczone tylko do transferu plików (SFTP-only)
Ochrona przed atakami DDoS i brute-force
Tunele (forwardowanie połączeń)
Wyłączenie logowania hasłem dla konta root
Inne istotne ustawienia serwera
Konfiguracja innych mechanizmów systemu a SSH
SSH po stronie klienta
Konfiguracja klienta OpenSSH
Generowanie pary kluczy klienta na potrzeby uwierzytelnienia
Logowanie kluczami
Plik authorized_keys
Agent SSH
Tunelowanie połączeń do agenta SSH, czyli jak pracować wygodnie
i nadal trzymać klucze przy sobie
Ilu kluczy potrzebuje jedna osoba?
Czy model działania agenta SSH jest bezpieczny?
Agent w trybie potwierdzania, czyli kontrola zamiast wygody
PuTTY i WinSCP a klucze i agent
MFA i klucze sprzętowe
Checklisty: SSH
Serwer
Klient
BHPS: bezpieczeństwo i higiena powłoki oraz skryptów
W jakim języku rozmawiamy?
Co ja właściwie uruchamiam?
Używaj cudzysłowów, waliduj wejście
O filozofii porównań i naturze nawiasu
Zmienne – bezpieczniej
Włączanie zawartości z zewnętrznych plików
Sekrety na widoku
Nie przeszkadzać sąsiadom, nie zostawiać po sobie śmieci
Znaleźć i nie zgubić: find, -exec oraz xargs
Jeszcze raz: nie zostawiać po sobie śmieci
Od A do… czego?
Debugging skryptów
Hardening skryptów – przydatne opcje
Praca interaktywna w powłoce: porady
Wygoda i ergonomia środowiska
Wstydliwa historia
Jak szybko i prosto uruchomić malware… przez przypadek
Procesy i sesje w tle a blokowanie sesji terminalowej
Konsola współdzielona przez Internet
Co może pójść nie tak przy pracy w środowisku graficznym
GUI a dostęp zdalny do systemu
Linux dla całej rodziny
Czy mój system mnie śledzi?
Co i dlaczego działa w systemie?
Lista procesów
Spis usług
Otwarte porty i nasłuchujące procesy
Systemd i jego jednostki (unity) konfiguracyjne
Jak całkowicie zablokować start usługi bez jej odinstalowywania
Checklista: bezpieczna konfiguracja usługi – zasady ogólne
Checklista: przegląd systemu pod kątem zainstalowanych i działających usług
Checklisty i porady dla poszczególnych typów usług
Ustawienie i synchronizacja czasu (NTP)
Poczta: lokalne SMTP
Automatyczne uruchamianie zadań
Cron
atd
Timery mechanizmu systemd
Serwery WWW
PHP na serwerze WWW
Load balancery i reverse proxy
Java i jej serwery aplikacyjne (Tomcat, JBoss i inne)
Bazy danych (MySQL/MariaDB, PostgreSQL)
Bazy NoSQL (np. Redis, MongoDB)
Wirtualizacja
Konteneryzacja
Systemy kopii zapasowych i monitoringu infrastruktury
Usługi zarządzania zdalnego
FTP
rsyncd
Network File System (NFS) i usługi towarzyszące
Usługi druku: CUPS i LPD
inetd i xinetd, proces init (systemd) nasłuchujący na TCP/UDP
Baza plików locate
Środowisko graficzne i Polkit (PolicyKit)
Hardening usług z poziomu systemd
Poprawna edycja i tworzenie jednostek .service
Jak ograniczyć usługę i jej środowisko wykonawcze
Jądro, przestrzeń użytkownika i wywołania systemowe
Moduły jądra
Konfiguracja jądra i modułów
Bezpieczeństwo ładowania i konfiguracji modułów
Ustawienia sysctl istotne dla bezpieczeństwa
Moduły zabezpieczeń LSM (Linux Security Modules)
Yama: ograniczenie debugowania (ptrace)
Landlock
Kernel lockdown mode
eBPF: extended Berkeley Packet Filter
Inspekcja działających programów eBPF
Prosty przykład zabezpieczania istniejących usług
Mechanizmy izolacji aplikacji (sandboxing)
Control groups (cgroups)
Przestrzenie nazw (namespaces)
Secure computing (seccomp i seccomp-bpf)
Historycznie: chroot
Jak tego użyć, czyli izolacja aplikacji w praktyce
Mechanizm ulimit
Fork-bomba w powłoce: jak się zabezpieczyć
Słowo o tworzeniu i pakowaniu aplikacji
Ochrona przed zapełnieniem systemu plików
Ukrywanie procesów i ochrona systemu plików /proc
Utwardzanie jądra: czy można zrobić jeszcze więcej?
LKRG: Linux Kernel Runtime Guard
Checklista: bezpieczeństwo jądra
SELinux
Koncepcja SELinux z lotu ptaka
Tryby działania i podstawowe polityki
Włączanie, wyłączanie i zmiana trybu pracy SELinux
Etykiety (konteksty) zasobów
Źródło, cel, domena
Przełączniki (booleans)
W praktyce: konfiguracja i rozwiązywanie typowych problemów
Podręcznik systemowy
Jak czytać logi
Konteksty (etykiety) plików – przykład 1
Konteksty (etykiety) plików – przykład 2
„Samoistna” zmiana kontekstów plików: autorelabel i restorecond
Konteksty (etykiety) portów – przykład
Dostosowanie polityki do potrzeb: audit2allow
Selektywne luzowanie restrykcji: permissive domains
Reguły dontaudit, czyli czego nie widać w logach
SELinux a wirtualizacja i konteneryzacja: użycie MCS w praktyce
Jak bezpiecznie wrócić do trybu enforcing, jeśli SELinux jest wyłączony
Polityka dla nowej aplikacji: od czego zacząć
Źródła wiedzy
AppArmor
Koncepcja
Profile
Tryby profili
W praktyce
Logi zdarzeń
Konstrukcja profili
Diagnostyka, przełączanie trybu profilu
Samodzielne tworzenie profili
Podprofile, czyli kapelusze (hats)
Ochrona mechanizmów wirtualizacji i konteneryzacji
Czy można to obejść?
Gdzie szukać pomocy
Co powinna robić zapora?
Przykładowy zestaw reguł firewalla
Stateful kontra stateless
Połączenia wychodzące: zezwalać czy blokować?
Dwa słowa o blokowaniu ruchu ICMP
Firewall na Linuksie, czyli co?
iptables (czyli netfilter)
nftables (czyli… netfilter wiele lat później)
eBPF w roli narzędzia do filtrowania i kształtowania ruchu
Nakładki ułatwiające zarządzanie zaporą
firewalld (firewall-cmd, firewall-config)
(Pseudo)usługa nftables i jej starsze rodzeństwo
Generatory reguł (nakładki)
Skrypty tworzone ręcznie
Specjalizowane dystrybucje sieciowe
System otwarty na przestrzał: od czego zacząć?
TCP wrappers: pliki hosts.deny i hosts.allow
Blokowanie dużej liczby adresów IP lub podsieci
Automatyczne blokowanie ataków brute-force
Fail2ban
sshguard
Zapora w praktyce: porady i sugestie
Co dalej?
Checklista: konfiguracja firewalla
Proces uruchamiania systemu i jego słabe punkty
Serwis niekoniecznie sprzątający, czyli co może napastnik z fizycznym dostępem
Weryfikacja integralności systemu i mechanizm Secure Boot
Secure Boot w środowisku linuksowym
Łańcuch zaufania na Linuksie
Dziury w boocie
Krok dalej: atestacja, zdalna weryfikacja integralności
Kontrowersje wokół Secure Boot i podobnych rozwiązań
Alternatywna droga: otwartoźródłowy lub własny firmware
Linux a oprogramowanie sprzętowe
Linux Vendor Firmware Service (LVFS) i fwupd
Edycja ustawień i analiza zabezpieczeń
Aktualizacje mikrokodu CPU, odporność na ataki Spectre/Meltdown
Układ partycji, systemy plików, opcje montowania
Parametry montowania a bezpieczeństwo
Bezpieczniejsze montowanie dysków przenośnych
Obszar wymiany w pliku
Szyfrowanie dysków
Wstęp: LUKS – jak to działa
Nagłówek LUKS i sloty
W praktyce: Tworzenie i obsługa szyfrowanych woluminów
Plik /etc/crypttab i automatyczne montowanie urządzeń LUKS przy starcie
Hasło w postaci pliku-klucza (keyfile)
Zmiana hasła (i niektórych parametrów slotu)
FDE – pełne szyfrowanie dysku podczas instalacji
Dla zaawansowanych: Czy można schować /boot wewnątrz LUKS?
Integracje dla nielubiących haseł: TPM2, FIDO2, sieciowy serwer kluczy
Klucze sprzętowe i systemd-cryptenroll
Clevis: TPM, SSS, Tang i NBDE
Co jeszcze potrafi cryptsetup
Co może pójść nie tak
Podstawy: bezpieczne hasła, klucze, nagłówki
Wydobycie klucza woluminu z RAM, czyli atak cold boot
Kradzież kluczy z TPM
Atak z użyciem DMA
Fizyczna napaść podczas pracy
Jeśli nie FDE, to co?
Bezpieczne usuwanie danych
Dyski SSD a nadpisywanie danych
Wymazywanie dysku za pomocą funkcji firmware
Ile razy zamazywać?
Blokowanie nieautoryzowanych urządzeń
Filtrowanie USB z użyciem USBGuard
Jak zaplanować i wykonać bezpieczną instalację systemu
Nośniki instalacyjne i obrazy bazowe systemu
Weryfikacja podpisu ISO instalacyjnego
Obrazy bazowe i pliki odpowiedzi dla instalatora
Profile bezpieczeństwa (CIS, STIG, FIPS)
Checklisty
Komputer fizyczny (desktop, laptop, serwer)
Maszyna wirtualna, instancja w chmurze
GRUB na x86 i start kernela
Urządzenia specjalizowane (router, SmartTV, odkurzacz) i IoT
Dwa osobiste apele autora
Apel do producentów i dostawców urządzeń
Apel do kupujących urządzenia
Logi systemowe i aplikacji na Linuksie
Mechanizm syslog
Następca sysloga: journald
Wysyłka logów na zdalny serwer
Archiwizowanie (rotacja) logów
Narzędzia do procesowania logów
Mechanizm audytowy i usługa auditd
Konfiguracja reguł audytu
Reguły monitorowania plików
Reguły monitorujące wywołania systemowe
Reguły/opcje sterujące działaniem mechanizmu audytowego
Przegląd i analiza zdarzeń audytowych
Monitoring bezpieczeństwa bez SIEM
Klasyczny monitoring IT w służbie bezpieczeństwa
AIDE: proste narzędzie klasy HIDS
Wykrywanie złośliwego oprogramowania
Zewnętrzne usługi wspomagające
Mam SIEM/EDR/XYZ: co powinien wykrywać?
Jak przetestować zabezpieczenia systemu
Rejestrowanie aktywności użytkowników
Analiza konfiguracji i utrzymanie standardów
Narzędzia automatyzujące audyt konfiguracji
Standaryzacja zabezpieczeń: CIS, STIG i OpenSCAP
Zarządzanie większym środowiskiem
Checklista
Opowieści z pamiętnika i notatnika
Młody i naiwny
Jak webserwer swoim własnym interfejsem ethernetowym został
All your localhost are belong to us
NoSQL czy NoSqurity?
Ransomware
Log4Shell, czyli tysiąc małych trzęsień ziemi
XZ – jedno trzęsienie ziemi o przeciętnej magnitudzie
Wyciek
Przegląd linuksowego malware’u
Incydent bezpieczeństwa: co robić, gdy przytrafi się mnie?
Zabezpieczenie dowodów incydentu w systemie linuksowym
Użytkownicy też ludzie
IT i security: też ludzie
Wolne i otwartoźródłowe oprogramowanie tworzą ludzie
Bądź dla siebie człowiekiem
Spis tabel
Spis rysunków
Zasoby internetowe
Bieżące newsy
Dokumentacja i przewodniki
Inne warte polecenia źródła wiedzy
Bibliografia

Dla kogo...

Dla zainteresowanych Linuksem, którzy, choćby od niedawna, administrują systemami i sieciami, używają Linuksa jako systemu na swojej stacji roboczej i chcą to robić bezpieczniej.

Dla zawodowo zajmujących się bezpieczeństwem systemów: pracujących w linii obrony przed atakiem (np. w ramach zespołu SOC czy CSIRT), wykonujących testy penetracyjne, zarządzających podatnościami, decydujących o kształcie polityk bezpieczeństwa.

Dla tworzących, testujących lub wydających aplikacje działające w środowisku Linux (serwerowe, desktopowe, webowe, IoT...).

Dla projektantów urządzeń i systemów wbudowanych bazujących na Linuksie.

Dla czytających wszystkie książki na temat Linuksa i jego bezpieczeństwa, bo nigdy nie dość wiedzy o bezpieczeństwie.

Poznaj autora

Karol Szafrański

Inżynier cyberbezpieczeństwa o sercu admina. Ma kilkunastoletnie doświadczenie w zabezpieczaniu i codziennym utrzymaniu systemów: od małych sieci i firm po globalne banki, duże klastry i chmury.

Entuzjasta wolnego i otwartego oprogramowania – gdyby tylko mógł, zainstalowałby Linuksa na wszystkim, co ma procesor.

Doświadczony trener – najchętniej uczy tego, co zna i lubi: administracji i bezpieczeństwa systemów spod znaku pingwina. Prelegent na MSHP i Security BSides Warsaw.

Lubi filmy dokumentalne, ciekawi go psychologia, historia najnowsza i inwestowanie pasywne.

Top