¿Cómo deshabilitar los comandos de terminal de miedo?

82

¿Cómo deshabilita los comandos de terminal de miedo?

Estaba usando SSH para acceder a un servidor Ubuntu remoto sin acceso al servidor físico. Pensé que estaba escribiendo ' shutdown' en el servidor NoSQL que se ejecuta en el sistema operativo Ubuntu, pero en realidad le dije al servidor Ubuntu que se apagara. Luego tuve que decirle al administrador del servidor lo que hice para que él pudiera iniciar el servidor físico por mí. ¡Eso fue embarazoso!

¿Cómo puedo evitar que esto vuelva a suceder?

Fuegos melodiosos
fuente
100
Esto se ha discutido en longitudes, generalmente con relación a las rmcuales tiene peores efectos secundarios que shutdown. En pocas palabras: aquí no hay forma de evitar que sucedan cosas malas si sigue ejecutando comandos aleatorios como root.
Dmitry Grigoryev
55
Como otras personas han notado con respecto al alias, hacerlo puede hacer que las personas "se habitúen a que un comando funcione de una manera no estándar". Entonces, ¿le parece malo a alguien que el tonto servidor NoSQL use este comando?
bmb
El servidor NoSQL que estaba usando es Redis.
MelodiousFires
6060
Simplemente no trabaje bajo la cuenta raíz.
alk
12
Me atrevo a decir que aprendiste la lección, así que no tendrás que sentir la necesidad de deshabilitar ningún comando nuevamente. También agregaría que no es infalible GNU / Linux, simplemente se vuelve mejor que el tonto.

Respuestas:

204

La respuesta estándar es "no iniciar sesión como root". Todos los comandos ejecutados como root dan miedo. Si esa no es una opción, podría poner algunos comandos de alias en su .bashrcpara deshabilitar los comandos que encuentre especialmente atemorizantes. Por ejemplo:

for scary in shutdown halt  reboot rm
do
    alias $scary="echo If you really want to do that, type: `which $scary`"
done

Luego, si escribe shutdown, recibirá el siguiente mensaje:

If you really want to do that, type: /sbin/shutdown

( Asegúrese de que su .bashrcha cargado en primer lugar, antes de probar esto en un servidor de producción)

Salir de su sshsesión actual e iniciar sesión nuevamente, o usar . ~/.bashrcdebería cargar / ejecutar .bashrc. Quizás intente ejecutar rmsin ningún argumento para asegurarse de que su servidor no haya deshabilitado la carga automática .bashrcen inicios de sesión o similares.

Tenga en cuenta que si su principal preocupación es detener y apagar, podría considerar instalar molly-guard , lo que le hará escribir el nombre de host antes de apagar la máquina. Esto es más útil si apaga regularmente sistemas operativos completos en la línea de comandos, pero desea asegurarse de que está cerrando el correcto.

También puede probar probar esto con un comando menos aterrador como cerrar sesión o salir.

gmatht
fuente
70
no inicie sesión como root : esto no ayudará si está confundiendo la máquina en la que ha iniciado sesión. Sugeriría cambiar el indicador a algo que le dé una señal visual.
isanae
145
Aliasing comandos "de miedo" para tener un comportamiento "seguro" es, en mi experiencia, una mala idea. Esto se debe a que las personas tienden a acostumbrarse a que un comando funcione de manera no estándar, lo que puede hacer que hagan cosas muy lamentables cuando están en un sistema de vainilla. La respuesta simple es pisar con mucho cuidado al iniciar sesión como root.
TimGJ
22
@isanae El acceso directo que usé para abrir una terminal con ssh al servidor de producción haría que el fondo de la terminal se pusiera de color rojo claro. Eso me hizo prestar atención.
Peter - Restablece a Monica el
66
sourcees un alias .y no es compatible con todos los shells.
gronostaj
44
También tenga en cuenta que si bien Debian y, por extensión, Ubuntu tienen la ~/.bash_profilefuente predeterminada .bashrc, que no es un comportamiento estándar y en la mayoría de los sistemas, .bashrcno se lee al iniciar sesión a través de ssh, por lo que esto no hará una diferencia allí. Es mucho mejor agregar los alias ~/.profileo en su ~/.bash_profilelugar.
terdon
73

sudoexiste por una razón: úsala. Cuando finaliza su comando (en este caso, una CLI interactiva), regresa a su shell de nivel de usuario, no a un shell raíz. Hay muy pocas razones valiosas para estar en un shell de raíz. (Me sorprende que esto ya no sea una respuesta ...)

Habiendo dicho eso, no seas un muppet que usa sudopara todo . Comprenda lo que está haciendo y comprenda por qué requiere o no privilegios de root.


Además, puede diferenciar su solicitud de shells raíz / usuario. Esto también hace que sea más obvio que está de vuelta en el indicador de comandos de shell y no " alguna otra CLI ". El mío es muy colorido y tiene mucha información útil (como el nombre de host), lo que hace que sea muy simple saber en qué host se ejecutará el comando, y también hace que sea más fácil mirar hacia atrás a través de tu historial y localizar indicaciones, una raíz Shell utiliza el indicador predeterminado.

Mi PS1

Esto es más adecuado para usar en " su " cuenta, pero si se está tomando en serio la seguridad / administración de sistemas, entonces no compartirá contraseñas / cuentas, y no estará sentado en un shell de raíz sin ser completamente consciente.


Como la gente ha dicho una y otra y otra vez, " alias de comandos para crear un entorno seguro es una mala idea ". Te sentirás cómodo en tu entorno seguro, escribiendo esos comandos 'aterradores' donde no deberías. Entonces, un día cambiarás de trabajo, o iniciarás sesión en una nueva máquina, y luego boom " whoopsy, no quise hacerlo, lo siento " ...

Attie
fuente
2
¿No tendría el mismo problema con él sudo shutdown? Si lo ejecuta en la máquina incorrecta, seguirá siendo un desastre.
Barmar
2
@Barmar ¿NoSQL entiende el comando sudo?
Taemyr
2
@Taemyr sudoes un comando de shell, no tiene nada que ver con la base de datos.
Barmar
44
@Barmar: En realidad, creo que el OP significaba escribirlo en un programa cmdline NoSQL, no en bash. Entonces no habrían escrito sudo shutdown, ya que supongo sudoque no es un comando NoSQL. No estar en un shell de raíz habría resuelto totalmente ese problema y sería una muy buena idea. Así que miraría el aviso cuidadosamente antes de ejecutar comandos importantes.
Peter Cordes
44

El paquete 'molly-guard' (al menos en los sistemas derivados de Debian) instalará un contenedor para apagar, detener, apagar y reiniciar. Si detecta que el terminal es remoto, solicitará el nombre del host. Si no coincide, el comando se cancela.

CSM
fuente
44
¿Qué pasa con otras cosas (posiblemente más aterradoras) rm -rf /?
marcellothearcane
99
@marcellothearcane set -upodría ayudar con eso en algunos casos, como al escribir rm -rf /$SOME_VARIABLE_WHICH_I_THOUGHT_EXISTS_BUT_DOESNT.
Alex Hall
44
@marcellothearcane En cualquier cosa que se parezca a un sistema Linux moderno, que necesita y --no-preserve-rootque es poco probable que escriba por accidente.
un CVn
3
quién es Molly, me pregunto ... probablemente el gato de alguien.
the0ther
77
@ the0ther, un niño de 2 años, que activó el interruptor SCRAM en una máquina de dinosaurios, dos veces en el mismo día. La gente en la habitación colocó una tapa en el interruptor. catb.org/jargon/html/M/molly-guard.html
CSM
4

Acepté una respuesta que me gusta mucho, sin embargo, si alguien más está leyendo y quiere una respuesta más simple, aquí está la mía.

Encuentra el archivo .bashrc y ponlo como la última línea:

alias shutdown=notforuse

Luego, cuando escribes apagado, obtienes algo como ~bash: notforuse is not a command

Esto puede ser una tontería, pero es simple y funciona. Sin embargo, agradezco las respuestas con mejores formas de hacerlo.

Fuegos melodiosos
fuente
44
Hm, solía hacer esto con rmpersonas trolls ...alias rm='echo "You can't use rm!" #'
MD XF
52
Creo que esta es una mala idea, por tres razones. Primero, es confuso para cualquier otra persona que tenga acceso de root a la máquina. En segundo lugar, le enseña que está bien escribir "shutdown" y presionar enter, lo que significa que es probable que cometa el mismo error en el próximo sistema al que tenga acceso de root. Tercero, esto se volverá extremadamente confuso si alguna vez hay un comando válido llamado notforuseen la ruta.
David Richerby
55
Estoy con @DavidRicherby en este caso. No es Buena idea.
Tico
Si realmente desea utilizar los alias, al menos puede poner todos esos alias de comando que asustan en un archivo, digamos ~/.SaveMyReputationy agreguemos como última línea de su .bashrclínea [ -f ~/.SaveMyReputation ] && source ~/,SaveMyReputation. Es posible que desee agregar una línea adicional echo "#Scaring command protected shell, comment the last line of .bashrc and log again to have a full working shell"dentro de ese archivo. Al menos puede traer este archivo de alias en otra máquina (debería serlo .bash_aliases, pero en este caso "obsoleto" es mejor usar otro nombre).
Hastur
Si vas a hacer esto, hazlo menos confuso usando un nombre como alias shutdown=shutdown-disabled-by-an-alias. (Esto solo resuelve el tercer y más pequeño problema que señaló @DavidRicherby). Aunque probablemente solo le tomará 2 segundos a la siguiente persona pasar de ver notforuse is not a commanda correr type -a shutdowny encontrar el alias, luego escribir sudo \shutdownpara deshabilitar la expansión de alias. (Suponiendo que se hayan sudoalias para sudo='sudo 'que expanda los alias en su primer argumento).
Peter Cordes
1

Para shutdown( reboot, halty afines): Tengo una copia de preguntarme si estoy realmente seguro (y no hace nada de todos modos). Almaceno tales guiones en /usr/local/sbin. En Debian, esto tiene otra prioridad /sbin(es el primer directorio de PATH).

Las secuencias de comandos del sistema usan la ruta completa, por lo que este truco me impide detener un servidor remoto en lugar de una máquina local (un mal comportamiento de Awesome WM), pero no tiene otro efecto indirecto, y todavía puedo usarlos como / sbin / shutdown cuando realmente lo necesito .

Giacomo Catenazzi
fuente
Dichos hacks solo funcionan si los aplicas a cada computadora en la que inicias sesión ... eso a menudo es poco práctico, y no lo descubrirás hasta que sea demasiado tarde: escribiendo shutdownen un sistema crítico que no tenga tu hack.
jpaugh
@jpaugh: sí, es un truco, y lo uso solo para mis servidores personales, donde a menudo me conecté, y los terminales permanecen abiertos durante demasiado tiempo. [Nota: también utilizo indicaciones de color diferentes para mis máquinas personales: raíz remota, usuario remoto, raíz local, usuario local]. En el caso de servidores reales y máquinas remotas, evito el rooteo y voy a rootear lo menos posible, y seguro, sin olvidar salir de ellos. Solo estoy usando mis controles remotos como "nube" (antes de la exageración de la nube, por lo que se manejó de la manera antigua).
Giacomo Catenazzi
1

El archivo Sudoers permite un nivel de granularidad mucho más fino que solo * 'puede usar sudo' *, en particular puede usar alias de comando para crear listas blancas de grupos de comandos a los que un usuario o grupo en particular está restringido. He trabajado con servidores remotos que estaban restringidos al acceso ssh y permitían sudo sin contraseña (requerimos claves ssh protegidas con contraseña). Hay algunas buenas razones para hacerlo, pero tiene peligros, por lo que utilizamos alias de comando para permitir el acceso sin restricciones a las cosas que tienen que hacer (reiniciar servidores, etc.) sin otorgarles privilegios por lo que no hicieron.

También hay una sintaxis para decir 'no se puede ejecutar este comando' . Se puede evitar, por lo que no se debe usar como una medida de seguridad real, pero funcionaría para el escenario que describió.

Man Sudoers tiene algunos buenos ejemplos sobre cómo configurar todo esto.

Por supuesto, esto requiere usar sudo, pero eso debería ser evidente.

tallus
fuente
1

Es posible que haya sido víctima de una nueva estupidez de Ubuntu.

Ubuntu solía tener el shutdowncomando normal y clásico que requiere un argumento de tiempo obligatorio.

Esto es lo que sucede en Ubuntu 12 si escribo shutdown, incluso como usuario habitual:

$ shutdown
shutdown: time expected
Try `shutdown --help' for more information.

Entonces

$ shutdown +100
shutdown: need to be root.

Ahora, aquí está Ubuntu 16.10. No soy root

$ date ; /sbin/shutdown
Fri Jun 23 16:00:16 PDT 2017
Shutdown scheduled for Fri 2017-06-23 16:01:16 PDT, use 'shutdown -c' to   cancel.

Sin argumentos, programa un apagado para 60 segundos más tarde, e incluso si no es root, solo una cuenta hecha con privilegios de administrador.

La culpa canónica.

Kaz
fuente
66
/sbin/shutdown se proporciona por systemd-sysvpaquete de manera predeterminada, por lo que no es estupidez de Ubuntu, es systemdestupidez, y no proviene de Ubuntu, sino de Debian al menos, que, a su vez, parece tomar todo el systemdmovimiento de Red Hat. Al culpar, culpe a la entidad correcta, no solo a la que no le gusta.
Ruslan
1
@Ruslan Nadie que empaque esta basura en su distribución escapa a la culpa de la estupidez.
Kaz
0

Para el apagado hay molly-guard. Solo necesita instalarlo y cuando intenta cerrar a través de ssh, le pide que escriba el nombre de host.

Para eliminar archivos hay soluciones como libtrash, que emula una papelera a través de una LD_PRELOADbiblioteca.

Y puede probar qué archivos está cambiando / eliminando / ... con el programa quizás . Eso es genial cuando se prueba algo.

allo
fuente
1
Esto maybeparece estar roto por el diseño: tropezar algunas llamadas al sistema con no-ops bloqueará cualquier programa no trivial que se base en estas llamadas al sistema para tener éxito.
Dmitry Grigoryev
-2

Intente esto: cuando esté en un shell remoto, cada vez que esté a punto de escribir la tecla "retorno", pare durante 5 segundos, con el dedo sobre la tecla "retorno", y vuelva a leer el comando que está a punto de enviar. ¿Está bien? ¿Estás seguro?

Esto parece duro, pero, por otro lado, no deberíamos pasar mucho tiempo en proyectiles remotos. Deberíamos encontrar todas las formas de automatizar nuestro trabajo de mantenimiento para que raramente, si alguna vez, necesitamos iniciar sesión en un servidor remoto.

xpmatteo
fuente
Intenté eso, no funcionaba. Entré shutdown, me detuve durante 5 segundos, volví a leer el comando (¡en voz alta!) Y estoy seguro de que era correcto. Luego presione enter y el comando se acaba de ejecutar. Así que eso no deshabilitó los comandos de miedo, me temo. Intentaré con esta cosa que pasa el dedo, tal vez la distancia era demasiado pequeña / grande.
wojciech_rak