Recuperación de la configuración del shell de root a un archivo incorrecto


23

Digamos que he ido y he hecho algo tonto, como usar 'chsh' para cambiar el shell del usuario raíz a una ruta de archivo incorrecta. Los inicios de sesión futuros en la cuenta raíz fallarán abruptamente, citando / bin / lo que no se encuentre, y lo reiniciarán en la pantalla de inicio de sesión. Salvo un modo de recuperación o insertando un LiveCD para editar / etc / passwd, ¿cuáles son mis opciones para recuperar mi sistema? Supongamos también (¿por diversión?) Que no hay otros usuarios en la rueda. Pensamientos?


¿Es esta una situación hipotética que estás proponiendo?
Chris Down

De hecho, había hecho exactamente esto en una instalación de FreeBSD (relativamente reciente). Desde entonces se ha reinstalado, por lo que supongo que ahora es algo hipotético, pero tengo curiosidad acerca de cuál sería la mejor ruta de recuperación si realmente tuviera el sistema completo presente.
noffle

He estado allí, hecho eso, tengo la camiseta. Pero como resultado en cada máquina que administro mantengo una cuenta raíz de respaldo, por si acaso.
Mark D

Respuestas:


30

Al arrancar, agregue init=/bin/bash(o una ruta a cualquier otro shell funcional) a sus opciones de arranque; se lo colocará directamente en un solo shell de usuario. Es posible que deba hacerlo mount -o remount,rw /antes de modificar la /etc/passwdentrada en ese entorno. Después de eso, solo reinicie o haga exec /sbin/init 3. Simplemente no escriba exitni presione Ctrl + D, ya que esto provocaría un kernel panic *.

Puede ser necesaria una variación adicional de este método en algunos sistemas cargados en modo de dos etapas (con una imagen initrd). Si observa que las opciones de arranque contienen init=y, lo más importante, real_init=el lugar para colocar /bin/bashdebe ser el último parámetro (es decir real_init=/bin/bash).

* Esto se debe a que en ese entorno, el núcleo ve el shell como el programa init , que es el único proceso que el núcleo conoce, representa un sistema en ejecución debajo del ojo del núcleo. Terminar repentinamente ese proceso, sin decirle al kernel que apague el sistema, debe resultar en pánico del kernel. (¿No entrarías en pánico si de repente todo a tu alrededor se volviera negro y silencioso?)


Agradable para el exec, pero supongo que es mejor no estropear demasiado los puntos de montaje de antemano.
Stéphane Gimenez

2
@ Stéph Tiene que hacer eso si su núcleo no monta lectura-escritura raíz. De lo contrario, no podrá modificar ningún archivo (incluido /etc/passwd).
rozcietrzewiacz

¡Buen pensamiento! Me las arreglé para entrar en modo de usuario único, pero no me di cuenta de que tenía que volver a montar / como lectura / escritura para modificar / etc / passwd. ¡Gracias!
noffle

@roz Claro, estaba tratando de decir que me ocuparía de desmontar todo lo demás que podría haber sido montado (excepto /) antes de ejecutar init.
Stéphane Gimenez

@ Stéph No debería haber problemas con las monturas. Tenga en cuenta que /bin/bashse ejecuta exactamente en el punto, luego /sbin/initse ejecutará en el arranque normal. Por lo tanto, el sistema no puede realizar ninguna acción en ese momento.
rozcietrzewiacz

10

Puede usar suy especificar un shell para ejecutar (no estoy seguro si está tratando de implicar que esto no es posible con su nota sobre que no hay otros usuarios wheel):

su -c /bin/bash

De lo contrario, podría hacer algo similar si su demonio ssh permite iniciar sesión en la raíz:

ssh root@localhost /bin/bash

También puede establecer un shell como su inicio en su gestor de arranque, por ejemplo, init=/bin/ksho similar.


1
Buenas ideas. =) Como sospechaba, ningún otro usuario puede usar 'su'. sshd también tiene el inicio de sesión root deshabilitado.
noffle

6

Si su gestor de arranque está configurado para permitir la edición en vivo de los parámetros del kernel, una solución es reiniciar y usar un shell como proceso de inicio, por ejemplo init=/bin/bash. Luego, monte lo que sea necesario montar a mano y edite /etc/passwd. syncy arranca de nuevo con tu habitual init.


Wow, acabo de notar que publicaste la misma respuesta en el mismo minuto que yo :-)
rozcietrzewiacz

6

Si la esencia de su pregunta es que ha bloqueado todas las formas de convertirse en root, entonces, por definición, no puede convertirse en root.

Es común permitir tres formas de convertirse en root en un sistema unix:

  • Inicie sesión como root, ingresando rooten un indicador de inicio de sesión y escribiendo la contraseña de root. Esto ejecuta el shell de root.
  • Inicie sesión como usuario ordinario, luego conviértase en root ejecutando suy escribiendo la contraseña de root. En algunos sistemas, esto requiere estar en un grupo particular (a menudo llamado wheel); en otros sistemas, cualquiera que conozca la contraseña de root puede convertirse en root. Los sistemas que usan PAM para autenticación se usan pam_wheelpara administrar el grupo de ruedas si tienen uno. Si especifica un comando con su -c, se ejecuta a través del shell de root.
  • Inicie sesión como usuario ordinario, luego conviértase en root ejecutando sudoy escribiendo su propia contraseña. La cuenta de usuario debe haber recibido poderes de sudo por parte de un administrador. A menos que sudoersesté restringido en el archivo, puede ejecutar cualquier comando, independientemente del shell de root.

Una forma tradicional de proteger contra el shell de root no está disponible es definir otra cuenta con UID 0 y un shell diferente ( toores un nombre tradicional). Por ejemplo, si el shell de root es un ejecutable vinculado dinámicamente (una buena idea para conservar la memoria) y una actualización de la biblioteca falla, el shell de root podría quedar inutilizable. La cuenta raíz alternativa tendría un ejecutable vinculado estáticamente, posiblemente uno con utilidades comunes incorporadas como BusyBox .


5

Las respuestas anteriores son geniales y aprendí al leerlas. Si no recuerda los detalles de estos enfoques y no le importa reiniciar, siempre puede iniciar su sistema usando una distribución de CD en vivo, montar la partición / y luego editar / etc / passwd y reiniciar. No es tan elegante como las soluciones anteriores, pero es más fácil de recordar.


Debe señalar los riesgos relacionados con la edición manual del /etc/passwdarchivo. Aparte de esto, buen punto: solo quería agregar la misma sugerencia a mi respuesta.
rozcietrzewiacz
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.