Ir para o conteúdo

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

12 minuto de leitura
0

Eu mudei a propriedade ou excluí o arquivo /etc/sudoers na minha instância do Amazon Elastic Compute Cloud (Amazon EC2) ou do Amazon Lightsail. Agora, recebo mensagens de erro 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:

  • "sudo: /etc/sudoers is owned by uid 1000, should be 0"
  • "sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set"
  • "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"

Se você receber um desses erros, não pode conceder aos usuários ou grupos de usuários acesso aos recursos do sistema. Para corrigir os arquivos /etc/sudoers e /usr/bin/sudo no Amazon EC2 ou no Lightsail, use dados do usuário ou um script de execução para modificar as permissões do arquivo. Ou anexe o disco raiz a uma instância de resgate para fazer alterações manualmente.

Observação: se você excluiu o arquivo /etc/sudoers, deve usar um script de dados do usuário para recriá-lo.

Resolução

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

Use dados do usuário ou script de execução para modificar as permissões do arquivo

Para resolver os erros "owned by uid 1000" ou "must be owned by uid 0" você deve modificar as permissões dos arquivos /etc/sudoers e /usr/bin/sudo.

Em instâncias do Amazon EC2, conclua as seguintes etapas para usar um script de dados do usuário para modificar as permissões do arquivo:

  1. Abra o console do Amazon EC2.

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

  3. Clique em Estado da instância e depois em Interromper instância.

  4. Selecione Ações e, em seguida, Configurações da instância.

  5. Clique em Editar dados do usuário.

  6. Insira o seguinte script:

    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
    # To fix error sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set. use below commands
    chown -R root:root /usr/bin/sudo
    chmod 4755 /usr/bin/sudo
    
    # to fix below sudo errors:
    #sudo: /etc/sudoers is owned by uid 1000, should be 0
    #sudo: no valid sudoers sources found, quitting
    #sudo: error initializing audit plugin sudoers_audit
    
    chown -R root:root /etc/sudoers
    chown -R root:root /etc/sudoers.d/
    sudo service sshd restart
    --//--
  7. Execute a instância e espere que ela passe nas verificações de status.

  8. Conecte-se à instância e execute o seguinte comando para validar se as permissões dos arquivos /etc/sudoers e /usr/bin/sudo estão corretas:

    sudo ls -la /etc/sudoers
    sudo ls -la /usr/bin/sudo

    O exemplo de saída a seguir mostra as permissões corretas:

    $sudo ls -la /etc/sudoers /usr/bin/sudo
    -r--r----- 1 root root   1714 Jun 25 13:38 /etc/sudoers
    -rwsr-xr-x 1 root root 281624 Jun 27  2023 /usr/bin/sudo

Para instâncias do Lightsail, conclua as etapas a seguir para usar um script de execução para modificar as permissões do arquivo:

  1. Abra o console do Lightsail.

  2. Clique em Snapshots e, em seguida, selecione seu snapshot da instância.

  3. Clique em Ações e, em seguida, selecione Criar nova instância.

  4. Em Opcional, clique em + Adicionar script de execução.

  5. Insira o seguinte script de execução:

    #!/bin/bash
    # To fix error sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set. use below commands
    chown -R root:root /usr/bin/sudo
    chmod 4755 /usr/bin/sudo
    
    # to fix below sudo errors:
    #sudo: /etc/sudoers is owned by uid 1000, should be 0
    #sudo: no valid sudoers sources found, quitting
    #sudo: error initializing audit plugin sudoers_audit
    
    chown -R root:root /etc/sudoers
    chown -R root:root /etc/sudoers.d/
    sudo service sshd restart
    --//--
  6. Clique em Criar instância.

  7. Conecte-se à instância e execute o seguinte comando para verificar as permissões dos arquivos /etc/sudoers e /usr/bin/sudo:

    sudo ls -la /etc/sudoers
    sudo ls -la /usr/bin/sudo

    O exemplo de saída a seguir mostra as permissões corretas:

    $sudo ls -la /etc/sudoers /usr/bin/sudo
    -r--r----- 1 root root   1714 Jun 25 13:38 /etc/sudoers
    -rwsr-xr-x 1 root root 281624 Jun 27  2023 /usr/bin/sudo

Anexe um disco raiz a uma instância de resgate

Configure sua instância para interromper e iniciar

Observação: quando você interrompe e executa uma instância, o endereço IP público dela muda. Ao 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. Se você usa o Amazon Route 53, talvez seja necessário atualizar os registros DNS do Route 53 quando o endereço IP público mudar.

Antes de interromper e iniciar sua instância, realize as seguintes ações:

Anexe o disco raiz a uma instância de resgate

Conclua as etapas a seguir:

  1. Crie um novo par de chaves.

  2. Obtenha o ID do volume e o nome do dispositivo no 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) com a mesma versão do sistema operacional (SO) Linux na mesma Zona de disponibilidade.

  5. Desanexe o volume raiz da instância original e, em seguida, anexe-o à instância de resgate 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:

    sudo su
  8. Para identificar o nome e a partição do dispositivo bloqueado, execute o seguinte comando na instância de recuperação:

    lsblk

    Exemplo de saída

    [root ~]$ lsblk
    NAME    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 xvda e xvdf são volumes particionados e 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:

    mount -o nouuid  /dev/xvdf1 /mnt

    Se você usa uma instância criada no AWS Nitro System, o nome do dispositivo de volume usa o formato /dev/nvme[0-26]n1. Para montar a partição no diretório /mnt, execute o seguinte comando:

    mount -o nouuid  /dev/nvme1n1p1 /mnt

    Observação: substitua /dev/nvme1n1p1 pelo nome do dispositivo que você identificou com o comando lsblk. 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 um backup, execute o seguinte comando:

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

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

O comando anterior monta por associação os diretórios /dev, /proc, /sys e /run do sistema de arquivos raiz original. Essa configuração permite que processos executados dentro do ambiente chroot acessem esses diretórios do sistema. Para editar o arquivo /etc/sudoers, execute o comando a seguir dentro do ambiente chroot:

visudo

Certifique-se de que o arquivo tem as seguintes configurações padrão:

# This file MUST be edited with the 'visudo' command as root.

# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.

# See the man page for details on how to write a sudoers file.

Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d

Observação: o comando visudo bloqueia o arquivo sudoers.
Se você receber mensagens de erro ao executar o comando anterior, execute o seguinte comando diff para comparar o arquivo /etc/sudoers com o novo arquivo /etc/sudoers.bak:

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:

exit
  1. Para desmontar o volume raiz, execute o seguinte comando:
umount -fl /mnt
  1. Desanexe o volume raiz que foi anexado como volume secundário da instância de recuperação. Em seguida, reanexe-o à instância original com o nome do dispositivo da etapa 2.
  2. Execute a instância original e, em seguida, execute o seguinte comando para confirmar se os comandos sudo funcionam corretamente:
sudo su

Use os dados do usuário para modificar o conteúdo do arquivo ou recriar o arquivo

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

Recrie o arquivo

Para acessar a instância como usuário-raiz para que seja possível recriar o arquivo, conclua as seguintes etapas:

  1. Abra o console do Amazon EC2.

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

  3. Clique em Estado da instância e depois em Interromper instância.

  4. Em Interromper instância?, clique em Interromper.

  5. Selecione Ações e, em seguida, Configurações da instância.

  6. Clique em Editar dados do usuário.

  7. Digite o script a seguir para definir uma senha temporária para o usuário-raiz:

    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.

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

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

    pkexec /usr/sbin/visudo
  10. Insira a senha do usuário-raiz e modifique o arquivo /etc/sudoers com os seguintes valores:

# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults    env_reset
Defaults    mail_badpass
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d
  1. Execute um comando sudo para verificar se o sudo funciona corretamente.
  2. Interrompa a instância.

Exclua o script de dados do usuário

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, clique em Instâncias e, em seguida, selecione a instância.
  3. Clique em Ações e, em seguida, em Configurações da instância.
  4. Selecione Editar dados do usuário e, em seguida, exclua todos os dados do usuário.

Para usar a 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, execute a instância.

Informações relacionadas

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

AWS OFICIALAtualizada há 7 meses