Timothee Ravier von Red Hat, der Maintainer der Projekte Fedora Silverblue und Fedora Kinoite, hat eine Methode vorgeschlagen, um die Verwendung des Tools sudo, das das suid-Bit zur Erhöhung von Berechtigungen nutzt, zu vermeiden. Anstelle von sudo wird vorgeschlagen, um gewöhnlichen Benutzerkommandos mit Root-Rechten die ssh-Anwendung über eine lokale Verbindung zum selben System durch einen UNIX-Socket zu verwenden, wobei die Berechtigungen über SSH-Schlüssel überprüft werden.
Die Verwendung von ssh anstelle von sudo ermöglicht es, suid-Programme im System abzulehnen und die Ausführung privilegierter Befehle in der Host-Umgebung von Distributionen, die контейнерную изоляцию компонентов verwenden, wie Fedora Silverblue, Fedora Kinoite, Fedora Sericea und Fedora Onyx, zu organisieren. Zur zusätzlichen Einschränkung des Zugangs kann auch die Bestätigung von Berechtigungen durch ein USB-Token (z.B. Yubikey) genutzt 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 einer 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 wir die systemd-Einheit: 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 Sie den Betrieb des SSH-Clients.
Installieren Sie das Tool socat: sudo dnf install socat
Ergänzen Sie /.ssh/config, indem Sie socat als Proxy für den Zugriff über Unix-Socket angeben: Host host.local User root # Verwenden Sie /run/host/run statt /run für die Verwendung aus Containern ProxyCommand socat — UNIX-CLIENT:/run/host/run/sshd.sock # Pfad zum SSH-Schlüssel IdentityFile ~/.ssh/keys/localroot # Aktivieren Sie die Unterstützung von TTY für die interaktive Shell RequestTTY yes # Überflüssige Ausgaben entfernen LogLevel QUIET
In der aktuellen Form kann der Benutzer adminusername jetzt Befehle mit Root-Rechten ohne Eingabe eines Passworts ausführen. Überprüfen wir die Funktion: $ ssh host.local [root ~]#
Erstellen Sie in bash ein Alias sudohost, um «ssh host.local» analog zu 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: $ 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 mit einem USB-TOKEN Yubikey erlaubt.
Ü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 ausgegeben 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 in /root/.ssh/authorized_keys ein
Fügen Sie den Schlüsseltyp an die sshd-Konfiguration an: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com
Beschränken Sie den Zugriff auf den Unix-Socket nur auf den Benutzer, dem Privilegien zugewiesen werden können (in unserem Beispiel — adminusername). In /etc/systemd/system/sshd-unix.socket hinzufügen: [Socket] … SocketUser=adminusername SocketGroup=adminusername SocketMode=0660
Quelle: opennet.ru
