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

Timothée Ravier de Red Hat, mainteneur des projets Fedora Silverblue et Fedora Kinoite, a proposé une méthode pour abandonner l'utilisation de l'outil sudo, qui utilise un bit suid pour l'élévation des privilèges. Au lieu de sudo, il est proposé d'utiliser l'outil ssh avec une connexion locale à la même machine via un socket UNIX et une vérification des autorisations basée sur des clés SSH pour exécuter des commandes avec des droits root par un utilisateur normal.

L'utilisation de ssh au lieu de sudo permet de se débarrasser des programmes suid dans le système et d'organiser l'exécution de commandes privilégiées dans l'environnement hôte des distributions utilisant l'isolation par conteneurs, telles que Fedora Silverblue, Fedora Kinoite, Fedora Sericea et Fedora Onyx. Pour restreindre l'accès, une validation des autorisations à l'aide d'un token USB (par exemple, Yubikey) peut être ajoutée.

Exemple de configuration des composants serveur OpenSSH pour un accès via un socket Unix local (un instance distincte de sshd 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 [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

Activez et démarrez l'unité systemd : sudo systemctl daemon-reload sudo systemctl enable --now sshd-unix.socket

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

Configurez le fonctionnement du client SSH.

Installez l'outil socat : sudo dnf install socat

Complétez /.ssh/config en indiquant 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 fonctionner depuis des conteneurs ProxyCommand socat -- UNIX-CLIENT:/run/host/run/sshd.sock # Chemin vers la clé SSH IdentityFile ~/.ssh/keys/localroot # Activez le support TTY pour le shell interactif RequestTTY yes # Réduire la sortie inutile LogLevel QUIET

En l'état actuel, l'utilisateur adminusername pourra maintenant exécuter des commandes avec des droits root sans entrer de mot de passe. Vérifiez le fonctionnement : $ ssh host.local [root ~]#

Créez un alias bash sudohost pour exécuter «ssh host.local» de manière similaire à sudo : sudohost() { if [[ ${#} -eq 0 ]]; then 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)

Ajoutez une vérification des droits d'accès et activez une authentification à deux facteurs qui autorise l'accès à root uniquement lors de l'insertion du token USB Yubikey.

Vérifiez quels algorithmes sont supportés par le Yubikey existant : lsusb -v 2>/dev/null | grep -A2 Yubico | grep «bcdDevice» | awk ‘{print $2}’

Si la version 5.2.3 ou supérieure est affichée, nous utilisons ed25519-sk pour générer des clés, sinon — ecdsa-sk : ssh-keygen -t ed25519-sk ou ssh-keygen -t ecdsa-sk

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

Ajoutons la liaison au type de clé dans la configuration de sshd : /etc/ssh/sshd_config_unix : PubkeyAcceptedKeyTypes sk-ecdsa-sha2-nistp256@openssh.com,sk-ssh-ed25519@openssh.com

Limitez l'accès à la socket Unix à l'utilisateur qui peut élever ses privilèges (dans notre exemple — adminusername). Dans /etc/systemd/system/sshd-unix.socket, ajoutons : [Socket] … SocketUser=adminusername SocketGroup=adminusername SocketMode=0660

Source : opennet.ru

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster