Comment puis-je corriger des erreurs sudo sur mon instance EC2 lorsque j'exécute la commande sudo ?

Lecture de 7 minute(s)
0

J'ai modifié ou supprimé le fichier /etc/sudoers sur mon instance Amazon Elastic Compute Cloud (Amazon EC2). Je reçois ensuite des erreurs de syntaxe ou sudo lorsque j'exécute des commandes sudo.

Brève description

Lorsque vous supprimez ou configurez incorrectement le fichier /etc/sudoers, les erreurs de syntaxe ou sudo suivantes se produisent :

  • « /etc/sudoers:abc:x: syntax error »
  • « sudo: unable to open /etc/sudoers: No such file or directory »
  • « sudo: no valid sudoers sources found, quitting »
  • « sudo: error initializing audit plugin sudoers_audit »

Si l'une de ces erreurs s'affiche, vous ne pouvez pas accorder aux utilisateurs ou aux groupes d'utilisateurs des autorisations d'accès aux ressources du système. Pour corriger le fichier /etc/sudoers, attachez le disque racine à une instance de secours. Si vous ne parvenez pas à associer un disque racine à une instance de secours, utilisez les données utilisateur pour modifier le fichier.

Résolution

Si des erreurs surviennent lorsque vous exécutez des commandes de l'interface de la ligne de commande AWS (AWS CLI), consultez la section Résoudre des erreurs liées à l’AWS CLI. Vérifiez également que vous utilisez bien la version la plus récente de l'interface.

Attacher un disque racine à une instance de secours

Il est recommandé d'associer un disque racine à une instance de secours afin de modifier le fichier /etc/sudoers.

Prérequis : Lorsque vous arrêtez et redémarrez une instance, les données des volumes de stockage d'instance sont effacées. Sauvegardez sur le volume de stockage d'instances toutes les données que vous souhaitez conserver. Pour plus d'informations, consultez la section Type de périphérique racine. Aussi, lorsque vous arrêtez ou démarrez une instance, son adresse IP publique change. Lorsque vous acheminez le trafic externe vers votre instance, il est recommandé d'utiliser une adresse IP Elastic au lieu d'une adresse IP publique.

Pour associer un disque racine à une instance de secours, procédez comme suit :

  1. Créez une nouvelle paire de clés.

  2. Obtenez l'ID de volume et le nom du périphérique pour le volume racine de l'instance d'origine.

  3. Démarrez l'instance d'origine.

  4. Lancez une instance de restauration à partir d'une AMI (Amazon Machine Image) avec la même version du système d'exploitation Linux dans la même zone de disponibilité.

  5. Détachez le volume racine de l'instance d'origine, puis attachez-le à l'instance de restauration en tant que volume secondaire.

  6. Connectez-vous à l'instance de restauration à l'aide de votre nouvelle paire de clés SSH.

  7. Exécutez la commande suivante pour passer à l’utilisateur racine :

    [ec2-user ~]$ sudo su
  8. Pour identifier le nom et la partition du périphérique de stockage bloqué, exécutez la commande suivante depuis l'instance de restauration :

    [root ~]$ lsblkNAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    xvda    202:0    0    8G  0 disk
    └─xvda1 202:1    0    8G  0 part /
    xvdf    202:80   0  101G  0 disk
    └─xvdf1 202:81   0  101G  0 part
    xvdg    202:96   0   30G  0 disk

    Dans l'exemple précédent, les noms des périphériques de volume /dev/xvda et /dev/xvdf sont des volumes partitionnés, et /dev/xvdg n’en est pas un.
    Si votre volume est partitionné, exécutez la commande suivante pour monter la partition /dev/xvdf1 au lieu du périphérique brut /dev/xvdf :

    [root ~]$ mount -o nouuid  /dev/xvdf1 /mnt

    Si vous utilisez une instance basée sur le système AWS Nitro, le nom du périphérique de volume est similaire à /dev/nvme[0-26]n1. Si votre instance est créée sur Nitro System avec NVMe, montez la partition dans le répertoire /mnt. Utilisez le nom de périphérique que vous avez identifié à l'aide de la commande lsblk :

    [root ~]$ mount -o nouuid  /dev/nvme1n1p1 /mnt

    Pour plus d'informations, consultez la section Noms de périphériques pour les volumes sur les instances Amazon EC2.

  9. Pour copier le fichier /etc/sudoers à partir de l'instance de travail en tant que sauvegarde, exécutez la commande suivante :

    [root ~]$ cp /etc/sudoers /mnt/etc/sudoers.bak
  10. Pour créer un environnement chroot dans le répertoire /mnt, exécutez la commande suivante :

[root ~]$ for i in dev proc sys run; do mount -o bind /$i /mnt/$i; done; chroot /mnt

Dans l’exemple précédent, les répertoires /dev, /proc, /sys et /run sont montés par liaison à partir du système de fichiers racine d’origine. Cela permet aux processus qui s'exécutent dans l'environnement chroot d'accéder à ces répertoires système. Pour modifier le fichier /etc/sudoers, exécutez la commande visudo dans l'environnement chroot :

[root ~]$ visudo

Remarque : Vous devez exécuter la commande visudo pour modifier le fichier sudoers. La commande visudo verrouille le fichier sudoers.
Si vous recevez des erreurs à l’issue de la commande précédente, exécutez la commande diff suivante pour comparer le fichier /etc/sudoers avec le nouveau fichier /etc/sudoers.bak :

[root ~]$ diff /etc/sudoers /etc/sudoers.bak

Remarque : Si vous n'avez pas apporté de modifications personnalisées avant de modifier le fichier, restaurez le fichier /etc/sudoers.bak dans /etc/sudoers. Pour quitter l'environnement chroot, exécutez la commande suivante :

[root ~]$ exit
  1. Pour démonter le volume racine, exécutez la commande suivante :
[root ~]$ umount -fl /mnt
  1. Détachez le volume racine qui était attaché en tant que volume secondaire de l'instance de restauration. Puis, rattachez-le à l'instance d'origine avec le nom du périphérique indiqué à l'étape 2.
  2. Démarrez l'instance d'origine, puis vérifiez que les commandes sudo fonctionnent correctement.

Utiliser les données utilisateur pour modifier le fichier

Remarque : La méthode de dépannage suivante utilise les données saisies par l'utilisateur. Pour utiliser cette méthode, vous devez définir un mot de passe pour l'utilisateur racine.

Pour utiliser les données utilisateur afin de modifier le fichier, procédez comme suit :

  1. Ouvrez la console Amazon EC2.

  2. Dans le volet de navigation, sélectionnez Instances, puis cliquez sur l’instance.

  3. Sélectionnez État de l’instance, puis Arrêter l’instance.

  4. Sous Arrêter l’instance ?, sélectionnez Arrêter.

  5. Définissez un mot de passe temporaire pour l'utilisateur racine.
    Exemple :

                Content-Type: multipart/mixed; boundary="//"
                MIME-Version: 1.0
    
                --//
                Content-Type: text/cloud-config; charset="us-ascii"
                MIME-Version: 1.0
                Content-Transfer-Encoding: 7bit
                Content-Disposition: attachment; filename="cloud-config.txt"
    
                #cloud-config
                cloud_final_modules:
                - [scripts-user, always]
    
                --//
                Content-Type: text/x-shellscript; charset="us-ascii"
                MIME-Version: 1.0
                Content-Transfer-Encoding: 7bit
                Content-Disposition: attachment; filename="userdata.txt"
    
                #!/bin/bash
                chpasswd <<<"root:root"
                --//

    Important : Ce mot de passe utilise du texte brut pour transmettre des secrets et n'est pas sécurisé. Assurez-vous de supprimer le mot de passe temporaire de l'utilisateur racine après avoir terminé les étapes de dépannage.

  6. Démarrez l'instance, puis connectez-vous en tant que ec2-user.

  7. Pour accéder au fichier /etc/sudoers, exécutez la commande pkexec suivante :

    pkexec /usr/sbin/visudo
  8. Saisissez le mot de passe de l'utilisateur racine, puis modifiez le fichier /etc/sudoers.

  9. Exécutez une commande sudo pour vérifier que sudo fonctionne correctement.

  10. Arrêtez l’instance.

Pour utiliser la console Amazon EC2 afin de supprimer les valeurs des données utilisateur, y compris le mot de passe de l'utilisateur racine, procédez comme suit :

  1. Ouvrez la console Amazon EC2.
  2. Dans le volet de navigation, sélectionnez Instances, puis cliquez sur l’instance.
  3. Sélectionnez Actions, puis Paramètres de l’instance.
  4. Sélectionnez Modifier les données utilisateur, puis supprimez toutes les données utilisateur.

Pour utiliser l'interface de ligne de commande AWS afin de supprimer les valeurs de données utilisateur, y compris le mot de passe de l'utilisateur racine, exécutez la commande modify-instance-attribute suivante :

aws ec2 modify-instance-attribute --instance-id example-instance-id --user-data Value=""

Remarque : Remplacez example-instance-id par votre ID d'instance.

Pour vérifier que vous avez supprimé les données utilisateur, exécutez la commande describe-instance-attribute suivante :

aws ec2 describe-instance-attribute --instance-id example-instance-id --attribute userData

Remarque : Remplacez example-instance-id par votre ID d'instance.

Après avoir supprimé les données utilisateur, démarrez l'instance.

Informations connexes

Pourquoi ne puis-je pas exécuter de commandes sudo sur mon instance Linux EC2 ?

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un mois