Wzmacnianie bezpieczeństwa Linuksa: praktyczna lista kontrolna
Domyślna instalacja Linuksa nie jest gotowa na produkcję. Przejdź krok po kroku przez zabezpieczenie SSH, konfigurację zapory, automatyczne aktualizacje i kontrolę uprawnień użytkowników.
Spis treści
- Dlaczego domyślne instalacje są niebezpieczne
- Wzmacnianie kont użytkowników i uwierzytelniania
- Wyłącz logowanie jako root i używaj sudo
- Wymuszaj silne zasady haseł
- Blokuj nieużywane konta
- Zabezpieczanie SSH
- Konfiguracja zapory
- Aktualizacje systemu i zarządzanie pakietami
- Wyłączanie zbędnych usług
- Bezpieczeństwo systemu plików
- Wykrywanie włamań i monitoring
- Wzmacnianie jądra przez sysctl
Dlaczego domyślne instalacje są niebezpieczne
Świeżo zainstalowany serwer z Linuksem ma ustawienia domyślne zoptymalizowane pod kątem szerokiej zgodności i łatwości konfiguracji — a nie bezpieczeństwa. Mogą działać usługi, których nie potrzebujesz, SSH akceptuje logowanie hasłem (podatne na ataki siłowe), zapora może być zbyt liberalna lub wyłączona, a konta użytkowników mogą mieć nadmierne uprawnienia. Wzmacnianie zabezpieczeń (hardening) to proces systematycznego zmniejszania powierzchni ataku do faktycznych potrzeb.
Ta lista kontrolna dotyczy rodzin Debian/Ubuntu i RHEL/CentOS, ale jej zasady mają zastosowanie uniwersalne.
Wzmacnianie kont użytkowników i uwierzytelniania
Wyłącz logowanie jako root i używaj sudo
Nigdy nie loguj się bezpośrednio jako root. Utwórz osobnego użytkownika administracyjnego i nadaj mu uprawnienia sudo:
adduser adminuser
usermod -aG sudo adminuser # Debian/Ubuntu
usermod -aG wheel adminuser # RHEL/CentOS
Wyłącz logowanie roota przez SSH w pliku /etc/ssh/sshd_config: ustaw PermitRootLogin no.
Wymuszaj silne zasady haseł
Zainstaluj libpam-pwquality (Debian) lub pam_pwquality (RHEL) i skonfiguruj minimalną długość, wymogi złożoności oraz historię haseł w /etc/security/pwquality.conf. Ustaw okres ważności haseł w /etc/login.defs: PASS_MAX_DAYS 90, PASS_MIN_DAYS 1, PASS_WARN_AGE 14.
Blokuj nieużywane konta
passwd -l username # Lock an account
chage -E 0 username # Expire immediately
Pierwsze polecenie blokuje konto, drugie natychmiast je unieważnia. Sprawdź konta bez hasła lub z dostępem do powłoki, który nie powinien im przysługiwać (grep -v 'nologin\|false' /etc/passwd).
Zabezpieczanie SSH
SSH to najczęstszy wektor zdalnego dostępu. Wzmocnij konfigurację w /etc/ssh/sshd_config:
Port 2222 # Non-default port reduces automated scans
PermitRootLogin no
PasswordAuthentication no # Key-based auth only
PubkeyAuthentication yes
AllowUsers adminuser # Whitelist specific users
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
X11Forwarding no
AllowTcpForwarding no # Unless needed
Protocol 2
Niestandardowy port ogranicza automatyczne skanowanie, logowanie odbywa się wyłącznie kluczem, a dostęp mają tylko wskazani użytkownicy. Po zmianie portu zaktualizuj reguły zapory, zanim zrestartujesz sshd. Poleceniem sshd -t sprawdź konfigurację pod kątem błędów składni.
Do generowania kluczy wybieraj Ed25519 zamiast RSA 2048:
ssh-keygen -t ed25519 -C "admin@server"
Konfiguracja zapory
UFW (Ubuntu/Debian)
ufw default deny incoming
ufw default allow outgoing
ufw allow 2222/tcp # Your SSH port
ufw allow 443/tcp # HTTPS if web server
ufw enable
ufw status verbose
firewalld (RHEL/CentOS)
firewall-cmd --set-default-zone=drop
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload
Na nowoczesnych jądrach używaj bezpośrednio nftables, aby uzyskać maksymalną kontrolę i wydajność. Stosuj zasadę domyślnej odmowy — zezwalaj tylko na to, co jest jawnie potrzebne.
Aktualizacje systemu i zarządzanie pakietami
Utrzymuj system załatany. Niezałatane podatności to — zaraz po atakach na dane logowania — najczęstsza droga początkowego dostępu:
# Debian/Ubuntu — enable unattended security upgrades
apt install unattended-upgrades
dpkg-reconfigure unattended-upgrades
# RHEL/CentOS — enable automatic updates
dnf install dnf-automatic
systemctl enable --now dnf-automatic.timer
Usuń niepotrzebne pakiety: apt purge telnet rsh-server ypserv xinetd. Każdy zainstalowany pakiet to potencjalna podatność.
Wyłączanie zbędnych usług
Wyświetl wszystkie działające usługi i wyłącz te, z których nie korzystasz:
systemctl list-units --type=service --state=running
systemctl disable --now servicename
Typowi kandydaci do usunięcia na serwerze WWW: avahi-daemon, cups, bluetooth, rpcbind. Każdy otwarty port to potencjalny punkt wejścia.
Bezpieczeństwo systemu plików
- Ustaw bit sticky na katalogach zapisywalnych dla wszystkich:
chmod +t /tmp - Używaj opcji montowania
noexec,nosuid,nodevdla/tmp,/var/tmpi nośników wymiennych w/etc/fstab - Przejrzyj pliki z bitem SUID/SGID:
find / -perm /6000 -type f 2>/dev/null— usuń bit wszędzie, gdzie nie jest wymagany - Ogranicz uprawnienia do
/etc/cron*:chmod 700 /etc/cron.d /etc/cron.daily
Wykrywanie włamań i monitoring
- Fail2ban: automatycznie blokuje adresy IP z powtarzającymi się nieudanymi logowaniami — niezbędny przy każdym SSH dostępnym z internetu
- auditd: logowanie na poziomie jądra wywołań systemowych, dostępu do plików i poleceń użytkowników — dostarcza bogatych danych do SIEM
- AIDE (Advanced Intrusion Detection Environment): tworzy kryptograficzną bazę skrótów plików w znanym, dobrym stanie i alarmuje o zmianach
- Logwatch lub GoAccess: regularne podsumowania logów wysyłane e-mailem
Od razu przesyłaj logi na zdalny serwer syslog lub do SIEM — jeśli atakujący zdobędzie uprawnienia roota, wyczyści logi lokalne.
Wzmacnianie jądra przez sysctl
Dodaj do /etc/sysctl.d/99-hardening.conf:
net.ipv4.ip_forward = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.tcp_syncookies = 1
kernel.randomize_va_space = 2
kernel.dmesg_restrict = 1
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
Zastosuj poleceniem sysctl --system. Te ustawienia wyłączają przekazywanie IP, chronią przed atakami z przekierowaniami ICMP, włączają ochronę SYN cookies i wymuszają ASLR.