Timothee Ravier von Red Hat, der Wartungsleiter der Projekte Fedora Silverblue und Fedora Kinoite, hat eine Methode vorgeschlagen, um die Verwendung des sudo-Tools zu vermeiden, das das SUID-Bit zur Erhöhung der Berechtigungen verwendet. Anstelle von sudo wird vorgeschlagen, für die Ausführung von Befehlen mit Root-Rechten durch normale Benutzer das Tool ssh mit einer lokalen Verbindung zur gleichen Maschine über einen UNIX-Socket und Schlüsselberechtigungsprüfung zu verwenden.
Die Verwendung von ssh anstelle von sudo ermöglicht es, SUID-Programme im System zu beseitigen und die Ausführung privilegierter Befehle in der Host-Umgebung von Distributionen zu organisieren, die Komponenten in Containern isolieren, wie Fedora Silverblue, Fedora Kinoite, Fedora Sericea und Fedora Onyx. Zur Zugangsbeschränkung kann zusätzlich eine Bestätigung der Berechtigungen durch einen USB-Token (zum Beispiel Yubikey) verwendet werden.
Beispiel für die Konfiguration von OpenSSH-Serverkomponenten für den Zugriff über einen lokalen Unix-Socket (es wird eine separate Instanz von sshd mit ihrer eigenen Konfigurationsdatei gestartet):
/etc/systemd/system/sshd-unix.socket: [Unit] Description=OpenSSH Server Unix Socket Documentation=man:sshd(8) man:sshd_config(5) [Socket] ListenStream=/run/sshd.sock Accept=yes [Install] WantedBy=sockets.target
/etc/systemd/system/sshd-unix@.service: [Unit] Description=OpenSSH per-connection server daemon (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: # Оставляет только аутентификацию по ключам PermitRootLogin prohibit-password PasswordAuthentication no PermitEmptyPasswords no GSSAPIAuthentication no # ограничиваем доступ выбранным пользователям AllowUsers root adminusername # Оставляем только использование .ssh/authorized_keys (без .ssh/authorized_keys2 AuthorizedKeysFile .ssh/authorized_keys # включаем sftp Subsystem sftp /usr/libexec/openssh/sftp-server
Aktivieren und Starten der systemd-Unit: sudo systemctl daemon-reload sudo systemctl enable --now sshd-unix.socket
Fügen Sie Ihren SSH-Schlüssel zu /root/.ssh/authorized_keys hinzu
Konfigurieren des SSH-Clients.
Installieren Sie das Tool socat: sudo dnf install socat
Ergänzen Sie /.ssh/config und geben Sie socat als Proxy für den Zugriff über den UNIX-Socket an: Host host.local User root # Verwenden Sie /run/host/run anstelle von /run für den Betrieb aus Containern ProxyCommand socat -- UNIX-CLIENT:/run/host/run/sshd.sock # Pfad zum SSH-Schlüssel IdentityFile ~/.ssh/keys/localroot # Aktivieren Sie die TTY-Unterstützung für die interaktive Shell RequestTTY yes # Entfernen Sie überflüssige Ausgaben LogLevel QUIET
In der aktuellen Form kann der Benutzer adminusername jetzt Befehle mit Root-Rechten ohne Passwortabfrage ausführen. Überprüfen Sie die Funktionalität: $ ssh host.local [root ~]#
Erstellen Sie in bash ein Alias sudohost, um "ssh host.local" ähnlich wie sudo auszuführen: 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)
Fügen Sie eine Berechtigungsprüfung hinzu und aktivieren Sie die Zwei-Faktor-Authentifizierung, die den Zugriff auf root nur beim Einstecken des USB-Tokens Yubikey zulässt.
Überprüfen Sie, welche Algorithmen der vorhandene Yubikey unterstützt: lsusb -v 2>/dev/null | grep -A2 Yubico | grep "bcdDevice" | awk '{print $2}'
Wenn 5.2.3 oder höher angezeigt wird, verwenden wir ed25519-sk zur Schlüsselgenerierung, andernfalls 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
Wir fügen den Schlüsseltyp in die sshd-Konfiguration ein: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com
Der Zugang zum Unix-Socket wird nur auf den Benutzer beschränkt, dem Privilegien gewährt werden können (in unserem Beispiel — adminusername). In /etc/systemd/system/sshd-unix.socket fügen wir hinzu: [Socket] … SocketUser=adminusername SocketGroup=adminusername SocketMode=0660
Quelle: opennet.ru
