G A C E T A   D E   L I N U X
...haciendo a Linux un poco más divertido!

Investigando el "Saludo de los tres dedos"
Por Dean Wilson
Traducción al español por José Ramón Alonso Tapia
el día 18 de Agosto 2003, para La Gaceta de Linux

"La máquina sólo está ejecutando una aplicación, está totalmente actualizada y tiene un cortafuegos que rechaza el servicio por defecto."
"¿Qué pasa si hago Ctrl-Alt-Delete?"

Introducción

Una de las premisas en seguridad de computadoras es que es casi imposible evitar ataques a una máquina si el posible atacante tiene acceso físico a ella. Aunque no podemos tratar todos los casos, podemos hacer algunos pequeños cambios para evitar la más obvia y descarada intromisión en nuestra máquina. Así pues, este documento explicará cómo evitar que una persona sin autorización reinicie sus computadoras.

El Problema

Cualquiera que usa un teclado conectado a una máquina Linux puede presionar Control-Alt-Delete para reiniciarla sin introducir un nombre de usuario o una contraseña. Incluso las máquinas Windows piden un registro válido (bien el del usuario actual o bien uno con privilegios de administrador) para reiniciar una máquina en ejecución que tiene bloqueada la pantalla. Esto no tiene que ser por malicia, es normal que un usuario de Windows NT o Windows 2000 presione Control-Alt-Delete durante una sesión de X-Windows para bloquear la computadora o abrir el gestor de tareas y en vez de eso, vean el terrible mensaje "The system is going down for reboot NOW!" (¡El sistema se va a reiniciar AHORA!), indicando que su trabajo desaparece mientras la computadora se apaga.

Una Solución

En muchas distribuciones de Linux la combinación de teclas Control-Alt-Delete (a menudo llamada "ctrl-alt-del" o "el saludo de los tres dedos") está preconfigurada para reiniciar la máquina. Aunque esto puede ser aceptable para un sólo usuario en casa, es un riesgo innecesario para las estaciones de trabajo de oficinas o incluso para los servidores, por un hecho importante: este proceso no necesita autentificación.

Para evitar este comportamiento destructivo, vamos a capturar los sucesos "Control-Alt-Delete" y deshabilitar esta "característica" sustituyendo la acción por defecto con un archivo de guiones creado por nosotros. También añadiremos una funcionalidad que capture y registre cualquier intento de reinicio. Para hacer esto, añadiremos un fichero de comandos al sistema y cambiaremos el fichero de configuración '/etc/inittab', de forma que sea invocado nuestro propio gestor y luego se añada un pequeño registro de rotación (si se ejecuta 'logrotate').

El archivo de comandos bash que hace casi todo el trabajo se llama 'audit_cad.sh' y está aquí. Se puede invocar de dos maneras. La primera consiste en llamarlo con el argumento '-c'. De este modo el archivo de comandos comprobará que todas sus dependencias externas existen y se pueden ejecutar. Esta es la mejor forma de asegurarse de que el sistema satisface todos los prerrequisitos.

Si falla alguna de las pruebas, aparecerá un error con el nombre del fichero binario sospechoso y el archivo de comandos seguirá ejecutándose hasta que haya terminado todas las comprobaciones. Si alguna de estas comprobaciones falla, el archivo de comandos devolverá el código de salida '1' al terminar su ejecución. Los ficheros binarios involucrados son los siguientes:

De todos estos, el único fichero que quizás se necesite editar manualmente es basename ,que suele estar en el directorio '/usr/bin' o en el '/bin' . Normalmente, cuando se instale el archivo de comandos, éste se ejecuta en modo de comprobación para asegurarse de que se ejecuta correctamente y no falta nada. Como este archivo se ejecuta en modo superusuario, hay que asegurarse de dar los permisos apropiados para que sólo el superusuario pueda acceder al fichero. Idealmente, los permisos deberían tener estos valores -rwx------, esto se puede hacer con el siguiente comando: 'chmod 0700 audit_cad.sh'.

La segunda manera de llamarlo es sin argumentos; en este modo se registra una entrada en dos ficheros: en 'syslog' (con unos niveles y unas facilidades especificados por el usuario) y en un fichero externo, que por defecto es '/var/log/shutattempt'.

En este documento, el archivo de comandos se llama 'audit_cad.sh' y está en el directorio '/usr/local/sbin/'. Para cambiar una de estas dos opciones o cualquier otra, simplemente se abre el archivo con un editor cualquiera y se baja hasta la línea correspondiente a esa opción. Todas las opciones de configuración están comentadas.

Ahora que hemos terminado con el archivo de comandos, vamos a editar el gestor por defecto para Ctrl-Alt-Delete en el fichero '/etc/inittab' . La línea que nos interesa le dice a 'init' que capture los sucesos "Control-Alt-Delete" y que ejecute un comando específico cuando se produzca uno. En la mayoría de las distribuciones el identificador será 'ca' y la línea será similar a ésta: "ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now" Lo más importante de esta línea es el último campo, que empieza con '/sbin/shutdown'. Para cambiar el comportamiento del sistema, se puede editar este comando y hacer que apunte a nuestro archivo 'audit_cad.sh' . Si se han seguido todos los ejemplos, el camino absoluto será '/usr/local/sbin/audit_cad.sh'

Una vez que se ha hecho el cambio anterior, hay que decir al proceso 'init' que 'inittab' ha cambiado. La forma más fácil de hacerlo es ejecutar 'telinit q' , lo cual origina que 'init' relea su fichero de configuración sin tener que reiniciar.

Ahora ya podemos probar los cambios que hemos hecho; antes de hacer esto, recomiendo cerrar todas las aplicaciones que no sean absolutamente necesarias para el sistema, tales como los entornos gráficos y los programas de edición. Si hemos cometido un error al seguir los ejemplos, el sistema está a punto de reiniciarse ¡y es mejor estar seguro que enfadarse con el autor! Cuando se esté listo, se presiona Ctrl-Alt-Delete y no debería pasar nada en absoluto.

Si el sistema está todavía en funcionamiento, entonces se comprueban el fichero de registros del sistema (normalmente es '/var/log/messages' o '/var/log/syslog') y el fichero externo de registros que especificamos en el fichero 'audit_cad.sh' para asegurarse de que no hubo problemas en el ingreso. Si el sistema se ha reiniciado, compruebe cada paso e inténtelo otravez.

Una vez que funciona todo lo anterior, merece la pena ir más allá y añadir algún tipo de procesamiento automático de los registros. Esto se puede hacer usando 'SWATCH' o 'logwatch' para enviar alertas automatizadas; o añadiendo rotación de registros para controlar el tamaño del fichero. A continuación hay un sencillo ejemplo, que asume que tiene el comando 'logrotate' en su máquina (las últimas distribucines de Redhat y Debian lo tienen). Tambén aquí.


daily
rotate 7
compress
delaycompress

/var/log/shutattempt {
nomail
notifempty
missingok
create 0600 root root
}

Para añadirlo a la lista de procesamiento de 'logrotate', tan solo hay que añadir un fichero llamado audit_cad a su directorio 'logrotate' , que suele estar en '/etc/logrotate.d' , con el código de arriba u otro similar y así no hay que preocuparse más porque la lista ocupe demasiado espacio en el disco.

Comentarios finales

Aunque esta técnica registrará correctamente cualquier intento de reiniciar la máquina, hay que destacar dos puntos. El primero es la contabilidad, pues el archivo de comandos presentado no puede, por si solo, determinar quién intentó tomar el control de la máquina. Como no hay ninguna autentificación para los ingresos, 'init', el programa que realmente gestiona el suceso Ctrl-Alt-Delete, se ejecuta como superusuario. En consecuencia, cualquier intento de capturar el nombre de usuario invocado devolverá el superusuario ("root")'.

Haciendo algunos pequeños cambios en 'audit_cad.sh' , se podría capturar la salida de w o who para los registros, pero esta información no es tan útil como se podría pensar, pues estos comandos sólo siguen la pista a los usuarios válidos que han dado sus claves para ingresar. Sin embargo, cualquiera que vaya hasta el teclado y presione Control-Alt-Delete no necesita introducir ninguna clave, así que ¡la persona que realmente usó el teclado es la única que no se registró!

El segundo punto es considerar si este archivo de comandos se quiere ocultar. Si se es astuto y se quiere esconder, se puede llamar 'shutdown' y guardarlo en un directorio extraño.

Lecturas adicionales

Para más información sobre el formato y el propósito de 'inittab' se puede ver 'man 5 inittab' y para una lista completa de las opciones de 'telinit' se puede leer 'man 8 telnint'. Si se desconoce el comando 'logrotate' , entonces su página en el manual es un buen punto de partida: 'man 8 logrotate'.

 

[BIO] Dean Wilson es (esta semana) un administrador de sistemas y un colaborador ocasional de esta revista; desde www.unixdaemon.net


Copyright © 2003, Dean Wilson. Licencia de copia http://www.linuxgazette.com/copying.html
Publicado en el números 93 de Linux Gazette, agosto de 2003