# Simplifier l'utilisation de `sudo` : fini le mot de passe sous Linux `sudo apt update` `sudo systemctl restart nginx` `sudo reboot` Quand on utilise [[Linux]], on se retrouve à taper la commande `sudo` très fréquemment. Mais à force de saisir le mot de passe à chaque fois, cela devient vite agaçant. Lorsque cette lassitude atteint son paroxysme, on finit par se décider à configurer `sudo` pour ne plus avoir à entrer le mot de passe. Si vous êtes ici, il est fort probable que vous partagiez ce sentiment ! Dans cet article, nous allons voir comment supprimer la saisie du mot de passe pour `sudo`. ![Sécurité Linux avec Tux et une clé](/media/whitedec/blog_img/vaBoSfdn.webp) ## Où se trouve la configuration de `sudo` ? Et comment la modifier ? Le fichier de configuration principal de `sudo` se trouve ici : `/etc/sudoers` La configuration de `sudo` est assez délicate : une erreur de syntaxe peut rapidement devenir un casse-tête. Si vous bloquez `sudo` par une mauvaise configuration, la récupération peut être fastidieuse. C'est pourquoi on utilise la commande dédiée `visudo`. ```bash sudo visudo ``` `visudo` effectue une vérification de la syntaxe lors de l'enregistrement et vous alerte immédiatement en cas de faute de frappe. Le manuel officiel recommande d'ailleurs vivement son utilisation. ## N'éditez pas directement /etc/sudoers Si vous tapez `sudo visudo`, le fichier `/etc/sudoers` s'ouvrira directement et vous pourrez le modifier. Cependant, ouvrir et modifier directement le fichier `/etc/sudoers` n'est pas une très bonne pratique. Personnellement, je préfère ne pas toucher au fichier de configuration principal et créer de nouveaux fichiers dans le répertoire `/etc/sudoers.d/`. Cela permet de retrouver facilement les modifications que j'ai apportées et de les annuler si nécessaire. `sudo` est conçu pour inclure les configurations des fichiers présents dans le répertoire ci-dessous. En fait, la dernière ligne du fichier `/etc/sudoers` contient `include /etc/sudoers.d/`. ```bash sudo visudo -f /etc/sudoers.d/no-password-common-commands ``` Vous pouvez choisir le nom de fichier que vous voulez, du moment qu'il est facile à identifier plus tard. Évitez cependant les noms trop génériques ou peu clairs, vous vous en mordriez les doigts par la suite. Ah ! Notez que les fichiers dont le nom contient `~` ou `.` sont ignorés par `sudo`. Une note à ce sujet figure d'ailleurs dans le fichier README du répertoire. ## Comprendre le format de configuration La configuration des sudoers suit grosso modo ce format : Honnêtement... c'est une syntaxe impossible à mémoriser. Notez-la quelque part ou ajoutez cette page de blog à vos favoris. On ne l'utilise pas tous les jours, mais quand on en a besoin, on ne s'en souvient jamais. ```bash NOM_UTILISATEUR HÔTE=(UTILISATEUR_À_EXÉCUTER) OPTIONS: COMMANDE ``` Par exemple, si votre nom d'utilisateur est `potter` et que vous souhaitez exécuter `apt update` sans mot de passe, vous pouvez écrire ceci : ```bash potter ALL=(ALL) NOPASSWD: /usr/bin/apt ``` Analysons chaque partie : * potter : Le nom d'utilisateur auquel la configuration s'applique. * ALL : Appliquer sur tous les hôtes. * (ALL) : Indique avec quels privilèges utilisateur la commande peut être exécutée. J'ai parfois vu (root), mais je préfère utiliser ALL. * NOPASSWD: Ne pas demander de mot de passe. * /usr/bin/apt : Le "chemin absolu" de la commande autorisée. Si vous n'êtes pas sûr du chemin d'une commande, vous pouvez le vérifier avec `which`. ```bash ~$which apt /usr/bin/apt ~$which apt-get /usr/bin/apt-get ~$which reboot /usr/sbin/reboot ~$which systemctl /usr/bin/systemctl ``` ## La tentation de tout ouvrir avec ALL C'est là qu'une forte tentation apparaît : ```bash potter ALL=(ALL) NOPASSWD: ALL ``` C'est très propre. Toutes les commandes sudo s'exécutent sans mot de passe. C'est pratique. Trop pratique même. C'est un choix personnel, mais je pense qu'il vaut mieux y résister. Je n'ose pas imaginer la situation où une commande mal tapée s'exécute directement avec les privilèges root. Si un script tourne mal, il n'y a plus le frein ultime de la saisie du mot de passe. Si quelqu'un utilise votre terminal laissé ouvert un instant, tout est permis. Le monde est plein de gens étranges... La décision vous appartient. ## N'autoriser que les commandes fréquemment utilisées sans mot de passe Pour ma part, je préfère le compromis : n'autoriser sans mot de passe que les commandes que j'utilise fréquemment. Cette approche est plutôt efficace. Disons par exemple que vous souhaitez utiliser `apt`, `apt-get`, `reboot` et `systemctl` sans mot de passe. Commencez par ouvrir le fichier de configuration : ```bash sudo visudo -f /etc/sudoers.d/no-password-common-commands ``` Ajoutez-y la ligne suivante : ```ini potter ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get, /usr/sbin/reboot, /usr/bin/systemctl ``` Désormais, l'utilisateur `potter` pourra exécuter les commandes ci-dessous sans mot de passe : ```bash sudo apt update sudo apt -y upgrade sudo apt-get update sudo reboot sudo systemctl reload nginx ``` Si autoriser toutes les utilisations de `systemctl` vous semble trop risqué, vous pouvez n'autoriser que des commandes spécifiques : ```bash potter ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx, /usr/bin/systemctl status nginx ``` ## Écrire sur plusieurs lignes pour une meilleure lisibilité Lorsque la liste des commandes devient longue, une seule ligne peut devenir illisible. Dans ce cas, vous pouvez la diviser en utilisant `\`. C'est une convention de saut de ligne familière aux utilisateurs Linux, mais curieusement, on a tendance à ne pas l'utiliser en pratique. Pourtant, cela améliore considérablement la lisibilité. ```bash potter ALL=(ALL) NOPASSWD: \ /usr/bin/apt, \ /usr/bin/apt-get, \ /usr/sbin/reboot, \ /usr/bin/systemctl ``` C'est plus clair et plus propre, n'est-ce pas ? ## Appliquer à un groupe spécifique Cette configuration est également très utile. Sur un serveur géré par plusieurs personnes, il est parfois plus simple d'administrer les permissions par groupe. Pour l'appliquer à un groupe spécifique, utilisez le format `%NOM_DU_GROUPE`. Par exemple, pour le groupe `admin`, cela donnerait ceci : ```bash %admin ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/apt, /usr/bin/apt-get ``` ## Augmenter la durée de validité du mot de passe `sudo` Si l'idée de supprimer complètement le mot de passe vous met mal à l'aise, il existe une autre solution : ajuster la durée pendant laquelle `sudo` ne redemande pas le mot de passe. Par défaut, après une première saisie, le mot de passe n'est pas redemandé pendant environ 10 ou 15 minutes. Vous pouvez modifier cette durée. Ceci se fait en utilisant le paramètre `timestamp_timeout`. Par exemple, cela permet de ne pas redemander le mot de passe `sudo` pendant 60 minutes : ```bash Defaults timestamp_timeout=60 ``` L'unité est la "minute". Attention, si vous mettez '0', ce sera le cauchemar : il faudra toujours saisir le mot de passe ! Si vous définissez `-1`, le mot de passe `sudo` ne sera plus demandé jusqu'à ce que vous fermiez le terminal. C'est un confort presque équivalent à `ALL`, mais avec une légère sensation d'insécurité. Bien sûr, ces configurations peuvent coexister : autoriser sans mot de passe certaines commandes et augmenter la durée de validité pour les autres. Par exemple, vous pouvez les combiner ainsi : ```bash Defaults timestamp_timeout=30 potter ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get, /usr/sbin/reboot ``` Les commandes fréquemment utilisées sans mot de passe, et pour les autres commandes `sudo`, une authentification valable pendant 30 minutes. Je pense que c'est un bon équilibre entre commodité et sécurité, n'est-ce pas ? Réduire les tracas, c'est bien, mais pas au prix d'une augmentation de l'insécurité. ## Conclusion Supprimer la saisie du mot de passe `sudo` n'est pas compliqué. Bien que l'explication ait été longue, voici un résumé rapide : 1. Créez un fichier de configuration séparé sous `/etc/sudoers.d/` avec `visudo`. ```bash sudo visudo -f /etc/sudoers.d/no-password-common-commands ``` 2. Ajoutez la règle `NOPASSWD`. ```ini Defaults timestamp_timeout=30 potter ALL=(ALL) NOPASSWD: \ /usr/bin/apt, \ /usr/bin/apt-get, \ /usr/sbin/reboot ``` Le niveau d'autorisation sans mot de passe dépend de votre jugement, mais j'aimerais que vous reteniez ceci : > Le véritable confort réside dans la satisfaction simultanée du confort des doigts et de la tranquillité d'esprit.