Zero Trust Networking: Deny-by-Default (Artikel 312)
Umsetzung einer Zero-Trust-Strategie auf Host-Ebene. Erfahren Sie, wie Sie kompromisslose 'Deny-by-Default' Regelsätze erstellen und auch ausgehenden Datenverkehr strikt kontrollieren.
# Zero Trust Firewalling: Alles verbieten, was nicht explizit erlaubt ist
TL;DR / Management Summary In der modernen Bedrohungslandschaft ist das Vertrauen in das “interne Netz” gefährlich. Wir wenden das Zero Trust Prinzip auf den Linux-Host an: Deny by Default. Nicht nur für eingehende Verbindungen (Ingress), sondern – noch wichtiger – auch für ausgehende Verbindungen (Egress). Wenn ein Webserver gehackt wird, darf er keine Verbindung zu einem Command-and-Control Server aufbauen können. Wir lernen, wie wir dieses strikte Regelwerk ohne Systembruch implementieren.
# 1. Einführung & Architektur
Ingress vs. Egress Filtering.
Die meisten Firewalls blockieren nur von außen nach innen.
- Ingress: Wer darf zu mir? (Standard-Hardening).
- Egress (Kritisch!): Wo darf ich hin? (Verhindert Exfiltration von Daten und Malware-Nachladen).
# Die Zero-Trust Kette (Mermaid)
graph TD
subgraph "The Fortress Host"
A[Application] --> B{Outbound Check}
C[Internet] --> D{Inbound Check}
B -->|Only DNS/Updates| C
B --x|Blocked| E[Hacker C&C]
D -->|Only HTTP/SSH| A
D --x|Blocked| F[The Rest of World]
end
style B fill:#f96,stroke:#333
style D fill:#f96,stroke:#333
# 2. Implementierung: Die strikte Policy
Den Hammer fallen lassen.
In nftables setzen wir die Default-Policy für alle Ketten auf drop.
# Beispiel: /etc/nftables.conf (Hardened)
table inet filter {
# 1. Eingehend: Nur Web & SSH
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
iif lo accept
tcp dport { 80, 443, 22 } accept
}
# 2. Ausgehend: Nur DNS, HTTP (Updates) und NTP
chain output {
type filter hook output priority 0; policy drop;
ct state established,related accept
oif lo accept
# DNS erlauben (UDP/TCP 53)
udp dport 53 accept
tcp dport 53 accept
# Updates erlauben (CDN IPs wären besser, aber Hostnames gehen nicht in nft)
tcp dport { 80, 443 } accept
# Time Sync
udp dport 123 accept
}
}
# 3. Egress-Filtering für Profis
Whitelisting nach IPs.
Da nftables (Kernel) keine Hostnames (z.B. google.com) versteht, müssen wir für Egress-Whitelists oft mit IP-Bereichen arbeiten.
# Beispiel: Nur Zugriff auf die interne Datenbank
# Innerhalb der output chain
ip daddr 10.0.0.50 tcp dport 5432 accept
# 4. Day-2 Operations: Applikations-Profile
Regeln dynamisch erweitern.
In einer Zero-Trust Umgebung muss jede neue Applikation ihre Netzwerk-Anforderungen deklarieren.
- Ansible: Pflegen Sie eine Liste von
allowed_egress_portspro Server-Rolle. - Audit: Nutzen Sie das Logging von abgelehnten Outbound-Paketen, um fehlende Regeln im Staging zu finden.
# 5. Troubleshooting & “War Stories”
Wenn der Server sich selbst einsperrt.
# Story 1: “Der hängende apt-update”
Symptom: apt update oder dnf update funktioniert nicht mehr, obwohl Port 80/443 ausgehend offen sind.
Ursache: Die Mirror-Server nutzen Redirects auf andere IPs oder Ports, oder der DNS-Resolver (systemd-resolved) braucht zusätzlich Port 5353 (mDNS) oder 853 (DoT).
Lösung: Loggen Sie die Drops in der Output-Chain: chain output { ... log prefix "OUT_DROP: " }.
# Story 2: “Ransomware-Stop”
Symptom: Ein Server wurde über eine PHP-Lücke infiziert. Die Malware versucht, den Key zum Verschlüsseln von einem Server in Russland zu laden. Ursache: Die Malware scheitert, weil der Server keine unbekannten IPs im Ausland erreichen darf. Ergebnis: Der Angriff wird gestoppt, bevor der Schaden entsteht. Der Admin wird durch die Firewall-Logs alarmiert.
# 6. Fazit & Empfehlung
- Philosophie: Betrachten Sie jeden Server als potenziell infiziert.
- Egress: Ausgehendes Filtern ist aufwendig, aber der effektivste Schutz gegen Botnetze.
- Reihenfolge: Führen Sie Egress-Filtering erst im
logModus ein, bevor Sie aufdropumstellen.
# Anhang: Cheatsheet
| Aufgabe | Befehl / Syntax |
|---|---|
| Inbound Policy auf Drop | nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; } |
| Outbound Policy auf Drop | nft add chain inet filter output { type filter hook output priority 0 \; policy drop \; } |
| Egress Log | nft add rule inet filter output log prefix "OUT_DROP: " drop |
| IP-Range erlauben | ip daddr 192.168.1.0/24 accept |
| Loopback Pflicht | iif lo accept / oif lo accept |
| Status prüfen | nft list ruleset |
| DNS Test | dig @1.1.1.1 google.com (Prüft Output-Path) |