4 votes

Faire en sorte que sudo ne demande pas le mot de passe pendant n minutes après la connexion

Je me connecte régulièrement à Boxen via SSH, et exécute les mises à jour et ainsi de suite en tant que root, en utilisant sudo .

J'apprécie cela sudo demande le mot de passe après un certain temps, au cas où je m'éloignerais des terminaux ou autre. Mais comme j'ai déjà entré soit le mot de passe de connexion, soit la phrase-clé SSH, je voudrais préférez sudo pas pour demander un mot de passe pendant les n premières minutes après une connexion, mais se comporter comme si sudo avait été exécuté avec succès immédiatement après la connexion.

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

Pour donner un exemple du comportement souhaité

ssh foo@example.org
[~]$ sudo somecommand
[~]$ #no password asked.
[~]$ sudo somecommand #n minutes later
[sudo] password for foo:

5voto

zwets Points 11050

Voici une idée de la façon dont cela pourrait être fait. NOTE : il s'agit d'un hack ; à n'utiliser que si les mots sudo sans mot de passe faire en sorte que tes sourcils veuillent ramper jusqu'à ton crâne.

La prémisse est la suivante : nous ne pouvons pas transmettre les identifiants de connexion à l'utilisateur. sudo . La question est donc de savoir comment avoir un NOPASSWD sudo pour seulement les premières minutes d'une connexion. Nous pouvons le faire en démarrant le login Shell en NOPASSWD et le lancement d'un processus d'arrière-plan en mode .bashrc qui, après quelques minutes, défait 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 lancé. avec NOPASSWD sudo, ou nous serions toujours invités à entrer un mot de passe. Et le script doit rétablir la NOPASSWD lorsque la session bash se termine, de sorte que NOPASSWD est 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 (qui doit être effectuée à partir de la ligne de commande, et non à partir de l'application .bashrc ), le script crée le fichier /etc/sudoers.d/nopasswd-sudo-$USER contenant un NOPASSWD caractère générique pour l'utilisateur connecté $USER :

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

Ensuite, à chaque connexion, il démarre et attend en arrière-plan jusqu'à ce que le temps sans mot de passe soit écoulé, après quoi il supprime le fichier, et le suivant sudo nécessitera un mot de passe.

Après cela, il attend indéfiniment (en fait, jusqu'à 12h, pour éviter les orphelins persistants qui ont manqué le signal HUP de leur parent), ou jusqu'à ce que son parent, le login Shell, se termine. Juste avant qu'il ne se termine, son piège EXIT recrée l'objet NOPASSWD fichier.


Conseil pour les aventuriers : n'oubliez pas de toujours garder une racine séparée Shell ouverte pendant que vous vous amusez avec des Shell de connexion ou des sudo règles. Vous ne seriez pas le premier à vous enfermer dehors.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X