Erkärungen ystemd-Unit: suricata.service

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Systemd-Unit: suricata.service

Beschreibung

Definiert Suricata als systemd-verwalteten Hintergrunddienst (Inline-IPS via NFQUEUE 0), inklusive Start-Reihenfolge, Reload-/Stop-Verhalten und grundlegender Systemhärtung.

[Unit]
Description=Suricata IPS daemon
After=network.target network-online.target
Requires=network-online.target
Documentation=man:suricata(8) man:suricatasc(8)
Documentation=https://suricata-ids.org/docs/

[Service]
Type=forking
PIDFile=/run/suricata.pid
ExecStart=/usr/bin/suricata -D -q 0 -c /etc/suricata/suricata.yaml --pidfile /run/suricata.pid
ExecReload=/usr/bin/suricatasc -c reload-rules ; /bin/kill -HUP $MAINPID
ExecStop=/usr/bin/suricatasc -c shutdown
Restart=on-failure
ProtectSystem=full
ProtectHome=true

[Install]
WantedBy=multi-user.target

[Unit]

  • Description – Kurzbeschreibung, erscheint u. a. in systemctl status
  • After=network.target network-online.target – Suricata soll erst starten, nachdem das Netzwerk grundsätzlich verfügbar ist (reine Reihenfolge, kein hartes Erfordernis)
  • Requires=network-online.target – im Gegensatz zu After ist dies eine harte Abhängigkeit: ohne funktionierendes Netzwerk wird der Dienst gar nicht erst gestartet (sinnvoll, da NFQUEUE ohne funktionierende Netzwerk-/Firewall-Konfiguration wirkungslos wäre)
  • Documentation – zwei Einträge: Verweis auf die man-Pages sowie die Online-Dokumentation; beide werden bei systemctl status suricata angezeigt

[Service]

Beschreibung

Steuert, wie systemd den Prozess startet, überwacht und beendet.

  • Type=forking – Suricata startet im Vordergrund einen Kindprozess und beendet sich selbst (klassisches Daemon-Verhalten); systemd erwartet daher, dass der eigentliche laufende Prozess über die PIDFile identifiziert wird
  • PIDFile=/run/suricata.pid – Pfad, unter dem Suricata seine PID hinterlegt, damit systemd den korrekten (geforkten) Hauptprozess tracken kann
  • ExecStart – Startbefehl:
    • -D → Daemon-Modus (forken)
    • -q 0 → NFQUEUE-Nummer 0 lesen (korrespondiert mit der nftables-Regel queue num 0 aus der vorherigen Frage)
    • -c /etc/suricata/suricata.yaml → Pfad zur Hauptkonfiguration
    • --pidfile /run/suricata.pid → explizite Angabe des PID-Datei-Pfads
  • ExecReload – wird bei systemctl reload suricata ausgeführt:
    • suricatasc -c reload-rules → lädt die Regeln über das Unix-Command-Socket neu, ohne den Prozess neu zu starten (Verbindungs-/Sitzungsstatus bleibt erhalten)
    • ; kill -HUP $MAINPID → zusätzlich wird ein HUP-Signal an den Hauptprozess gesendet (zwei Reload-Mechanismen kombiniert)
  • ExecStop=/usr/bin/suricatasc -c shutdown – sauberes Herunterfahren über das Command-Socket statt eines einfachen SIGTERM, damit Suricata Puffer/Statistiken ordentlich flushen kann
  • Restart=on-failure – automatischer Neustart nur bei einem Fehler (Absturz, Exit-Code ≠ 0), nicht bei explizitem systemctl stop
  • ProtectSystem=full – systemd-Sandboxing: /usr, /boot und /etc werden read-only in den Dienst-Namespace gemountet (Suricata kann sein System nicht verändern)
  • ProtectHome=true – /home, /root und /run/user werden dem Dienst komplett unzugänglich gemacht (nicht nötig für einen Netzwerk-IDS-Prozess, daher sinnvoll gehärtet)
Hinweis

ProtectSystem und ProtectHome sind einfache, aber wirksame Bausteine zur Angriffsflächenreduktion – falls im Kurs später vertieft auf systemd-Sandboxing eingegangen wird, ließe sich das hier noch erweitern (z. B. NoNewPrivileges=true, PrivateTmp=true, CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW für die minimal nötigen Capabilities statt vollem Root).

[Install]

  • WantedBy=multi-user.target – der Dienst wird beim Booten in den Standard-Multi-User-Runlevel (ohne grafische Oberfläche) eingebunden, aktiviert über systemctl enable suricata