Icône Terminal

Comment fonctionne visudo?

Ce n’est pas très compliqué au final, lorsque l’on appelle la commande « visudo » le système vérifie la présence du fichier « /etc/sudoers.tmp » afin de bénéficier d’un accès exclusif sur le fichier « /etc/sudoers ». Si le fichier de « lock » n’existe pas alors nous pouvons éditer la configuration sudo au travers de l’éditeur définit dans la variable d’environnement « VISUAL » ou « EDITOR » (suivant celle qui est définie, la première contrôlée est « VISUAL »). Une fois la configuration terminée lorsque l’on appelle la fonction d’enregistrement du document le système vérifie que le fichier modifié est bien au format sudo et si c’est OK alors le fichier est enregistré définitivement et le fichier de lock est supprimé.

Comment retranscrire cela dans un script ksh?

Dans l’exemple ci-dessous la variable SUDOERS_ADD contient le chemin d’accès d’un fichier contenant les informations que nous souhaitons ajouter dans la configuration sudo.
Par exemple:

1
guiona ALL=(ALL) ALL


Regardons maintenant notre script qui fait la mise à jour tout seul:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/ksh
# --- Variables globales --- #
PROG=${0##*/}
PROG_PATH=${0%/*}
SUDOERS=/etc/sudoers
SUDOERS_LOCK=/etc/sudoers.tmp
SUDOERS_ADD=${PROG_PATH}/sudoers.add
SUDOERS_NEW=${PROG_PATH}/sudoers.new
 
if [[ ! -f ${SUDOERS_LOCK} && -f ${SUDOERS} ]] ; then
	# Mise en place du lock
	touch ${SUDOERS_LOCK}
	# Sauvegarde du fichier sudoers existant
	cp -p ${SUDOERS} ${PROG_PATH}/${SUDOERS##*/}.orig.$$
	if [[ -f ${SUDOERS_ADD} ]] ; then
		cat ${SUDOERS} ${SUDOERS_ADD} >${SUDOERS_NEW}
		visudo -c -f ${SUDOERS_NEW} >/dev/null 2 >&1
		CR=$?
		if [[ ${CR} -ne 0 ]] ; then
			echo "ERREUR validation du fichier ${SUDOERS_NEW}"
		else
			cp ${SUDOERS_NEW} ${SUDOERS}
			chmod 440 ${SUDOERS}
			rm ${SUDOERS_LOCK}
			echo "Mise à jour sudo OK"
		fi
	else
			echo "ERREUR fichier ${SUDOERS_ADD} manquant"
 
	fi
else
	echo "Le fichier ${SUDOERS} est en cours de modification"
fi
 
exit 0

Ceci est un script tout simple, on peut encore mettre en place des contrôles afin de tout vérifier notament au niveau de la copie du fichier (ligne 22) de la mise en place des autorisations (lignes 23), mettre en place un système de retour arrière, un fichier de log, … J’ai volontairement fait simple afin de ne pas nous écarter du sujet principal.