Timothee Ravier de la companie Red Hat, mentănesc proiectele Fedora Silverblue și Fedora Kinoite, a propus o metodă de a evita utilizarea utilitatii sudo, care folosește bitul suid pentru creșterea privilegiilor. În loc de sudo, pentru a permite utilizatorilor obișnuiți să execute comenzi cu drepturi root, se propune utilizarea utilitarului ssh cu o conexiune locală la același sistem printr-un socket UNIX și verificarea autorizațiilor pe baza cheilor SSH.
Utilizarea ssh în loc de sudo permite eliminarea programelor suid din sistem și organizarea executării comenzilor privilegiate în medii de gazdă ale distribuțiilor care folosesc izolația containerelor, cum ar fi Fedora Silverblue, Fedora Kinoite, Fedora Sericea și Fedora Onyx. Pentru a restricționa accesul, poate fi activată suplimentar confirmarea autorizațiilor cu ajutorul unui token USB (de exemplu, Yubikey).
Exemplu de configurare a componentelor serverului OpenSSH pentru acces printr-un socket Unix local (va fi lansat o instanță separată de sshd cu propriul fișier de configurare):
/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
Activăm și pornim unitatea systemd: sudo systemctl daemon-reload sudo systemctl enable —now sshd-unix.socket
Adăugăm cheia noastră SSH în /root/.ssh/authorized_keys
Configurăm funcționarea clientului SSH.
Instalăm utilitarul socat: sudo dnf install socat
Completem /.ssh/config, specificând socat ca proxy pentru accesul prin socket UNIX: Host host.local User root # Folosim /run/host/run în loc de /run pentru a funcționa din containere ProxyCommand socat — UNIX-CLIENT:/run/host/run/sshd.sock # Calea către cheia SSH IdentityFile ~/ .ssh/keys/localroot # Activăm suportul TTY pentru shell-ul interactiv RequestTTY yes # Eliminăm ieșirea inutilă LogLevel QUIET
În forma actuală, utilizatorul adminusername poate acum să execute comenzi cu drepturi root fără a introduce o parolă. Verificăm funcționarea: $ ssh host.local [root ~]#
Creăm un alias bash sudohost pentru a lansa „ssh host.local” în mod similar cu sudo: sudohost() { if [[ ${#} -eq 0 ]]; then ssh host.local «cd \”${PWD}\”»; exec \”${SHELL}\” —login; else ssh host.local «cd \”${PWD}\”»; exec \”${@}\”»; fi }
Verificăm: $ sudohost id uid=0(root) gid=0(root) groups=0(root)
Adăugăm verificarea autorizațiilor și activăm autentificarea cu doi factori, permițând accesul la root doar cu inserarea token-ului USB Yubikey.
Verificăm ce algoritmi sunt susținuți de Yubikey-ul existent: lsusb -v 2>/dev/null | grep -A2 Yubico | grep «bcdDevice» | awk ‘{print $2}’
Dacă a fost afișat un valoare de 5.2.3 sau mai mare, folosim ed25519-sk la generarea cheilor, altfel — ecdsa-sk: ssh-keygen -t ed25519-sk sau ssh-keygen -t ecdsa-sk
Adaugă cheia publică în /root/.ssh/authorized_keys
Adăugăm legătura cu tipul de cheie în configurația sshd: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com
Restricționăm accesul la socket-ul Unix doar pentru utilizatorul căruia îi pot fi crescute privilegii (în exemplul nostru — adminusername). În /etc/systemd/system/sshd-unix.socket adăugăm: [Socket] … SocketUser=adminusername SocketGroup=adminusername SocketMode=0660
Sursa: opennet.ro
