Wprowadzenie
Świeżo zainstalowany serwer Linux — niezależnie czy to Debian, Ubuntu czy Rocky Linux — nie jest gotowy na środowisko produkcyjne. Domyślna konfiguracja jest zoptymalizowana pod wygodę użytkownika, nie pod bezpieczeństwo. W tym artykule znajdziesz kompletną checklistę hardeningu, którą stosujemy przy każdym nowym serwerze.
1. Aktualizacja systemu
Pierwsza rzecz po instalacji — pełna aktualizacja pakietów.
# Debian / Ubuntu
apt update && apt upgrade -y && apt autoremove -y
# RHEL / Rocky Linux / AlmaLinux
dnf update -y && dnf autoremove -y
Ustaw automatyczne aktualizacje bezpieczeństwa:
# Debian / Ubuntu
apt install unattended-upgrades -y
dpkg-reconfigure --priority=low unattended-upgrades
# RHEL / Rocky
dnf install dnf-automatic -y
systemctl enable --now dnf-automatic-install.timer
2. Konfiguracja SSH
SSH to najczęściej atakowany punkt wejścia. Poniższe zmiany w /etc/ssh/sshd_config eliminują większość typowych ataków.
nano /etc/ssh/sshd_config
Kluczowe ustawienia:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
Port 2222
AllowUsers deploy admin
MaxAuthTries 3
MaxSessions 5
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2
PermitEmptyPasswords no
Zrestartuj SSH i przetestuj połączenie przed zamknięciem obecnej sesji:
sshd -t
systemctl restart sshd
3. Firewall (nftables / ufw / firewalld)
Ubuntu / Debian — UFW
apt install ufw -y
ufw default deny incoming
ufw default allow outgoing
ufw allow 2222/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
ufw status verbose
RHEL / Rocky — firewalld
systemctl enable --now firewalld
firewall-cmd --set-default-zone=drop
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
4. Fail2Ban — ochrona przed brute-force
apt install fail2ban -y
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Konfiguracja dla SSH:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
backend = systemd
[sshd]
enabled = true
port = 2222
logpath = %(sshd_log)s
maxretry = 3
systemctl enable --now fail2ban
fail2ban-client status sshd
5. Polityki haseł i konta użytkowników
userdel games
userdel news
passwd -l root
apt install libpam-pwquality -y
# /etc/security/pwquality.conf
minlen = 14
dcredit = -1
ucredit = -1
lcredit = -1
ocredit = -1
dictcheck = 1
# /etc/login.defs
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 14
6. SELinux / AppArmor
SELinux (RHEL / Rocky Linux)
sestatus
setenforce 1
sed -i 's/SELINUX=permissive/SELINUX=enforcing/' /etc/selinux/config
ausearch -m avc -ts recent
AppArmor (Ubuntu / Debian)
apt install apparmor apparmor-utils -y
systemctl enable --now apparmor
aa-status
aa-enforce /etc/apparmor.d/usr.sbin.nginx
7. Audyt systemu — auditd
apt install auditd audispd-plugins -y
systemctl enable --now auditd
Reguły audytu (/etc/audit/rules.d/hardening.rules):
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/ssh/sshd_config -p wa -k ssh_config
-a always,exit -F arch=b64 -S open -F exit=-EACCES -k access_denied
8. Parametry sysctl dla kernela
# /etc/sysctl.d/99-hardening.conf
net.ipv4.ip_forward = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.log_martians = 1
fs.suid_dumpable = 0
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
sysctl --system
Checklista — szybkie podsumowanie
| # | Zadanie | Priorytet |
|---|---|---|
| 1 | Aktualizacja systemu + auto-updates | Krytyczny |
| 2 | Wyłącz logowanie root przez SSH | Krytyczny |
| 3 | Uwierzytelnianie tylko kluczem SSH | Krytyczny |
| 4 | Zmień port SSH | Wysoki |
| 5 | Skonfiguruj firewall (deny all + whitelist) | Krytyczny |
| 6 | Zainstaluj i skonfiguruj Fail2Ban | Wysoki |
| 7 | Polityki haseł i wygasanie | Wysoki |
| 8 | SELinux/AppArmor w trybie enforce | Wysoki |
| 9 | Włącz auditd z regułami | Średni |
| 10 | Parametry sysctl dla sieci i kernela | Wysoki |
Podsumowanie
Hardening to nie jednorazowa akcja — to proces. Powyższe kroki stanowią solidną bazę dla każdego serwera produkcyjnego. W kolejnych artykułach pokażemy jak zautomatyzować ten proces z Ansible i jak monitorować serwer pod kątem anomalii za pomocą Falco i Grafana Loki.