Resolução de problemas de ficheiros sudoers


A página oferece sugestões sobre a utilização do utilitário de linha de comandos sudo, a gestão do plug-in sudoers e a prevenção ou a correção de problemas que surjam.

Causas dos problemas

Durante cada execução do comando sudo, ocorre o seguinte processo para validar os ficheiros sudoers:

  • A sintaxe é verificada quanto à correção.
  • O conteúdo é analisado para excluir alguns dos erros lógicos.
  • A propriedade e as autorizações são verificadas.

A validação dos ficheiros sudoers pode falhar devido a qualquer um dos seguintes erros:

Erros de sintaxe

Tem de seguir regras de sintaxe específicas quando faz alterações aos sudoers ficheiros. Qualquer desvio desta sintaxe, incluindo, entre outros, um caráter em falta ou adicional, ou uma vírgula inadequada, pode tornar o ficheiro inválido. A invalidação do ficheiro torna impossível usar o utilitário sudo.

Solução

A solução é usar o utilitário visudo para editar os ficheiros sudoers. Valida o conteúdo do ficheiro antes de guardar e envia uma notificação em caso de problemas. O utilitário visudo foi criado para editar o ficheiro de forma segura.


Os exemplos seguintes mostram exemplos de sintaxe corretos e incorretos:

Sintaxe correta

user   ALL=(ALL) ALL

Sintaxe incorreta

user   ALL=(ALL), ALL

Exemplo de erro de sintaxe

$ sudo useradd username
/etc/sudoers:20:17: syntax error
user   ALL=(ALL), ALL
                ^

Erros lógicos

Os erros deste tipo podem dever-se a um dos seguintes motivos:

  • Uma má compreensão dos princípios do plug-in sudoers.
  • Desvios da sintaxe correta.

No entanto, os erros lógicos não são reconhecidos durante a validação, porque não violam as regras de sintaxe e, por isso, são difíceis de detetar.

Solução

Tem de ler atentamente a documentação oficial e seguir os respetivos princípios quando editar o ficheiro.

A Google também recomenda que use o utilitário visudo para editar os ficheiros sudoers, uma vez que pode detetar alguns tipos de erros lógicos, como:

  • Aliases não definidos ou não usados
  • Referências cíclicas
  • Entradas duplicadas

Se forem detetados problemas, é apresentada uma mensagem de aviso.


Os exemplos seguintes mostram amostras logicamente corretas e incorretas:

Logicamente correto

barbara   ALL=(ALL:ALL) /usr/bin/ls

Logicamente incorreto

barbara   ALL=(4LL:ALL) /usr/bin/ls
               ^
barbara   ALL=(ALL;ALL) /usr/bin/ls
                  ^
bar6ara   ALL=(ALL:ALL) /usr/bin/1s
   ^                             ^

Autorizações incorretas

Além dos erros causados pelo conteúdo dos ficheiros sudoers, as respetivas autorizações de ficheiros excessivas ou a propriedade incorreta também podem fazer com que a utilidade sudo falhe.

Solução

Vê uma descrição destes erros no resultado do comando com falha.sudo Leia a descrição da mensagem de erro e faça as correções necessárias.


Segue-se um exemplo das autorizações e da propriedade dos ficheiros corretas

$ ls -l /etc/sudoers
-r--r----- 1 root root 700 Jan 1 12:00 /etc/sudoers

$ sudo useradd username

O exemplo seguinte mostra o erro apresentado quando existem autorizações redundantes para o grupo de autorizações todos os utilizadores:

$ ls -l /etc/sudoers
-r--r---w- 1 root root 700 Jan 1 12:00 /etc/sudoers

$ sudo useradd username
sudo: /etc/sudoers is world writable
sudo: no valid sudoers sources found, quitting
sudo: error initializing audit plugin sudoers_audit

O exemplo seguinte mostra o erro que é apresentado para a propriedade incorreta. Neste exemplo, um utilizador com um ID que não seja 0 (ou um utilizador que não seja root) é o proprietário do ficheiro:

$ ls -l /etc/sudoers
-r--r----- 1 user user 700 Jan 1 12:00 /etc/sudoers

$ sudo useradd username
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

Para mais informações sobre a configuração dos ficheiros sudoers, leia o manual do Sudoers.

Para saber como gerir e usar o editor visudo, leia o manual do Visudo.

Consequências dos problemas

Os problemas nos ficheiros sudoers causam efeitos negativos e podem afetar a funcionalidade de todo o sistema.

  • O comando sudo já não funciona.

    Esta é a consequência mais percetível dos problemas nos ficheiros sudoers. A consequência disto é a incapacidade de usar privilégios elevados para os utilizadores, o que bloqueia a respetiva atividade no servidor.

    No entanto, as consequências mais destrutivas e imprevisíveis são as falhas das aplicações que dependem do comando sudo. Em alguns casos, isto pode fazer com que a aplicação falhe completamente, o que leva a um comportamento inesperado, falhas de sistema ou perda de dados. Outro exemplo é quando o comando sudo é chamado por uma aplicação durante a sequência de arranque do SO e falha. Pode levar a uma falha do SO ou fazer com que a sequência de arranque fique bloqueada.

  • Possível acesso não autorizado ao sistema.

    Outra consequência arriscada é que os problemas nos ficheiros sudoers podem levar a um acesso não autorizado ao sistema. Isto pode acontecer devido a um erro lógico quando as regras nos ficheiros sudoers concedem permissões excessivas a alguns utilizadores ou grupos.

    Isto também pode acontecer porque o proprietário do sistema desativa ou enfraquece temporariamente as defesas do sistema para iniciar sessão e corrigir o problema.

Recuperação em caso de problemas

Se perder os privilégios de utilizador elevados ou não conseguir usar o comando sudo devido a problemas com os ficheiros sudoers, use a conta de superutilizador para a recuperação.

Nos sistemas operativos semelhantes ao Unix, o superutilizador é uma conta de utilizador especial com um ID igual a 0, que normalmente se denomina root. O superutilizador tem acesso total aos recursos do sistema e pode realizar qualquer tarefa administrativa sem restrições. Embora a interação com o SO em nome do superutilizador seja geralmente considerada insegura, pode ser a única opção para determinadas tarefas, como a recuperação dos ficheiros sudoers.

Iniciar sessão diretamente como superutilizador expõe o SO a riscos. Para evitar este risco, a Google recomenda que use uma funcionalidade de script de arranque, uma vez que este script é executado em nome do superutilizador.

Leia mais sobre os scripts de arranque do Compute Engine.

Para recuperar os ficheiros sudoers com um script de arranque, faça o seguinte:

  1. Crie uma cópia de segurança do script de arranque atual, se já estiver em utilização. A abordagem de cópia de segurança depende da forma como o script de arranque está configurado.

    startup-script

    Se o conteúdo do script estiver definido diretamente no valor dos metadados, pode copiar o conteúdo do script para o contentor do Cloud Storage, para o ficheiro local ou para qualquer outro armazenamento privado temporário.

    startup-script-url

    Se o conteúdo do script já estiver no armazenamento remoto e o respetivo endereço URL for usado, pode remover temporariamente a chave de metadados startup-script-url para desativar o script de arranque atual.

  2. Atualize o script de arranque com a seguinte sequência de comandos:

    mv /etc/sudoers /etc/sudoers.backup.$(date +"%s") && echo "%google-sudoers ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers && chown 0:0 /etc/sudoers && chmod 0440 /etc/sudoers
    

    Leia mais sobre o que os comandos fazem

    mv /etc/sudoers /etc/sudoers.backup.$(date +"%s")

    Este comando cria uma cópia do ficheiro /etc/sudoers com um nome diferente e elimina o ficheiro original. O nome do novo ficheiro contém uma data/hora no final para garantir a exclusividade (por exemplo, sudoers.backup.1672527600).

    echo "%google-sudoers ALL=(ALL:ALL) NOPASSWD:ALL" > /etc/sudoers

    Este comando cria o ficheiro eliminado anteriormente /etc/sudoers com uma única regra que permite que os utilizadores Google Cloud autorizados com acesso à VM executem quaisquer comandos em nome de qualquer utilizador do sistema. Esta regra existe sempre por predefinição num ficheiro adicional /etc/sudoers.d/google_sudoers.

    chown 0:0 /etc/sudoers

    Este comando define o proprietário do ficheiro /etc/sudoers como um utilizador cujo ID é 0 e um grupo de proprietários como um grupo cujo ID é 0.

    chmod 0440 /etc/sudoers

    Este comando define as autorizações do ficheiro /etc/sudoers como só de leitura e permite que apenas o respetivo proprietário e grupo de proprietários leiam o ficheiro.

  3. Pare a VM, se estiver em execução. Reinicie a VM para acionar a execução do script de arranque.

  4. Estabeleça ligação à VM e edite o ficheiro sudoers danificado para o recuperar.

    sudo visudo /etc/sudoers.backup.TIMESTAMP
  5. Guarde as alterações e substitua o ficheiro /etc/sudoers atual pelo ficheiro que acabou de editar.

    sudo mv /etc/sudoers.backup.TIMESTAMP /etc/sudoers
  6. Certifique-se de que o problema original com a utilização do comando sudo e os privilégios elevados foi corrigido.

  7. Remova o script de arranque temporário e restaure o original, se tiver sido usado.

What's Next?