mitago.net

Página web de Celso González

Implementación de OTP

OTP, acrónimo de One Time Password, es un sistema para generar y validar contraseñas de un sólo uso para mejorar la seguridad de los sistemas.

Supongamos el caso en que tenemos que conectarnos a un ordenador remoto y no disponemos de una terminal segura, en modo paranoico sólo mi portatil es seguro, y no podemos saber si el ordenador en el que estamos tiene instalado un keyloger. La solución a esto es usar una contraseña que una vez introducida deja de tener validez y es sustituida por otra.

Para hacer esto de una forma fácil vamos a emplear los siguientes programas opie-client, opie-server y libpam-opie. Opie nos hace un desafio, una secuencia de números y letras, al intentar conectarnos. Usando una calculadora de claves y una frase de paso generamos la contraseña que va asociada a ese desafio y es la que necesitaremos para entrar.

Generación de claves

En la máquina a la que queremos conectarnos. Para cada usuario ejecutaremos:

$ opiepasswd -c
opiepasswd -c
Adding celso:
Only use this method from the console; NEVER from remote. If you are using
telnet, xterm, or a dial-in, type ^C now or exit with no password.
Then run opiepasswd without the -c parameter.
Using MD5 to compute responses.
Enter new secret pass phrase: xxxx
Secret pass phrases must be between 10 and 127 characters long.
Enter new secret pass phrase: xxxxxxxxxxx
Again new secret pass phrase: xxxxxxxxxxx

ID root OTP key is 499 am0001
PEW NEED JOLT CUNY FISH ROME

En este caso he añadido el usuario celso y cuando me ha pedido la frase de paso he puesto una corta para que se vea el mensaje de error. Nunca tenemos que utilizar la frase de paso como contraseña en el login, sólo para generar las claves (parecido a gpg).
Si no tenemos acceso seguro a la máquina no se debe usar la opción -c

Una vez realizado este paso vemos que nos ha generado la clave de login "PEW NEED JOLT CUNY FISH ROME" para el desafío "499 am0001". El número de desafío va en orden descendente y cuando intentemos entrar de nuevo nos pedirá el desafío "498 am0001". Cuando te queden pocos números te tocará generar una nueva clave usando de nuevo opiepasswd.

Modificación de PAM

Creo que PAM es uno de esos grandes desconocidos de linux, a la vez que uno de los más potentes. No voy a entrar en detalles y me limitaré a indicar lo que hay que cambiar tal como recomienda la documentación de debian.

En el fichero /etc/pam.d/common.auth o si este no existe en cualquiera de los servicios de este directorio que nos pida auth (login, sudo, su, ssh...) se trata de sustituir el auth pam_unix.so por uno que también llame a pam_opie. Para una instalación estándar de debian sólo hay que tocar el common.auth para que quede así

#
# /etc/pam.d/common-auth - authentication settings common to all services
#
auth  sufficient  pam_unix.so
auth  sufficient  pam_opie.so
auth  required pam_deny.so

#Datos antiguos
#auth   required        pam_unix.so nullok_secure

Con esto conseguimos que primero nos pida el login normal (sufficient pam_unix) es decir el comportamiento normal de antes. Si no ponemos nada y pulsamos intro pasa a pedirmos el login usando el desafío de opie (sufficient pam_opie) y en caso de que también pulsemos intro nos denegará el acceso (required pam_deny). Veamos un ejemplo de login en el que he pulsado intro las dos veces.

celso@amd64:~$ su
Password:
otp-md5 498 am0001 ext, Response:
su: Authentication failure
Sorry.

Usando la calculadora

Vemos que en el ejemplo de login anterior nos ha propuesto el desafío "498 am0001", veamos como usar el generador de claves para obtener la combinación para hacer login. El programa que necesitamos es el que se encuentra contenido en opie-client que se llama opiekey.

El funcionamiento es extremadamente sencillo, llamamos a opiekey pasando como parámetro el desafío y al introducir nuestra frase de paso nos genera una clave. Veamos de nuevo un ejemplo:

$ opiekey 498 am0001
Using the MD5 algorithm to compute response.
Reminder: Don't use opiekey from telnet or dial-in sessions.
Enter secret pass phrase: xxxxxxxxxxx
EARN FINE VOID BUG PLY EYE

La clave que debemos utilizar para entrar en la máquina es "EARN FINE VOID BUG PLY EYE" y sólo nos servirá esa vez ya que a la siguiente el desafío habrá cambiado.

Consideraciones finales

opiekey solo se puede usar en una máquina segura, si no tenemos el mismo problema que el presentado al principio

Podemos generar varias claves de una tacada, utiles para imprimir en una tarjeta, usando el parámetro -n número en opiekey. Por ejemplo, usando opiekey -n 10 498 am0001 generaremos las claves de la 498 a a la 489. Evidentemente la tarjeta se debe guardar de una forma segura, no vale dejarla como postit en el monitor.

opiekey es un programa muy sencillo y hay implementaciones para pdas, una pda normalmente cuenta como máquina segura

Todo esto sirve para FreeBSD con ligeros cambios.

lun 23 enero 2006 03:513 comentarios