Utiliser SSH sur un socket UNIX au lieu de sudo pour se débarrasser des fichiers suid

Timothee Ravier de Red Hat, responsable des projets Fedora Silverblue et Fedora Kinoite, a proposé un moyen d'éviter d'utiliser l'utilitaire sudo, qui utilise le bit suid pour élever les privilèges. Au lieu de sudo, pour qu'un utilisateur normal exécute des commandes avec les droits root, il est proposé d'utiliser l'utilitaire ssh avec une connexion locale au même système via un socket UNIX et une vérification des autorisations basées sur les clés SSH.

L'utilisation de ssh au lieu de sudo vous permet de vous débarrasser des programmes suid sur le système et de permettre l'exécution de commandes privilégiées dans l'environnement hôte des distributions qui utilisent des composants d'isolation de conteneurs, tels que Fedora Silverblue, Fedora Kinoite, Fedora Sericea et Fedora Onyx. Pour restreindre l'accès, une confirmation d'autorité à l'aide d'un jeton USB (par exemple, Yubikey) peut être également utilisée.

Un exemple de configuration des composants du serveur OpenSSH pour un accès via un socket Unix local (une instance sshd distincte sera lancée avec son propre fichier de configuration) :

/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 [Installer] WantedBy = sockets.target

/ etc / systemd / system /[email protected]: [Unité] Description=Démon de serveur OpenSSH par connexion (socket Unix) 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 : # Laisse uniquement l'authentification par clé PermitRootLogin prohibit-password PasswordAuthentication no PermitEmptyPasswords no GSSAPIAuthentication no # restreint l'accès aux utilisateurs sélectionnés AllowUsers root adminusername # Laisse uniquement l'utilisation de .ssh/authorized_keys (sans .ssh/authorized_keys2 AuthorizedKeysFile .ssh /authorized_keys # activer le sous-système sftp sftp /usr/libexec/openssh/sftp-server

Activez et lancez l'unité systemd : sudo systemctl daemon-reload sudo systemctl activate —now sshd-unix.socket

Ajoutez votre clé SSH à /root/.ssh/authorized_keys

Configuration du client SSH.

Installez l'utilitaire socat : sudo dnf install socat

Nous complétons /.ssh/config en spécifiant socat comme proxy pour l'accès via un socket UNIX : Host host.local User root # Utilisez /run/host/run au lieu de /run pour travailler à partir de conteneurs ProxyCommand socat - UNIX-CLIENT : / run/ host/run/sshd.sock # Chemin vers la clé SSH IdentityFile ~/.ssh/keys/localroot # Activer la prise en charge TTY pour le shell interactif RequestTTY yes # Supprimer la sortie inutile LogLevel QUIET

Dans sa forme actuelle, l'utilisateur adminusername pourra désormais exécuter des commandes en tant que root sans saisir de mot de passe. Vérification du fonctionnement : $ ssh host.local [root ~]#

Nous créons un alias sudohost dans bash pour exécuter « ssh host.local », similaire à sudo : sudohost() { if [[ ${#} -eq 0 ]]; puis ssh host.local "cd \"${PWD}\"; exec \"${SHELL}\" --login" else ssh host.local "cd \"${PWD}\"; exec \»${@}\»» fi }

Vérifiez : $ sudohost id uid=0(root) gid=0(root) groups=0(root)

Nous ajoutons des informations d'identification et activons l'authentification à deux facteurs, autorisant l'accès root uniquement lorsqu'un jeton USB Yubikey est inséré.

Nous vérifions quels algorithmes sont pris en charge par le Yubikey existant : lsusb -v 2>/dev/null | grep -A2 Yubico | grep "bcdDevice" | awk '{print $2}'

Si la sortie est 5.2.3 ou supérieure, utilisez ed25519-sk lors de la génération des clés, sinon utilisez ecdsa-sk : ssh-keygen -t ed25519-sk ou ssh-keygen -t ecdsa-sk

Ajoute la clé publique à /root/.ssh/authorized_keys

Ajoutez une liaison de type de clé à la configuration sshd : /etc/ssh/sshd_config_unix : PubkeyAcceptedKeyTypes [email protected],[email protected]

Nous limitons l'accès au socket Unix uniquement à l'utilisateur pouvant disposer de privilèges élevés (dans notre exemple, adminusername). Dans /etc/systemd/system/sshd-unix.socket, ajoutez : [Socket] ... SocketUser=adminusername SocketGroup=adminusername SocketMode=0660

Source: opennet.ru

Ajouter un commentaire