Estou recebendo o seguinte erro de sudo
:
$ sudo ls
sudo: /etc/sudoers is owned by uid 1000, should be 0
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin
Claro que não posso chown
voltar root
sem usar sudo
. Também não temos uma senha na root
conta.
Sinceramente, não sei como o sistema entrou nessa bagunça, mas agora cabe a mim resolvê-lo.
Normalmente, eu inicializaria no modo de recuperação, mas o sistema é remoto e acessível apenas por uma VPN enquanto inicializado normalmente. Pela mesma razão, inicializar a partir de um live CD ou pendrive também é impraticável.
O sistema é o Ubuntu 16.04 (além do EOL, não pergunte), mas a pergunta e as respostas são provavelmente mais gerais.
O procedimento descrito aqui (que pode ser uma cópia imperfeita desta resposta do Ask Ubuntu ) realizou o milagre. Estou copiando aqui e adicionando mais algumas explicações.
Procedimento
Abra duas sessões SSH para o servidor de destino.
Na primeira sessão, obtenha o PID do bash executando:
Na segunda sessão, inicie o agente de autenticação com:
Use o pid obtido na etapa 1.
De volta à primeira sessão, execute:
Digite a senha no prompt de senha da segunda sessão.
Explicação
Semelhante a
sudo
,pkexec
permite que um usuário autorizado execute um programa como outro usuário, normalmenteroot
. Ele usa polkit para autenticação; em particular, aorg.freedesktop.policykit.exec
ação é usada.Esta ação é definida em
/usr/share/polkit-1/actions/org.freedesktop.policykit.policy
:auth_admin
significa que um usuário administrativo tem permissão para executar esta ação. Quem se qualifica como usuário administrativo?Neste sistema específico (Ubuntu 16.04), que está configurado em
/etc/polkit-1/localauthority.conf.d/51-ubuntu-admin.conf
:Portanto, qualquer usuário do grupo
sudo
ouadmin
pode usarpkexec
.Em um sistema mais recente (Arch Linux), está em
/usr/share/polkit-1/rules.d/50-default.rules
:Portanto, aqui, todos no
wheel
grupo são usuários administrativos.Na
pkexec
página de manual, ele afirma que, se nenhum agente de autenticação for encontrado para a sessão atual,pkexec
usa seu próprio agente de autenticação textual, que parece serpkttyagent
. De fato, se você executarpkexec
sem primeiro iniciar opkttyagent
processo, será solicitada uma senha no mesmo shell, mas falhará após inserir a senha:Este parece ser um bug antigo no polkit que não parece estar ganhando força. Mais discussão .
O truque de usar dois shells é apenas uma solução alternativa para esse problema.
Inicialize em um ambiente ao vivo e corrija-o a partir daí.
Isso obviamente requer acesso físico ou acesso 'equivalente físico' (se estiver lidando com uma VM ou VPS), mas quase sempre funciona, não se importa com o sistema init que você possui e não se importa se você tem ou não uma senha raiz.
A abordagem geral é relativamente simples:
Esse tipo de correção funciona porque evita completamente os controles de acesso do sistema afetado, permitindo que você faça praticamente o que quiser. Esse nível de acesso irrestrito ao sistema é parte do motivo pelo qual a segurança física é tão importante.
Observe que, se estiver adotando essa abordagem, talvez seja necessário fazer algo especial ao reiniciar o sistema 'normal' para que as coisas funcionem corretamente. Em uma instalação padrão do Ubuntu, isso não deve ser necessário, mas se você estiver usando SELinux (ou ainda menos provável, IMA e EVM), pode ser necessário adicionar opções extras de inicialização e, em seguida, executar um comando do sistema inicializado para corrigir os rótulos de segurança .
Para aqueles que têm uma senha de root, basta usar o modo de usuário único.
Systemd chama isso de 'modo de resgate', mas todos os outros o chamam de modo de usuário único. Isso essencialmente inicializa em um shell raiz com quase nada além de serviços críticos em execução. É tradicionalmente usado para corrigir exatamente esse tipo de problema.
A única desvantagem disso é que em qualquer sistema moderno devidamente protegido, o modo de usuário único é protegido por senha e requer a capacidade de efetuar login como usuário root (a razão para isso é que o acesso ao console do sistema não implica inerentemente acesso físico para o hardware do sistema, então alguma autenticação deve ser usada).
Sempre que você planeja experimentar com a
sudo
configuração, é uma boa ideia manter outro terminal raiz aberto: caso você quebre algo, você já terá o direito de corrigi-lo.Se não for possível manter um terminal aberto (por exemplo, seus experimentos envolvem uma reinicialização), defina uma senha real para o
root
usuário. Então, sesudo
estiver quebrado, você pode simplesmente fazer login comoroot
(abra um novo console ou executesu
) e conserte seu sistema.