Como faço para corrigir erros de sudo na minha instância do EC2 quando executo o comando sudo?

7 minuto de leitura
0

Alterei ou exclui o arquivo /etc/sudoers na minha instância do Amazon Elastic Compute Cloud (Amazon EC2). Em seguida, recebo erros de sintaxe ou sudo quando executo comandos sudo.

Breve descrição

Quando você exclui ou configura incorretamente o arquivo /etc/sudoers, ocorrem os seguintes erros de sintaxe ou sudo:

  • “erro de sintaxe /etc/sudoers:abc:x:”
  • “sudo: não é possível abrir /etc/sudoers: nenhum arquivo ou diretório”
  • “sudo: nenhuma fonte válida de sudoers foi encontrada, desistindo”
  • “sudo: erro ao inicializar o plugin de auditoria sudoers_audit”

Se você receber um desses erros, não poderá conceder aos usuários ou grupos de usuários permissões de acesso aos recursos do sistema. Para corrigir o arquivo /etc/sudoers, anexe o disco raiz a uma instância de recuperação. Se você não conseguir anexar um disco raiz a uma instância de recuperação, use os dados do usuário para modificar o arquivo.

Resolução

Se você receber erros ao executar comandos da AWS Command Line (AWS CLI), consulte Solução de erros da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.

Anexe um disco raiz a uma instância de resgate

É uma prática recomendada anexar um disco raiz a uma instância de recuperação para modificar o arquivo /etc/sudoers.

Pré-requisitos: Quando você interrompe ou inicia uma instância, os dados nos volumes de armazenamento de instâncias são excluídos. Faça backup de todos os dados do volume de armazenamento da instância que você deseja manter. Para obter mais informações, consulte Tipo de dispositivo raiz. Além disso, quando você interrompe ou inicia uma instância, o endereço IP público da instância muda. Se você rotear tráfego externo para sua instância, é uma prática recomendada usar um endereço IP elástico em vez de um endereço IP público.

Para anexar um disco raiz a uma instância de recuperação, conclua as seguintes etapas:

  1. Crie outro par de chaves.

  2. Obtenha o ID do volume e o nome do dispositivo para o volume raiz da instância original.

  3. Interrompa a instância original.

  4. Execute uma instância de recuperação a partir de uma imagem de máquina da Amazon (AMI, Amazon Machine Image) com a mesma versão do sistema operacional (SO) Linux na mesma zona de disponibilidade.

  5. Separe o volume raiz da instância original e, em seguida, anexe-o à instância de recuperação como um volume secundário.

  6. Conecte-se à instância de recuperação com seu novo par de chaves SSH.

  7. Execute o seguinte comando para mudar para o usuário-raiz:

    [ec2-user ~]$ sudo su
  8. Para identificar o nome e a partição do dispositivo bloqueado, execute o seguinte comando na instância de recuperação:

    [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

    No exemplo anterior, os nomes dos dispositivos de volume /dev/xvda e /dev/xvdf são volumes particionados e /dev/xvdg não é um volume particionado.
    Se o volume estiver particionado, execute o seguinte comando para montar a partição /dev/xvdf1 em vez do dispositivo bruto /dev/xvdf:

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

    Se você usa uma instância baseada no AWS Nitro System, o nome do dispositivo de volume é semelhante a /dev/nvme[0-26]n1. Se sua instância for criada no Nitro System com NVMe, monte a partição no diretório /mnt. Use o nome do dispositivo que você identificou com o comando lsblk:

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

    Para obter mais informações, consulte Nomes de dispositivos para volumes em instâncias do Amazon EC2.

  9. Para copiar o arquivo /etc/sudoers da instância de trabalho como backup, execute o seguinte comando:

    [root ~]$ cp /etc/sudoers /mnt/etc/sudoers.bak
  10. Para criar um ambiente chroot no diretório /mnt, execute o seguinte comando:

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

No exemplo anterior, os diretórios /dev, /proc, /sys e /run são montados por associação a partir do sistema de arquivos raiz original. Isso permite que processos executados dentro do ambiente chroot acessem esses diretórios do sistema. Para editar o arquivo /etc/sudoers, execute o comando visudo dentro do ambiente chroot:

[root ~]$ visudo

Observação: Você deve executar o comando visudo para editar o arquivo sudoers. O comando visudo bloqueia o arquivo sudoers.
Se você receber erros do comando anterior, execute o seguinte comando diff para comparar o arquivo /etc/sudoers com o novo arquivo /etc/sudoers.bak:

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

Observação: Se você não fez alterações personalizadas antes de editar o arquivo, restaure o arquivo /etc/sudoers.bak para /etc/sudoers. Para sair do ambiente chroot, execute o seguinte comando:

[root ~]$ exit
  1. Para desmontar o volume raiz, execute o seguinte comando:
[root ~]$ umount -fl /mnt
  1. Separe o volume raiz que foi anexado como volume secundário da instância de recuperação. Em seguida, reconecte-o à instância original com o nome do dispositivo da etapa 2.
  2. Inicie a instância original e confirme se os comandos sudo funcionam corretamente.

Use dados do usuário para modificar o arquivo

Observação: O método de solução de problemas a seguir usa a entrada de dados do usuário. Para usar esse método, você deve definir uma senha para o usuário-raiz.

Para usar os dados do usuário para modificar o arquivo, conclua as seguintes etapas:

  1. Abra o console do Amazon EC2.

  2. No painel de navegação, escolha Instâncias e, em seguida, selecione a instância.

  3. Escolha Estado da instância e depois Interromper instância.

  4. Em Interromper instância?, escolha Interromper.

  5. Defina uma senha temporária para o usuário-raiz.
    Exemplo:

                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"
                --//

    Importante: Essa senha usa texto sem formatação para transmitir segredos e não é segura. Certifique-se de remover a senha temporária do usuário-raiz depois de concluir as etapas de solução de problemas.

  6. Inicie a instância e, em seguida, faça login como ec2-user.

  7. Para acessar o arquivo /etc/sudoers, execute o seguinte comando pkexec:

    pkexec /usr/sbin/visudo
  8. Insira a senha do usuário-raiz e modifique o arquivo /etc/sudoers.

  9. Execute um comando sudo para verificar se o sudo está funcionando corretamente.

  10. Interrompa a instância.

Para usar o console do Amazon EC2 para excluir os valores dos dados do usuário, incluindo a senha do usuário-raiz, conclua as seguintes etapas:

  1. Abra o console do Amazon EC2.
  2. No painel de navegação, escolha Instâncias e, em seguida, selecione a instância.
  3. Escolha Ações e, em seguida, escolha Configurações da instância.
  4. Escolha Editar dados do usuário e, em seguida, exclua todos os dados do usuário.

Para usar a interface da AWS CLI para excluir os valores dos dados do usuário, incluindo a senha do usuário-raiz, execute o seguinte comando modify-instance-attribute:

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

Observação: Substitua example-instance-id pelo ID da sua instância.

Para verificar se você removeu os dados do usuário, execute o seguinte comando describe-instance-attribute:

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

Observação: Substitua example-instance-id pelo ID da sua instância.

Depois de excluir os dados do usuário, inicie a instância.

Informações relacionadas

Por que não consigo executar comandos sudo na minha instância Linux do EC2?

AWS OFICIAL
AWS OFICIALAtualizada há 5 meses