Timothee Ravier från Red Hat, underhållare av Fedora Silverblue och Fedora Kinoite-projekten, föreslog ett sätt att undvika användningen av sudo, som använder suid-bit för att öka privilegier. Istället för sudo föreslås det att använda ssh för att låta en vanlig användare köra kommandon med root-rättigheter genom en lokal anslutning till samma system via en UNIX-socket och autentisering baserad på SSH-nycklar.
Användningen av ssh istället för sudo möjliggör att bli av med suid-program i systemet och organisera exekvering av privilegierade kommandon i värdmiljöer av distributioner som använder komponentisolering via containrar, såsom Fedora Silverblue, Fedora Kinoite, Fedora Sericea och Fedora Onyx. För att begränsa åtkomst kan ytterligare autentisering genom en USB-token (till exempel Yubikey) användas.
Ett exempel på konfiguration av OpenSSH-serverkomponenter för åtkomst via lokal Unix-socket (en separat instans av sshd kommer att startas med sin konfigurationsfil):
/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
Aktivera och starta systemd-enheten: sudo systemctl daemon-reload sudo systemctl enable —now sshd-unix.socket
Lägg till din SSH-nyckel i /root/.ssh/authorized_keys
Konfigurera SSH-klientens inställningar.
Installera programmet socat: sudo dnf install socat
Komplettera /.ssh/config genom att ange socat som proxy för åtkomst via UNIX-socket: Host host.local User root # Använd /run/host/run istället för /run för att fungera från containrar ProxyCommand socat — UNIX-CLIENT:/run/host/run/sshd.sock # Sökväg till SSH-nyckeln IdentityFile ~/.ssh/keys/localroot # Aktivera TTY-stöd för interaktivt skal RequestTTY yes # Ta bort onödig utdata LogLevel QUIET
I sin nuvarande form kan användaren adminusername nu köra kommandon med root-rättigheter utan att ange ett lösenord. Kontrollera att det fungerar: $ ssh host.local [root ~]#
Skapa en alias i bash för att köra "ssh host.local" som sudo: sudohost() { if [[ ${#} -eq 0 ]]; then ssh host.local "cd \"${PWD}\"; exec \"${SHELL}\" —login" else ssh host.local "cd \"${PWD}\"; exec \"${@}\"" fi }
Kontrollera: $ sudohost id uid=0(root) gid=0(root) groups=0(root)
Lägg till en autentiseringskontroll och aktivera tvåfaktorsautentisering, vilket tillåter root-åtkomst endast vid insättning av en USB-token Yubikey.
Kontrollera vilka algoritmer den befintliga Yubikey stöder: lsusb -v 2>/dev/null | grep -A2 Yubico | grep "bcdDevice" | awk '{print $2}'
Om värdet 5.2.3 eller högre visas, använder vi ed25519-sk vid nyckelgenerering, annars — ecdsa-sk: ssh-keygen -t ed25519-sk eller ssh-keygen -t ecdsa-sk
Lägg till den offentliga nyckeln i /root/.ssh/authorized_keys
Lägg till en bindning till nyckeltypen i sshd-konfigurationen: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com
Begränsa tillgången till Unix-socketen endast till användaren som kan höja privilegier (i vårt exempel — adminusername). I /etc/systemd/system/sshd-unix.socket lägger vi till: [Socket] … SocketUser=adminusername SocketGroup=adminusername SocketMode=0660
Källa: opennet.ru
