Timothee Ravier di Red Hat, maintainer dei progetti Fedora Silverblue e Fedora Kinoite, ha proposto un modo per evitare l'uso del comando sudo, che utilizza il bit suid per elevare i privilegi. Invece di sudo, per eseguire comandi con privilegi root da parte di un utente normale, si suggerisce di utilizzare l'utilità ssh con una connessione locale allo stesso sistema tramite socket UNIX e una verifica dei permessi basata su chiavi SSH.
L'uso di ssh al posto di sudo consente di eliminare i programmi suid nel sistema e di organizzare l'esecuzione di comandi con privilegi in ambienti host di distribuzioni che utilizzano l'isolamento dei componenti tramite contenitori, come Fedora Silverblue, Fedora Kinoite, Fedora Sericea e Fedora Onyx. Per limitare l'accesso, può essere implementata una verifica delle autorizzazioni tramite un token USB (ad esempio, Yubikey).
Esempio di configurazione dei componenti server OpenSSH per l'accesso tramite socket Unix locale (verrà avviato un'istanza separata di sshd con il proprio file di configurazione):
/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
Abilitare e avviare l'unità systemd: sudo systemctl daemon-reload sudo systemctl enable —now sshd-unix.socket
Aggiungere la propria chiave SSH a /root/.ssh/authorized_keys
Configurare il funzionamento del client SSH.
Installare l'utilità socat: sudo dnf install socat
Completare /.ssh/config, specificando socat come proxy per l'accesso tramite socket UNIX: Host host.local User root # Utilizzare /run/host/run invece di /run per funzionare da contenitori ProxyCommand socat — UNIX-CLIENT:/run/host/run/sshd.sock # Percorso della chiave SSH IdentityFile ~/.ssh/keys/localroot # Abilitare il supporto TTY per una shell interattiva RequestTTY yes # Rimuovere l'output eccessivo LogLevel QUIET
Nella sua attuale configurazione, l'utente adminusername potrà eseguire comandi con privilegi root senza dover inserire una password. Verifica il funzionamento: $ ssh host.local [root ~]#
Creare in bash un alias sudohost per eseguire 'ssh host.local' in modo simile a sudo: sudohost() { if [[ ${#} -eq 0 ]]; then ssh host.local 'cd "${PWD}"; exec "${SHELL}" --login' else ssh host.local 'cd "${PWD}"; exec "${@}"' fi }
Verificare: $ sudohost id uid=0(root) gid=0(root) groups=0(root)
Aggiungere una verifica delle autorità e abilitare l'autenticazione a due fattori, che consente l'accesso a root solo inserendo il token USB Yubikey.
Controllare quali algoritmi supporta il Yubikey attuale: lsusb -v 2>/dev/null | grep -A2 Yubico | grep 'bcdDevice' | awk '{print $2}'
Se viene visualizzato un valore di 5.2.3 o maggiore, utilizziamo ed25519-sk per la generazione delle chiavi, altrimenti — ecdsa-sk: ssh-keygen -t ed25519-sk oppure ssh-keygen -t ecdsa-sk
Aggiunge la chiave pubblica in /root/.ssh/authorized_keys
Aggiungiamo il binding al tipo di chiave nella configurazione di sshd: /etc/ssh/sshd_config_unix: PubkeyAcceptedKeyTypes sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com
Controlliamo l'accesso al socket Unix solo per l'utente che può ottenere privilegi elevati (nel nostro esempio — adminusername). Aggiungiamo in /etc/systemd/system/sshd-unix.socket: [Socket] … SocketUser=adminusername SocketGroup=adminusername SocketMode=0660
Fonte: opennet.ru
