web-dev-qa-db-fra.com

Faites que Sudo ne demande pas de mot de passe pendant n minutes après la connexion

Je me connecte régulièrement à boxen via SSH, et exécute update, etc., en tant que root, en utilisant Sudo.

J'apprécie que Sudo demande le mot de passe après un certain temps, au cas où je m'éloignerais des terminaux ou autres. Mais comme j'ai déjà entré le mot de passe de connexion ou la phrase clé SSH, je préférerais Sudo non pour demander un mot de passe pendant les n premières minutes après une connexion, mais vous comportez comme si Sudo avait été exécuté avec succès immédiatement après la connexion.

Est-il possible de configurer de sorte qu'aucun mot de passe ne soit requis pour la première invocation après la connexion?

Pour faire un exemple du comportement souhaité

ssh [email protected]
[~]$ Sudo somecommand
[~]$ #no password asked.
[~]$ Sudo somecommand #n minutes later
[Sudo] password for foo: 
4
vidarlo

Voici une idée de la façon dont cela pourrait être fait. NOTE: c'est un hack; utilisez seulement si les mots Sudo sans mot de passe donnent envie à vos sourcils de ramper le long de votre crâne.

Le principe est le suivant: nous ne pouvons pas transmettre les informations de connexion à Sudo. La question est donc de savoir comment avoir un NOPASSWD Sudo uniquement pendant les premières minutes d’une connexion. Nous pouvons le faire en démarrant le shell de connexion en mode NOPASSWD et en créant un processus d'arrière-plan dans .bashrc qui, après quelques minutes, annule le NOPASSWD.

# somewhere near the bottom of ~/.bashrc
Sudo -n /bin/bash -c "$HOME/nopasswd-Sudo 60s 12h <&- >&- &"

Bien sûr, le script lui-même doit être démarré avec NOPASSWD Sudo, sinon un mot de passe vous sera demandé. Et le script doit rétablir la règle NOPASSWD à la fin de la session bash, de sorte que NOPASSWD soit défini pour la prochaine connexion.

Voici le script $HOME/nopasswd-Sudo qui le fera:

#!/bin/bash

Sudo_FILE="/etc/sudoers.d/$(basename "$0")-${Sudo_USER}"
Sudo_RULE="${Sudo_USER} ALL=(ALL:ALL) NOPASSWD: ALL"

[ -z "$Sudo_USER" ] &&
     echo "$(basename "$0"): must be invoked with Sudo" >&2 &&
     exit 1

# Trap exit to recreate Sudo_FILE for next login
trap "echo '$Sudo_RULE' > '$Sudo_FILE'; exit 0" EXIT

# First time around just exit, creating the Sudo_FILE
[ -f "$Sudo_FILE" ] || exit 0

# After $1 (default 5m) remove Sudo_FILE to end NOPASSWD Sudo
sleep ${1:-5m} && rm -f "$Sudo_FILE"

# Wait until our parent exits, and we will exit via the trap
# If after $2 (default 12h) still alive, we assume we missed the HUP
sleep ${2:-12h}

Lors de sa première exécution (ce qui doit être fait à partir de la ligne de commande et non de .bashrc), le script crée le fichier /etc/sudoers.d/nopasswd-Sudo-$USER contenant un caractère générique NOPASSWD pour le $USER connecté:

{username} ALL=(ALL:ALL) NOPASSWD: ALL

Ensuite, à chaque connexion, il démarre et attend en arrière-plan que le temps sans mot de passe soit écoulé, après quoi il supprime le fichier et la prochaine Sudo nécessite un mot de passe.

Après cela, il attend indéfiniment (jusqu'à 12h pour éviter les orphelins perdus qui ont raté le signal HUP de leur parent) ou jusqu'à ce que son parent, le shell de connexion, se termine. Juste avant de quitter, son trap EXIT recrée le fichier NOPASSWD.


Conseil pour les plus aventureux: n'oubliez pas de toujours garder un shell racine séparé ouvert pendant que vous bousillez avec les scripts de connexion ou les règles Sudo. Vous ne seriez pas le premier à vous isoler.

5
zwets