Verwenden Sie SSH über einen UNIX-Socket anstelle von sudo, um suid-Dateien zu entfernen

Timothee Ravier von Red Hat, Betreuer der Projekte Fedora Silverblue und Fedora Kinoite, schlug eine Möglichkeit vor, die Verwendung des Dienstprogramms sudo zu vermeiden, das das suid-Bit zur Eskalation von Berechtigungen verwendet. Damit ein normaler Benutzer Befehle mit Root-Rechten ausführen kann, wird anstelle von sudo die Verwendung des Dienstprogramms ssh mit einer lokalen Verbindung zum selben System über einen UNIX-Socket und einer Überprüfung der Berechtigungen anhand von SSH-Schlüsseln vorgeschlagen.

Durch die Verwendung von ssh anstelle von sudo können Sie suid-Programme auf dem System entfernen und die Ausführung privilegierter Befehle in der Host-Umgebung von Distributionen ermöglichen, die Container-Isolationskomponenten verwenden, wie z. B. Fedora Silverblue, Fedora Kinoite, Fedora Sericea und Fedora Onyx. Zur Zugriffsbeschränkung kann zusätzlich eine Berechtigungsbestätigung mittels USB-Token (z. B. Yubikey) genutzt werden.

Ein Beispiel für die Konfiguration von OpenSSH-Serverkomponenten für den Zugriff über einen lokalen Unix-Socket (eine separate SSHD-Instanz wird mit einer eigenen Konfigurationsdatei gestartet):

/etc/systemd/system/sshd-unix.socket: [Einheit] Beschreibung=OpenSSH Server Unix Socket Documentation=man:sshd(8) man:sshd_config(5) [Socket] ListenStream=/run/sshd.sock Accept=yes [Installieren] WantedBy=sockets.target

/ etc / systemd / system /[E-Mail geschützt] : [Einheit] Beschreibung=OpenSSH-Server-Daemon pro Verbindung (Unix-Socket) Documentation=man:sshd(8) man:sshd_config(5) Wants=sshd-keygen.target After=sshd-keygen.target [Service] ExecStart=- /usr/sbin/sshd -i -f /etc/ssh/sshd_config_unix StandardInput=socket

/etc/ssh/sshd_config_unix: # Belässt nur die Schlüsselauthentifizierung PermitRootLogin prohibit-password PasswordAuthentication nein PermitEmptyPasswords nein GSSAPIAuthentication nein # schränkt den Zugriff auf ausgewählte Benutzer ein AllowUsers Root-Administratorbenutzername # lässt nur die Verwendung von .ssh/authorized_keys (ohne .ssh/authorized_keys2 AuthorizedKeysFile .ssh /authorized_keys # SFTP-Subsystem SFTP /usr/libexec/openssh/sftp-server aktivieren

Aktivieren und starten Sie die Systemd-Einheit: sudo systemctl daemon-reload sudo systemctl enable – jetzt sshd-unix.socket

Fügen Sie Ihren SSH-Schlüssel zu /root/.ssh/authorized_keys hinzu

Einrichten des SSH-Clients.

Installieren Sie das Socat-Dienstprogramm: sudo dnf install socat

Wir ergänzen /.ssh/config, indem wir socat als Proxy für den Zugriff über einen UNIX-Socket angeben: Host host.local Benutzer root # Verwenden Sie /run/host/run anstelle von /run, um aus Containern zu arbeiten ProxyCommand socat - UNIX-CLIENT: / run/ host/run/sshd.sock # Pfad zum SSH-Schlüssel IdentityFile ~/.ssh/keys/localroot # TTY-Unterstützung für die interaktive Shell aktivieren RequestTTY ja # Unnötige Ausgabe entfernen LogLevel QUIET

In seiner aktuellen Form kann der Benutzer adminusername nun als Root Befehle ausführen, ohne ein Passwort einzugeben. Überprüfung des Vorgangs: $ ssh host.local [root ~]#

Wir erstellen einen Sudohost-Alias ​​in Bash, um „ssh host.local“ auszuführen, ähnlich wie Sudo: sudohost() { if [[ ${#} -eq 0 ]]; then ssh host.local "cd \"${PWD}\"; exec \"${SHELL}\" --login" else ssh host.local "cd \"${PWD}\"; exec \»${@}\»» fi }

Überprüfen Sie: $ sudohost id uid=0(root) gid=0(root) groups=0(root)

Wir fügen Anmeldeinformationen hinzu und aktivieren die Zwei-Faktor-Authentifizierung, sodass Root-Zugriff nur möglich ist, wenn ein Yubikey-USB-Token eingesteckt ist.

Wir prüfen, welche Algorithmen vom vorhandenen Yubikey unterstützt werden: lsusb -v 2>/dev/null | grep -A2 Yubico | grep "bcdDevice" | awk '{print $2}'

Wenn die Ausgabe 5.2.3 oder höher ist, verwenden Sie ed25519-sk beim Generieren von Schlüsseln, andernfalls verwenden Sie ecdsa-sk: ssh-keygen -t ed25519-sk oder ssh-keygen -t ecdsa-sk

Fügt den öffentlichen Schlüssel zu /root/.ssh/authorized_keys hinzu

Fügen Sie der SSHD-Konfiguration eine Schlüsseltypbindung hinzu: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes [E-Mail geschützt] ,[E-Mail geschützt]

Wir beschränken den Zugriff auf den Unix-Socket nur auf den Benutzer, dessen Berechtigungen erhöht werden können (in unserem Beispiel adminusername). Fügen Sie in /etc/systemd/system/sshd-unix.socket Folgendes hinzu: [Socket] ... SocketUser=adminusername SocketGroup=adminusername SocketMode=0660

Source: opennet.ru

Kommentar hinzufügen