jueves, 7 de noviembre de 2013

Los insultos de sudo... y nuestros insultos

El otro día me aburría y decidí tomarme una cerveza y leer el manual de sudoers (el fichero de configuración de sudo), lo típico que haría cualquiera para desaprovechar bien el tiempo.

Al grano, resulta que una de las opciones es la siguiente:

insults         If set, sudo will insult users when they enter an incorrect password.  This flag is off by default.

Para activarla y ver su comportamiento añadimos la siguiente línea a /etc/sudoers:

Defaults    insults

Ahora cuando algún usuario introduzca mal la contraseña, sudo amablemente le insultará :).

$ sudo echo "no me se la contraseña"
Password:
Wrong!  You cheating scum!
Password:
And you call yourself a Rocket Scientist!
Password:
No soap, honkie-lips.
sudo: 3 incorrect password attempts

Bueno, esto está bien y tal, tiene su cierto toque de gracia, pero más divertido es que si somos el administrador de la máquina (o más de una) cambiemos los insultos y le pongamos algunos personalizados, bien sea en español en nuestro caso o más divertido aún, que tengan que ver con el ámbito (la empresa, la uni, la casa o lo que sea). Este ha sido el proceso que he seguido yo para conseguirlo (uso ubuntu 12.04).
  1. Me bajé el código fuente de sudo (estas son las tonterías que hace que sea un ferviente defensor del software libre, entre otras).
    • $ apt-get source sudo
  2. Extraemos el paquete.
    • $ tar xvzf sudo_1.8.3p1-1ubuntu3.4.debian.tar.gz
  3. Después tenemos que empezar a buscar dónde anda toda la parte de los insultos. Sorprendentemente sudo no busca los insultos en algún fichero, sino que los tiene directamente hardcodeados dentro del binario... no sé por qué. Acabaremos encontrando que los insultos están en el directorio plugins/sudoers, que el fichero insults.h es el que controla cuáles insultos se incluyen y cuáles no, y que los distintos tipos de insultos están en los ficheros ins_*.
  4. A partir de aquí modificamos el fuente de la manera que más nos guste para añadirle nuestros insultos, recompilamos e instalamos, lo típico.
Veámos un pequeño ejemplo. Para empezar creo un nuevo fichero con la estructura adecuada con mis insultos.

$ vim my_own_insults.h

  1 #ifndef _MY_OWN_INSULTS_H
  2 #define _MY_OWN_INSULTS_H
  3
  4     "MAAAAAAAAAAAAAAAAAAAAL!",
  5     "Paquete",
  6     "Intentando fuerza bruta? JA!",
  7     "Ponte a estudiar",
  8     "Menos de 100m en el d3? Pobre",
  9     "Yarr mola",
 10
 11 #endif


Ahora modificamos insults.h para incluir nuestros insultos (muestro sólo las líneas relevantes con lo que yo hice en negrita).

 21 #if defined(HAL_INSULTS) || defined(GOONS_INSULTS) || defined(CLASSIC_INSULTS) || defined(CSOPS_INSULTS) || defined (MY_OWN_INSULTS)
...
 29 #ifdef MY_OWN_INSULTS
 30 #   include "my_own_insults.h"
 31 #else

 32
 33 #   ifdef HAL_INSULTS
 34 #       include "ins_2001.h"
 35 #   endif
 36
 37 #   ifdef GOONS_INSULTS
 38 #       include "ins_goons.h"
 39 #   endif
 40
 41 #   ifdef CLASSIC_INSULTS
 42 #       include "ins_classic.h"
 43 #   endif
 44
 45 #   ifdef CSOPS_INSULTS
 46 #       include "ins_csops.h"
 47 #   endif
 48 #endif


Lo he puesto para que si estan mis insultos no esté ninguno más. Ahora continuamos con los típicos pasos de configuración, compilación e instalación. En el directorio donde se encuentra el script de configure:

$ ./configure --with-insults

No estoy seguro de si hace falta ponerle el --with-insults o ya viene por defecto, pero para el caso da lo mismo. Antes de compilar modificamos el makefile de plugins/sudoers/ para que al compilar se defina la macro MY_OWN_INSULTS, de la que dependen nuestros insultos, si no lo hacemos nos quedaremos con un palmo de narices jeje:

$ vim plugins/sudoers/Makefile
...
 56 CFLAGS = -g -O2 -DMY_OWN_INSULTS
...

Y ahora ya el proceso normal:

$ make && make install
$ sudo echo "hola"
Password:

Yarr mola

Fácil, rápido y para toda la familia. Ahora replicamos el sudo de esta máquina por el resto de máquinas que administremos y nos echamos unas risas :D.

Saludos.