Recuperando da configuração do shell do root para um arquivo incorreto

23

Digamos que eu fiz algo bobo, como usar 'chsh' para alterar o shell do usuário raiz para um caminho de arquivo ruim. Futuros logons na conta raiz falharão abruptamente, citando / bin / o que não for encontrado, e você será reiniciado na tela de login. Excluindo um modo de recuperação ou inserindo um LiveCD para editar / etc / passwd, quais são as minhas opções para recuperar meu sistema? Vamos supor também (por diversão?) Que não há outros usuários na roda. Pensamentos?

noffle
fonte
Esta é uma situação hipotética que você está propondo?
Chris Baixo
Eu realmente fiz exatamente isso em uma instalação do FreeBSD (relativamente nova). Desde então, foi reinstalado, então suponho que agora seja um pouco hipotético, mas estou curioso sobre qual seria o melhor caminho para a recuperação se eu realmente tivesse o sistema completo presente.
Noffle 18/09/11
Estive lá, fiz isso, peguei a camiseta. Mas, como resultado, em todas as máquinas que administro, mantenho uma conta raiz de backup, apenas por precaução.
Mark D

Respostas:

30

Ao inicializar, anexe init=/bin/bash(ou um caminho para qualquer outro shell funcional) às suas opções de inicialização - você será direcionado diretamente para um único shell do usuário. Você pode precisar fazer isso mount -o remount,rw /antes de modificar a /etc/passwdentrada nesse ambiente. Depois disso, basta reiniciar ou fazer exec /sbin/init 3. Apenas não digite exitou pressione Ctrl + D, pois isso resultaria em pânico no kernel *.

Uma variação adicional desse método pode ser necessária em alguns sistemas carregados no modo de dois estágios (com uma imagem initrd). Se você perceber que as opções de inicialização contêm init=e, o mais importante, real_init=o local a /bin/bashser colocado deve ser o último parâmetro (ie real_init=/bin/bash).

* Isso ocorre porque nesse ambiente, o shell é visto pelo kernel como o programa init - que é o único processo que o kernel conhece - representa um sistema em execução sob os olhos do kernel. De repente, encerrar esse processo, sem informar o kernel para desligar o sistema, deve resultar em pânico no kernel. (Você não entraria em pânico se de repente tudo ao seu redor ficasse preto e silencioso?)

rozcietrzewiacz
fonte
Bom para o exec, mas acho que é melhor não mexer muito com os pontos de montagem antes.
Stéphane Gimenez
2
@ Stéph Você precisa fazer isso se o seu kernel não montar leitura / gravação raiz. Caso contrário, você não poderá modificar nenhum arquivo (inclusive /etc/passwd).
rozcietrzewiacz
Bem pensado! Eu havia conseguido entrar no modo de usuário único, mas não me ocorreu que eu tivesse que remontar / como leitura / gravação para modificar / etc / passwd. Obrigado!
Noffle 19/09/11
@roz Claro, eu estava tentando dizer que cuidaria de desmontar tudo o que poderia ter sido montado (exceto /) antes de executar o init.
Stéphane Gimenez
@ Stéph Não deve haver problemas com montagens. Observe que /bin/bashé executado exatamente no ponto e, em seguida, /sbin/initseria executado na inicialização normal. Portanto, não pode haver ação possível executada pelo sistema naquele momento.
rozcietrzewiacz
10

Você pode usar sue especificar um shell para executar (não tenho certeza se você está tentando sugerir que isso não é possível com sua observação sobre a ausência de outros usuários wheel):

su -c /bin/bash

Caso contrário, você poderia fazer algo semelhante se o seu daemon ssh permitir o login no root:

ssh root@localhost /bin/bash

Você também pode definir um shell como seu init no seu gerenciador de inicialização, por exemplo, init=/bin/kshou similar.

Chris Down
fonte
1
Boas idéias. =) Como você suspeitava, nenhum outro usuário pode usar 'su'. O sshd também tem o login root desativado.
Noffle
6

Se o seu carregador de inicialização estiver configurado para permitir a edição ao vivo dos parâmetros do kernel, uma solução é reiniciar e usar um shell como processo init, por exemplo init=/bin/bash. Em seguida, monte o que precisar ser montado manualmente e edite /etc/passwd. synce inicialize novamente com o seu habitual init.

Stéphane Gimenez
fonte
Uau, eu só notei que você postou a mesma resposta no mesmo minuto como a mim mesmo :-)
rozcietrzewiacz
6

Se a essência da sua pergunta é que você bloqueou todas as maneiras de se tornar raiz, então, por definição, você não pode se tornar raiz.

É comum permitir três maneiras de se tornar root em um sistema unix:

  • Efetue login como root, digitando rootem um prompt de login e digitando a senha root. Isso executa o shell da raiz.
  • Efetue login como um usuário comum e torne-se root executando sue digitando a senha root. Em alguns sistemas, isso requer estar em um grupo específico (geralmente chamado wheel); em outros sistemas, qualquer pessoa que conheça a senha root pode se tornar root. Os sistemas que usam o PAM para autenticação usam pam_wheelpara gerenciar o grupo de roda, se houver um. Se você especificar um comando com su -c, ele será executado via shell do root.
  • Efetue login como um usuário comum e torne-se root executando sudoe digitando sua própria senha. A conta do usuário deve ter recebido poderes do sudo por um administrador. A menos que restrito no sudoersarquivo, você pode executar qualquer comando, independentemente do shell do root.

Uma maneira tradicional de se proteger contra a indisponibilidade do shell raiz é definir outra conta com o UID 0 e um shell diferente ( tooré um nome tradicional). Por exemplo, se o shell do root for um executável vinculado dinamicamente (uma boa idéia para economizar memória) e uma atualização da biblioteca der errado, o shell do root poderá ser inutilizável. A conta raiz alternativa teria um executável vinculado estaticamente, possivelmente um com utilitários comuns embutidos, como o BusyBox .

Gilles 'SO- parar de ser mau'
fonte
5

As respostas acima são ótimas e aprendi lendo-as. Se você não se lembra dos detalhes dessas abordagens e não se importa de reiniciar, sempre pode inicializar seu sistema usando uma distribuição de CD ao vivo, montar a partição / e editar / etc / passwd e reiniciar. Não é tão elegante quanto as soluções acima, mas mais fácil de lembrar.

Joe
fonte
Você deve apontar os riscos relacionados à edição manual do /etc/passwdarquivo. Fora isso, bom ponto - eu só queria adicionar a mesma sugestão à minha resposta.
rozcietrzewiacz