Archivo de la etiqueta: autenticación

Micropíldora – Sistema autenticación en GNU/Linux

Autenticación en Linux

Autenticación en Linux
Fuente imagen: AcercaDeUbuntu

En esta micropíldora explicaré el funcionamiento tradicional, y su evolución actual, del sistema de autenticación en local de los sistemas basados en GNU/Linux (Debia, RedHat, IOS, etc.). Aunque hoy en día existen múltiples posibilidades de autenticación remota (LDAP, Kerberos, etc.), la autenticación local sigue operativa en la gran mayoría de instalaciones. No profundizaré en los diferentes algoritmos utilizados, cosa que da para un artículo más extenso, sino en las estrategias elegidas así como sus motivaciones para elegirlas.

Aunque es un artículo básico se presupone un mínimo conocimiento de la estructura  del sistema operativo GNU/Linux.

Sistema de autenticación tradicional

Desde su definición el sistema GNU/Linux ha sido desarrollado teniendo en mente un sistema multiusuario, cosa no muy extendida en la época, por lo que desde el principio contaba con un sistema de autenticación de los diferentes usuarios que podían utilizar el sistema. Así pues se creó un fichero de sistema (/etc/passwd) en el cual se almacena la información del usuario que es necesaria para que el sistema pueda trabajar con normalidad.

Veamos un ejemplo de una línea de este fichero público:

andreu:S1p7e8INZ512o:1011:1000:Andres Adrover:/home/andreu:/bin/sh

Donde separados por el símbolo de dos puntos (:) podemos ver los siguientes valores:

  1. andreu: El nombre de usuario al que hace referencia esta información.
  2. S1p7e8INZ512o: Información para validar la contraseña. Por norma se trata del resultado obtenido al pasar la contraseña real por una función hash. Permite pues comparar que la contraseña introducida sea la misma (si da el mismo resultado) que la elegida anteriormente.
  3. 1011: Identificador numérico de usuario. Debe ser único en el equipo y es utilizado por el sistema de forma interna (control de permisos de acceso, gestión de procesos lanzados, etc.)
  4. 1000: Identificado numérico del grupo al que pertenece el usuario. Al igual que el campo anterior es utilizado por el sistema operativo.
  5. Andres Adrover: Este campo es de libre escritura aunque se definió para indicar los datos completos del usuario, dirección, teléfono, etc.
  6. /home/andreu: Identifica el directorio raíz de ese usuario
  7. /bin/sh: Indica qué programa debe ejecutarse nada más autenticarse el usuario. Para usuarios humanos siempre será un intérprete de comandos (sh, bash, ksh…)

Como se puede observar no se guarda la contraseña en claro en este fichero, sino el resultado de aplicarle una función hash, por lo que en su momento se consideró que era un sistema suficientemente seguro. La idea es que, aunque el fichero /etc/passwd es de acceso libre y cualquiera puede obtener el valor hash de las contraseñas de todos los usuarios no sería factible obtener las contraseñas de dichos valores.

Sistema actual de autenticación en Linux

Estas apreciaciones de seguridad fueron válidas durante décadas, pero la aparición de debilidades en las funciones hash usadas (MD5, SHA1, Blowfish…) hizo que la obtención de contraseñas válidas a partir de los valores almacenados en el fichero /etc/passwd pasara a ser factible.

Así se generó una nueva estrategia:

  • Se mantiene el fichero público /etc/passwd con toda la información útil del usuario pero en el campo contraseña (el segundo) sólo habrá el valor ‘x’.
  • Se crea un nuevo fichero /etc/shadow sólo visible por el usuario root para gestionar la información de contraseña

El mero hecho de separar la gestión de credenciales y llevarla a un fichero no público ya es una importante mejora, pero además se añadieron nuevas funcionalidades criptográficas para dificultar, aún más, la obtención de contraseñas válidas aunque se obtuviera el acceso al nuevo fichero.

El formato de este neuvo fichero podría ser el siguiente:

andreu:$1$S1p7e8INZ512o:13054:0:365:7:10:99999:

Donde:

  1. andreu: el nombre de usuario
  2. $1$S1p7e8INZ512o: Resultado de la función hash de la contraseña
  3. 13054: El días, contado desde 1 de enero de 1970, en el que se cambió la contraseña por última vez
  4. 0: Mínimo número de días que deben pasar entre cambios de contraseña
  5. 365: Número máximo de días en el que una contraseña es válida
  6. 7: Número de días antes de que caduque en el que nos avisa el sistema
  7. 10: Número de días en el que la cuenta se expirará una vez caducada la contraseña
  8. 99999: Fecha, contada desde el 1 de enero de 1970, en el que la cuenta caducará

Como se puede observar este nuevo fichero abre un mayor abanico de posibilidades para la gestión de usuarios y contraseñas en los sistemas basados en Linux.

Otro punto importante es la elección de las funciones hash posibles y el uso, obligatorio, de expresiones «Salt» que dificultan en gran medida los posibles ataques por diccionario.


Obviamente mi contraseña no tiene ese hash 😉

Factores de autenticación

Control de acceso.

Control de acceso. Fuente imagen: Click2Bank

En seguridad, tanto informática como tradicional, se denomina autenticación al proceso por el cuál se intenta verificar la autenticidad de una identificación. Esta definición formal viene a decir que ya se intenta verificar que quien accede a un sistema o servicio sea quien dice ser. Para conseguir esta autenticación se pueden utilizar cuatro aproximaciones diferentes, si bien últimamente se está extendiendo el uso de un doble factor de autenticación para mejorar el nivel de seguridad y cubrir las vulnerabilidades de una opción con la otra.

Veamos las cuatro aproximaciones clásicas:

Autenticación por lo que se sabe

Se trataría de la autenticación más simple y tradicional: las contraseñas. Cuando un usuario (una identidad dentro del sistema) conoce la clave de acceso al mismo, el sistema considera que el usuario es quien dice ser y lo deja acceder. Creo que no hace falta dar ejemplos sobre servicios que usan las contraseñas para acceder 😉

Se trata del sistema más sencillo tecnológicamente pero también uno de los más vulnerables, ya que la contraseña puede ser obtenida por un usuario malicioso (phishing, ingeniería social, etc.) y hacer un uso fraudulento del servicio.

Autenticación por lo que se tiene

El usuario demuestra ser quien dice ser al tener un objeto que sólo él debería tener. En el mundo físico podríamos hacer un símil con las tarjetas magnéticas que permiten el acceso a diferentes edificios. Este factor de autenticación es ampliamente utilizado por la banca electrónica cuando al ordenar una transacción, el sistema envía un código al teléfono móvil registrado del usuario. Así la empresa supone que ese código (aleatorio y de uso único) sólo lo recibe un teléfono móvil y que si, de verdad, eres el usuario que dices ser tendrás el teléfono encima.

Autenticación por lo que se es

Este factor de autenticación busca verificar la identidad mediante la detección de una característica física exclusiva del usuario. El método más extendido dentro de este grupo sería la identificación por huella dactilar (acceso a edificios, teléfonos móviles, etc.).

Existen diferentes propuestas para obtener este factor de autenticación (huellas dactilares, comparación del iris de los ojos, escaneo 2D/3D de la cara, etc.) aunque todas ellas dependen de una toma de datos previa del usuario de forma presencial, lo cuál dificulta su uso en controles de acceso no físicos.

Autenticación por lo que se es capaz

Este factor de autenticación es el que ha aparecido más tarde y el más difícil de implementar: busca verificar la identidad de un usuario por ser capaz de realizar una acción de forma única. Quizás hayáis visto en películas una sala donde unos sensores en el suelo detectaba la forma de caminar del propietario y si alguien accedía pero caminar de igual manera se activaba la alarma. Un ejemplo de esta aproximación en el mundo digital sería el implementado por la página de MOOC Coursera.org: para que la universidad que realiza el curso emitiese un certificado oficial con el nombre del alumno debía asegurarse de que era quien decía ser (de otra forma sería fácil copiar y obtener dicho certificado). Así, además de pagar la cuota correspondiente (puedes hacer los cursos de forma gratuita pero sin certificado oficial), el alumno debía realizar las prácticas y trabajos directamente sobre una plataforma web específica. Dicha plataforma detectaba y analizaba los patrones de escritura (veces que borraba; si redactaba párrafos largos del tirón  y luego corregía o al contrario siempre hacía frases cortas; si hacía los trabajos en tandas largas o en muchas veces con poco tiempo; etc.) y así podía concluir que la persona que había realizado todas las prácticas era la misma y por lo tanto era merecedora del título oficial.

Seguridad por múltiples factores de autenticación

Autenticación por doble factor. Fuente imagen: Clik2Bank

Autenticación por doble factor. Fuente imagen: Clik2Bank

Cada uno de las aproximaciones e implementaciones técnicas de cada factor de autenticación tiene sus propias debilidades (olvidos de contraseñas, pérdidas de pases, una cicatriz que modifica la huella dactilar, etc.) por lo que para las operaciones que precisan de un mayor nivel de seguridad se suelen combinar diferentes factores de autenticación. Estamos acostumbrados que para acceder a la banca electrónica tengamos unas claves de acceso (autenticación por conocimiento) que nos permite visualizar la información pero que para realizar una operación nos soliciten un segundo código bien sea en una tarjeta de coordenadas o bien enviándonos dicho código al móvil (autenticación por posesión).