domingo, 2 de octubre de 2011

Linux: The kernel SysRq and the SAK key.


Muchos usuarios de Linux, no conocen la existencia de dos combinaciones de teclas que suelen resultar muy útiles a la hora de que un equipo no responda, o al momento de loguearse en uno.

SysRq key:
Cuando hablamos de kernel SysRq key, nos referimos a una combinación de teclas especial, la cual va a realizar que un equipo paniqueado, ocrasheado, sea capaz de responder, y poder rebootear de una manera un poco más suave que dandole el botonazo.

Para poder hacer uso y utilización de esta combinación de teclas, debemos previamente tener soporte a esta en la configuración del kernel, para ello buscamos, en el archivo config de este el siguiente string, que representa un valor booleano:
#: cat /boot/config-2.6.40.4-5.fc15.x86_64 | grep -i sysrq
CONFIG_MAGIC_SYSRQ=y
En este caso se encuentra soportado, en caso contrario, habría que recompilar el kernel, dandole soporte en dicha directiva de configuración. 

En un sistema que soporte SysRq, debemos configurar si se permite realizar dicha sysrq mediante dos formas, una es mediante la sysctl kernel.sysrq, que tiene valor booleano, o la otra, pasandole "1" al archivo /proc/sys/kernel/sysrq. 
#: cat /proc/sys/kernel/sysrq
0
#: echo 1 > /proc/sys/kernel/sysrq
En muchas distribuciones de Linux, viene en el archivo /etc/sysctl.conf la directiva comentada, o puesta 0, el motivo de por que se deshabilita es que supongamos un server, al cual le hemos realizado hardening físico, bloqueando el acceso al BIOS, la posibilidad de bootear de medios secundarios, el acceso a GRUB mediante password, etc. Cualquier individuo que tenga acceso físico al equipo, y pueda conectar un teclado, o un KVM al mismo, podrá ejecutar dicha SysRq, comprometiendo la seguridad física del mismo. Así que esto debe ser utilizado con cautela.

Ahora bien, estudiemos esta SysRq en profundidad: El archivo /proc/sys/kernel/sysrq va a soportar diferentes posibles valores, acorde a lo que necesitemos tener soportado, ellos son (según la propia documentación del kernel):
   0 - disable sysrq completely
   1 - enable all functions of sysrq
  >1 - bitmask of allowed sysrq functions (see below for detailed function
       description):
          2 - enable control of console logging level
          4 - enable control of keyboard (SAK, unraw)
          8 - enable debugging dumps of processes etc.
         16 - enable sync command
         32 - enable remount read-only
         64 - enable signalling of processes (term, kill, oom-kill)
        128 - allow reboot/poweroff
        256 - allow nicing of all RT tasks
Como podemos utilizar la petición al sistema?: 

En arquitecturas x86 o x86_64, podemos realizar esto utilizando Alt + SysRq + <command-key>, SysRq suele estar localizado donde se encuentra la tecla "Print Screen" y en algunas laptops es necesario acceder a esta mediante function. 

En SPARC, es necesario utilizar ALT + STOP + < command-key> 

En consolas serial, se envia una señal de BREAK, y dentro de los cinco segundos, las posibles <command-key> 

O una forma alternativa, que funciona en cualquiera de estas antes mencionadas, escribiendo sobre el archivo /proc/sysrq-trigger. Como en Unix todo es un stream, lo que la SysRq hace, es escribirse sobre este archivo del directorio /proc/. Por ejemplo
#: echo t > /proc/sysrq-trigger
Cuales son las command-key?: 

Según la documentación del kernel, son las siguientes,


'b'     - Will immediately reboot the system without syncing or unmounting
          your disks.

'c'     - Will perform a system crash by a NULL pointer dereference.
          A crashdump will be taken if configured.

'd'     - Shows all locks that are held.

'e'     - Send a SIGTERM to all processes, except for init.

'f'     - Will call oom_kill to kill a memory hog process.

'g'     - Used by kgdb (kernel debugger)

'h'     - Will display help (actually any other key than those listed
          here will display help. but 'h' is easy to remember :-)

'i'     - Send a SIGKILL to all processes, except for init.

'j'     - Forcibly "Just thaw it" - filesystems frozen by the FIFREEZE ioctl.

'k'     - Secure Access Key (SAK) Kills all programs on the current virtual
          console. NOTE: See important comments below in SAK section.

'l'     - Shows a stack backtrace for all active CPUs.

'm'     - Will dump current memory info to your console.

'n'     - Used to make RT tasks nice-able

'o'     - Will shut your system off (if configured and supported).

'p'     - Will dump the current registers and flags to your console.

'q'     - Will dump per CPU lists of all armed hrtimers (but NOT regular
          timer_list timers) and detailed information about all
          clockevent devices.

'r'     - Turns off keyboard raw mode and sets it to XLATE.

's'     - Will attempt to sync all mounted filesystems.

't'     - Will dump a list of current tasks and their information to your
          console.

'u'     - Will attempt to remount all mounted filesystems read-only.

'v'     - Forcefully restores framebuffer console
'v'     - Causes ETM buffer dump [ARM-specific]

'w'     - Dumps tasks that are in uninterruptable (blocked) state.

'x'     - Used by xmon interface on ppc/powerpc platforms.

'y'     - Show global CPU Registers [SPARC-64 specific]

'z'     - Dump the ftrace buffer

'0'-'9' - Sets the console log level, controlling which kernel messages
          will be printed to your console. ('0', for example would make
          it so that only emergency messages like PANICs or OOPSes would
          make it to your console.)

Si bien es casi imposible recordar esto, tenemos una bastante interesante: SysRq + ALT + H, que nos va a mostrar una pequeña ayuda sobre como debemos realizar esto, H, es más fácil de recordar.

En caso de tratar de memorizar una combinación podemos usar REISUB donde R pone el teclado en modo XLATE, E va a mandar SIGTERM (-15) a todos los procesos y hacer que estos terminen bien, con la I vamos a enviar SIGKILL (-9) en caso de que no terminen con el SIGTERM enviado anteriormente, S va a intentar hacer sync a los discos, de los datos que están actualmente en memoría y estaban encolados esperando para escribirse, U, va a intentar remontar todos los filesystems como read-only (ro), y B va a rebootear el sistema inmediatamente, sin matar los procesos y lo aún mas peligroso sin hacer sync a disco. Cabe destacar que tenemos que ir presionando esto de a una vez, ya que vamos probando alternativas hasta llegar a la última, y mas grave de ellas.

En caso de no funcionar esto, debemos mapear el keycode de SysRq, que tiene el valor 99 en KEY_SYSRQ en el archivo includes/linux/input.h. Podemos usar showkeys -s, para saber el keycode de la tecla correcto y mapearlo. 

The SAK key:

SAK, significa Secure Attention Key, en teoría de sistemas operativos, esto es una herramienta de seguridad, que nos va a proveer protección contra software capaz de capturar un password al momento del login, como puede ser el caso de un rootkit o un troyano. SAK es una manera de matar todos los programas que pueden estar enmascarados como aplicaciones de login, y así proveer un ingreso seguro de password en el sistema.

La regla dice, que el usuario debe proveer esta combinación de teclas antes de ingresar sus datos de login, asi matar cualquier proceso que este corriendo, haciendose pasar por dicho programa de login, y proveer de manera segura esta clave. 

En teclados del tipo PC, esta combinación de teclas se consigue presionando ALT + SysRq + K. En el caso de que se este corriendo un servidor gráfico bajo el runlvel 5, al presionar dicha combinación de teclas, el mismo va a ser cerrado y vuelto a abrir, En caso de que se este ejecutando este desde otro runlevel, (por ejemplo el 3), deberemos cargarlo a mano nuevamente.

Como podemos hacer uso y mapear SAK? 

La manera correcta es hacerlo mediante loadkeys, es por eso, que podemos incluir en /etc/rc.sysinit o /etc/rc.local, la siguiente línea:
#: echo "control alt keycode 101 = SAK" | /bin/loadkeys
 En este caso, debido a que CTRL + ALT + DEL se usa para rebootear el sistema, CTRL + BACKSPACE para reiniciar el servidor X, se eligió utilizar CTRL + ALT + PAUSE, para de esta manera tener SAK de manera más sencilla de utilizar y no enredar los dedos al intentar tipearla :-P

Si quieren aprender más respecto a esto, pueden leer la documentación del kernel que pueden encontrarla en /usr/share/doc/kernel-doc-$(uname -r)/Documentation, si es que se encuentra instalada, sino en RHEL/CentOS/Fedora pueden hacer instalar el paquete kernel-doc.

No hay comentarios:

Publicar un comentario