SSH gebruiken via een UNIX-socket in plaats van sudo om suid-bestanden te verwijderen

Timothee Ravier van Red Hat, beheerder van de Fedora Silverblue- en Fedora Kinoite-projecten, stelde een manier voor om het gebruik van het sudo-hulpprogramma te vermijden, dat de suid-bit gebruikt om privileges te escaleren. In plaats van sudo wordt, zodat een normale gebruiker opdrachten met rootrechten kan uitvoeren, voorgesteld om het ssh-hulpprogramma te gebruiken met een lokale verbinding met hetzelfde systeem via een UNIX-socket en verificatie van machtigingen op basis van SSH-sleutels.

Door ssh te gebruiken in plaats van sudo kun je suid-programma's op het systeem verwijderen en de uitvoering van bevoorrechte commando's mogelijk maken in de hostomgeving van distributies die containerisolatiecomponenten gebruiken, zoals Fedora Silverblue, Fedora Kinoite, Fedora Sericea en Fedora Onyx. Om de toegang te beperken kan bovendien een bevestiging van de bevoegdheid met behulp van een USB-token (bijvoorbeeld Yubikey) worden gebruikt.

Een voorbeeld van het configureren van OpenSSH-servercomponenten voor toegang via een lokale Unix-socket (een afzonderlijke sshd-instantie wordt gestart met een eigen configuratiebestand):

/etc/systemd/system/sshd-unix.socket: [Unit] Beschrijving=OpenSSH Server Unix Socket Documentatie=man:sshd(8) man:sshd_config(5) [Socket] ListenStream=/run/sshd.sock Accept=yes [Installeren] WantedBy=sockets.target

/ Etc / systemd / system /[e-mail beveiligd]: [Eenheid] Beschrijving=OpenSSH per-verbinding serverdaemon (Unix socket) Documentatie=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: # Laat alleen sleutelauthenticatie over PermitRootLogin verbodswachtwoord PasswordAuthentication nee PermitEmptyPasswords nee GSSAPIAuthentication nee # beperkt de toegang tot geselecteerde gebruikers AllowUsers root adminusername # Laat alleen het gebruik van .ssh/authorized_keys over (zonder .ssh/authorized_keys2 AuthorizedKeysFile .ssh /authorized_keys # sftp inschakelen Subsysteem sftp /usr/libexec/openssh/sftp-server

Activeer en start de systemd-eenheid: sudo systemctl daemon-reload sudo systemctl enable —now sshd-unix.socket

Voeg uw SSH-sleutel toe aan /root/.ssh/authorized_keys

De SSH-client instellen.

Installeer het socat-hulpprogramma: sudo dnf install socat

We vullen /.ssh/config aan door socat op te geven als proxy voor toegang via een UNIX-socket: Host host.local Gebruiker root # Gebruik /run/host/run in plaats van /run om vanuit containers te werken ProxyCommand socat - UNIX-CLIENT: / run/host/run/sshd.sock # Pad naar de SSH-sleutel IdentityFile ~/.ssh/keys/localroot # Schakel TTY-ondersteuning in voor de interactieve shell RequestTTY ja # Verwijder onnodige uitvoer LogLevel QUIET

In zijn huidige vorm kan de gebruiker admin-gebruikersnaam nu opdrachten uitvoeren als root zonder een wachtwoord in te voeren. De werking controleren: $ ssh host.local [root ~]#

We maken een sudohost-alias in bash om “ssh host.local” uit te voeren, vergelijkbaar met sudo: sudohost() { if [[ ${#} -eq 0 ]]; dan ssh host.local "cd \"${PWD}\"; exec \"${SHELL}\" --login" else ssh host.local "cd \"${PWD}\"; exec \»${@}\»» fi }

Controleer: $ sudohost id uid=0(root) gid=0(root) groups=0(root)

We voegen inloggegevens toe en schakelen tweefactorauthenticatie in, waardoor root-toegang alleen mogelijk is wanneer een Yubikey USB-token is geplaatst.

We controleren welke algoritmen worden ondersteund door de bestaande Yubikey: lsusb -v 2>/dev/null | grep -A2 Yubico | grep "bcdDevice" | awk '{print $2}'

Als de uitvoer 5.2.3 of hoger is, gebruik dan ed25519-sk bij het genereren van sleutels, gebruik anders ecdsa-sk: ssh-keygen -t ed25519-sk of ssh-keygen -t ecdsa-sk

Voegt de openbare sleutel toe aan /root/.ssh/authorized_keys

Voeg een sleuteltypebinding toe aan de sshd-configuratie: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes [e-mail beveiligd],[e-mail beveiligd]

We beperken de toegang tot de Unix-socket tot alleen de gebruiker die verhoogde rechten kan hebben (in ons voorbeeld admingebruikersnaam). In /etc/systemd/system/sshd-unix.socket toevoegen: [Socket] ... SocketUser=admingebruikersnaam SocketGroup=admingebruikersnaam SocketMode=0660

Bron: opennet.ru

Voeg een reactie