4 Punkte von GN⁺ 2024-06-24 | 1 Kommentare | Auf WhatsApp teilen

Ziel

  • Nur berechtigte Benutzer sollen Befehle mit root-Rechten ausführen können
  • Keine Privilegieneskalation verwenden

Umsetzung

  • Einen dedizierten SSH-Schlüssel erzeugen und für die root-Authentifizierung verwenden

    mkdir /root/.ssh/
    echo ssh-ed25519 AAAAC3Nza... > /root/.ssh/local_keys
    
  • Eine sshd-Serverinstanz starten, die an ein Unix-Domain-Socket gebunden ist

    mkdir /run/sshd/
    chown root:wheel /run/sshd/
    chmod 750 /run/sshd/
    s6-ipcserver /run/sshd/sshd.sock sshd -ie -o AuthorizedKeysFile=/root/.ssh/local_keys -o PermitRootLogin=yes
    
  • Das root-Konto sperren und die Anmeldung per Passwort deaktivieren

    # Root-Passwort in der Datei /etc/passwd ändern
    
  • Die Option ProxyCommand verwenden, um sich mit der lokalen sshd-Instanz zu verbinden

    ssh -o ProxyCommand='socat STDIO UNIX-CONNECT:/run/sshd/sshd.sock' \
        -i .ssh/root-key.pub \
        -t \
        root@root \
        "cd $(pwd); '$SHELL' --login"
    
  • Ein Skript schreiben, das mit der Option ProxyUseFdpass den Socket-Dateideskriptor übergibt

    #!/usr/bin/env python3
    import sys
    import socket
    import array
    
    s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    s.connect("/run/sshd/sshd.sock")
    
    fds = array.array("i", [s.fileno()])
    ancdata = [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)]
    socket.socket(fileno=1).sendmsg([b'\0'], ancdata)
    
  • Abschließend den ssh-Befehl ausführen

    ssh -o ProxyCommand='/home/hugo/tmp/passfd.py' \
        -i .ssh/root-key.pub \
        -o ProxyUseFdpass=yes \
        -t \
        root@root \
        "cd $(pwd); '$SHELL' --login"
    

Fazit

  • Diese Technik nutzt OpenSSH, um die Sicherheitsdetails zu handhaben
  • Unterstützt verschiedene Authentifizierungsmethoden, einschließlich hardwarebasierter SSH-Schlüssel
  • Die Einrichtung auf neuen Hosts ist nicht kompliziert
  • Das Skript passfd.py ist eine provisorische Lösung für Experimente; für den täglichen Einsatz wäre ein kleines ausführbares Programm besser

Meinung von GN⁺

  • Diese Methode kann als Alternative zu sudo oder doas die Sicherheit erhöhen
  • Der Ansatz, SSH zur Stärkung der Authentifizierung zu verwenden, unterstützt verschiedene Authentifizierungsmethoden einschließlich hardwarebasierter Authentifizierung
  • Die Systemkonfiguration ist vergleichsweise einfach, sodass auch Einsteiger unter den Engineers sie leicht nachvollziehen können
  • Wenn man das Skript passfd.py als kleines ausführbares Programm erstellt und in /usr/local/bin ablegt, ist die Nutzung bequemer
  • Diese Methode funktioniert nur lokal ohne Netzwerkanbindung nach außen und bietet daher hohe Sicherheit

1 Kommentare

 
GN⁺ 2024-06-24
Hacker-News-Kommentare
  • Zusätzliche Komplexität: Statt einer bestehenden einzelnen SUID-Binärdatei werden zwei Binärdateien benötigt, die als Root laufen und UNIX-Sockets verwenden. Das erhöht die Komplexität, einschließlich asymmetrischer kryptografischer Operationen.

  • Systemsicherheit: Wenn man die sudo-Binärdatei auf eine bestimmte Gruppe (wheel) beschränkt und die Berechtigungen anpasst, kann man ein ähnliches Sicherheitsniveau wie beim sshd-Ansatz beibehalten. Falls der System-Paketmanager die sudo-Berechtigungen beschädigt, kann man sie regelmäßig per cron reparieren oder sudo direkt aus dem Quellcode installieren.

  • run0 von systemd: Das Tool run0 von systemd funktioniert ähnlich wie sudo, ist aber kein SUID. Stattdessen wird der Service-Manager aufgefordert, den Befehl auszuführen. Das verhält sich eher wie ssh.

  • Vergleich von ssh und sudo: Es ist fraglich, ob ein Root-Login über ssh sicherer ist als sudo. Es braucht eine Diskussion darüber, wie sich der Zugriff entfernter Benutzer auf sshd unterbinden lässt. Verglichen mit den Einschränkungen von sudo könnte der ssh-Ansatz verwundbarer sein.

  • Probleme mit Netzwerkdiensten: Wenn ssh beim Booten nicht startet, ist auch eine Konsolenanmeldung unmöglich. Das kann mehr Probleme verursachen als sudo oder su.

  • Ein systemd run0 ähnlicher Ansatz: Es gibt einen Ansatz, der dem Tool run0 von systemd ähnelt.

  • Feingranulare Kontrolle mit sudo: sudo kann Befehle und Argumente sowie das Erzeugen von Subshells im Detail steuern. Ein neuer Ansatz verliert diese feingranulare Kontrolle, und vertrauenswürdiges Schlüsselmanagement wird schwieriger.

  • SSH-Konsolenkonfiguration: Eine Methode, den Root-Zugriff über eine dedizierte SSH-Konsole zu verwalten. Mit Yubikey und Firewall-Konfigurationen wird die Sicherheit erhöht.

  • Grenzen des SSH-Protokolls: SSH umfasst Prozesserzeugung nicht als Teil des Protokolls und kann keine lokalen Ressourcen an Kindprozesse weiterreichen. Um es als Ersatz für sudo zu verwenden, wäre eine Erweiterung ähnlich POSIX spawn nötig.

  • Benutzerverwaltung: Es ist wichtig, Benutzer nicht wie kleine Kinder zu behandeln, sondern vernünftige Standardwerte zu setzen, um potenzielle Probleme zu vermeiden. Wenn Root-Zugriff nötig ist, ist eine Anmeldung über die Konsole wünschenswert.

  • Probleme im Einzelbenutzermodus: Wenn man sich im Einzelbenutzermodus nicht als Root anmelden kann, wird die Systemwiederherstellung schwierig. Das ist nötig, um Probleme zu beheben, die während System-Upgrades auftreten können.