# Zabezpečení serveru

Základní opatření, která mají skutečný efekt, a poznámka o těch, která ho nemají.

Předpoklad je, že máš vyřešený [firewall](Linux-firewall) — bez toho zbytek nedává smysl.

## SSH

Zdaleka nejdůležitější položka, protože je to jediná cesta dovnitř.

Tady je nutné minimum. Protokol, certifikáty, tunely, hardwarové klíče a omezení v `authorized_keys` jsou v [SSH do hloubky](SSH).

### Klíče místo hesel

```bash
# na klientovi
ssh-keygen -t ed25519 -C "martin@notebook"
ssh-copy-id -i ~/.ssh/id_ed25519.pub server
```

`ed25519` je dnes výchozí volba. RSA jen tam, kde protistrana neumí nic novějšího, a pak minimálně 4096 bitů.

**Ověř si, že se přihlásíš klíčem, než vypneš hesla.** Otevři si druhé SSH spojení a nech ho běžet, dokud si nejsi jistý.

### Konfigurace

`/etc/ssh/sshd_config.d/99-vlastni.conf`:

```
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
PubkeyAuthentication yes

AllowUsers martin

ClientAliveInterval 300
ClientAliveCountMax 2
MaxAuthTries 3
```

```bash
sshd -t                     # kontrola syntaxe
systemctl reload sshd
```

`PasswordAuthentication no` je jediné opatření, které z devadesáti procent řeší problém hrubé síly. Bez hesel nemá útočník co zkoušet.

`AllowUsers` je podceňovaná drobnost — omezí přihlášení na konkrétní účty bez ohledu na to, kolik jich na stroji je.

### Změna portu

```
Port 2222
```

Neposkytuje skutečnou bezpečnost. Kdo tě cíleně skenuje, port najde za pár vteřin.

Radikálně ale zmenší množství záznamů v logu, protože plošné skenování jde na port 22. To má hodnotu samo o sobě: v čistém logu si všimneš skutečného pokusu.

### Nejlepší varianta

Nevystavovat SSH do internetu vůbec a chodit přes [WireGuard](WireGuard). Když se dá, dělej to takhle.

Druhá nejlepší je klíč, který se nedá zkopírovat — FIDO2 token s vyžadovaným dotekem. Viz [SSH do hloubky](SSH#hardwarové-klíče).

## Aktualizace

```bash
apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
```

`/etc/apt/apt.conf.d/50unattended-upgrades`:

```
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Mail "ty@example.cz";
```

Bezpečnostní aktualizace automaticky, restart ne. Automatický restart serveru uprostřed noci je způsob, jak se ráno divit.

Restart po aktualizaci jádra ale potřebuješ. `needrestart` ti to připomene:

```bash
apt install needrestart
```

### Kontejnery

`unattended-upgrades` neaktualizuje obrazy v Dockeru. Na to potřebuješ vlastní postup — buď [Watchtower](https://containrrr.dev/watchtower/) pro automatiku, nebo pravidelné ruční:

```bash
docker compose pull && docker compose up -d
```

Automatická aktualizace kontejnerů je dvojsečná: opraví díry, ale taky ti může rozbít funkční službu. U databází ji nedoporučuju vůbec.

## Uživatelé a oprávnění

```bash
adduser martin
usermod -aG sudo martin
passwd -l root          # zamkne přímé přihlášení jako root
```

Pracuj pod běžným účtem, `sudo` používej na jednotlivé příkazy. `sudo -i` na celou relaci jen když opravdu musíš.

### Docker znamená root

Zásadní věc, kterou hodně lidí nezná: **kdo je ve skupině `docker`, je fakticky root.** Může připojit kořenový systém do kontejneru a udělat cokoliv.

```bash
docker run -v /:/host -it alpine chroot /host
```

Přidání uživatele do skupiny `docker` tedy není „drobné zjednodušení", je to udělení plných práv. Kdo to bere vážně, používá rootless Docker nebo Podman.

## Sledování

```bash
journalctl -u ssh -f
lastb | head -20              # neúspěšná přihlášení
last | head -20               # úspěšná
ss -tulpn                     # co poslouchá
```

Ten `lastb` stojí za občasné spuštění. Řekne ti, jestli tě někdo zkouší, a `last` jestli se někomu povedlo.

Pravidelnou ochranu proti hrubé síle řeší [fail2ban](Fail2ban-a-CrowdSec).

## Zmenšování plochy

**Vypni, co nepotřebuješ.** Podívej se na `ss -tulpn` a zeptej se u každé položky, proč tam je.

**Publikuj na loopback.** Všechno, co nemá být veřejné, poslouchá na `127.0.0.1` a ven jde přes [reverse proxy](Reverse-proxy). Pro Docker viz [Docker a firewall](Docker-a-firewall).

**Odděl sítě.** Služby vystavené do internetu dej do vlastní [VLANy](VLANy) s pravidlem, které jim zakazuje iniciovat spojení dovnitř.

**Nesdílej hesla mezi službami.** Správce hesel a náhodné heslo na každou věc.

## Zálohy

Zálohy jsou bezpečnostní opatření, ne provozní. Proti ransomwaru je to jediná skutečná obrana.

Pravidlo 3-2-1: tři kopie, dvě různá média, jedna mimo dům.

Zásadní je **offline nebo neměnná kopie**. Záloha na připojený síťový disk, do kterého má server zapisovací přístup, ti při ransomwaru nepomůže — zašifruje se s tím zbytkem.

Kopie mimo dům musí být **šifrovaná u tebe**, ne až v cíli. Jak na to je v [šifrování disků a souborů](Sifrovani-disku-a-souboru#zálohy).

A hlavně: **zkus obnovu.** Nevyzkoušená záloha je jen naděje.

## Co nepomáhá

Věci, které se doporučují a jejichž přínos je zanedbatelný:

**Skrývání SSID** a **filtrování MAC adres** — viz [WiFi](WiFi).

**Přesun SSH na jiný port** jako jediné opatření — zmenší log, nezastaví útočníka.

**Zakázání ping** — znemožní ti diagnostiku a útočníka nezastaví. V [IPv6](Jak-funguje-IPv6) navíc zablokování ICMPv6 rozbije síť.

**Antivirus na Linuxu** — smysl má na souborovém serveru pro sdílení s Windows, jinak ne.

Čas investovaný do klíčů, aktualizací a záloh má stonásobně větší návratnost.
