Cómo crear un Captcha para conexiones SSH

Publicado el 10 marzo 2017 por Drassill
Ya ha pasado cierto tiempo desde mi último artículo, lo cierto es que me habría gustado poder haber escrito aquí mucho antes, pero debido a algunas circunstancias he estado lejos de un ordenador durante prácticamente dos semanas, habiéndome sido imposible siquiera estar informado del estado del mundo. Ahora que ya he vuelto a un periodo de relativa normalidad, espero poder retomar el ritmo poco a poco y volver publicar artículos con periodicidad, tal y como he intentado hacer hasta ahora. Dicho esto, hoy quiero traer algo que en mi opinión puede resultar interesante a más de uno; como a menudo he dicho en este blog, el servicio SSH me parece una utilidad fantástica de un valor incalculable; ya que permite conectarnos de forma segura a un equipo desde el otro lado del mundo y si uno sabe manejarse en una shell, puede hacer prácticamente de todo desde ésta. Obviamente, dicho servicio es muy atractivo, y es uno de los principales servicios atacados en los servidores Linux, con lo que debemos tomar bastantes medidas de seguridad para evitar que entren personas no gratas; medidas de seguridad que pasan desde las estándar, tales como la imposibilidad de acceder remotamente directamente como root, hasta medidas de seguridad "opcionales" o "curiosas" tales como el port knocking o SPA. Hoy os quiero hablar sobre una medida de seguridad "opcional" que guarda un pequeño parecido con el segundo factor de autenticación: Se trata del uso de Captchas durante la autenticación de un usuario vía SSH.

Un Captcha (Completely Automated Public Test to tell Computers and Human Apart) no es, ni más ni menos, que una comprobación para determinar que aquel que está intentando conectarse al equipo es un humano y no una máquina (como por ejemplo un bot que ha logrado loguearse al equipo). Esta medida es especialmente útil cuando han logrado acceder al equipo mediante herramientas automatizadas, ya que dicho Captcha requiere la intervención de un humano; intervención que generalmente es muy sencilla ya que generalmente se trata de una imagen que muestra una consecución de letras y/o números en la pantalla; consecución que uno debería introducir a mano y que en caso de ser igual que la mostrada en la pantalla, nos permitiría continuar. Esta medida de seguridad es muy popular en muchas páginas web; especialmente en formularios de registro o similares que pueden ser susceptibles a ser afectadas por bots. Un Captcha en Internet tendría un aspecto similar al siguiente:
Imagen tomada de Wikipedia
Obviamente, en una shell dicha secuencia no estaría en una imagen de tal diseño, sino que sería un ASCII art que emularía una imagen, pero que en sí sería código ASCII; algo como lo siguiente:

Ahora bien, está función no está implementada por defecto, sino que es una funcionalidad que proviene de un módulo PAM especial; módulo que no está añadido por defecto en el sistema. Aún así, afortunadamente su implantación es increíblemente sencilla. Para ello, lo primero que haremos será instalar las dependencias necesarias para que el módulo PAM pueda ser instalado; para lo cual haríamos:
apt-get install build-essential figlet libpam0g-dev git
La primera dependencia, build-esential contendría todos los paquetes necesarios para la compilación de un archivo (gcc, make, g++...); figlet en cambio es una aplicación que permite dibujar letras en formato ASCII. Libpam0g-dev sería la dependencia de desarrollo de PAM, gracias a la cual podremos instalar nuevos módulos en éste. Por último estaría git, herramienta con la que nos descargaremos el módulo PAM.
Con las dependencias cumplidas, tocaría bajarse el módulo PAM que hará posible este Captcha: pam_captcha. Para ello, nos descargaremos el paquete desde GitHub mediante el comando:
git clone https://github.com/jordansissel/pam_captcha.git
Esto nos crearía una carpeta llamada pam_captcha en cuyo interior estaría todo lo necesario para añadir el módulo PAM a nuestro sistema. Ahora simplemente tendríamos que entrar en dicha carpeta y escribir el comando make para compilar paquete y convertirlo en un módulo usable. Dicho módulo , ya compilado, se tendría que llamar pam_captcha.so.
La ubicación a la que tendríamos que mover dicho módulo dependería del sistema operativo, pero lo que todos los sistemas tienen en común es que la carpeta que contiene dichos módulos debe de llamarse security; carpeta en cuyo interior tendrían que haber únicamente módulos PAM, con lo que el mejor comando para encontrar dicha ubicación sería:
find/-name"pam_*.so"|grep security
A sabiendas de dicha ubicación, moveríamos el módulo pam_captcha.so a ésta.
Con todos los preparativos realizados, pasaríamos a configurar el fichero de configuración de SSH con PAM; configuración que realizaría en el fichero: /etc/pam.d/sshd. En el susodicho añadiríamos esta línea al principio del todo:
auth required pam_captcha.so math randomstring
Pero con ésto solo no bastaría, ya que tendremos que cerciorarnos de que el servicio SSH en sí está preparado para trabajar con PAM. Es por eso que tendríamos que asegurarnos que el fichero /etc/ssh/sshd_config posee el parametro ChallengeResponseAuthentication con el siguiente valor:
ChallengeResponseAuthentication yes
En caso afirmativo, no habría que hacer nada mientras que si en cambio estuviese con valor no, habría que cambiarlo a "yes" y reiniciar el servicio SSH.
Con esto, cualquier usuario que se loguee remotamente vía SSH tendrá que, no solo introducir el usuario y la contraseña, sino que también tendrá que introducir el captcha, haciendo que nos cercioremos de que la persona que se está conectando es humana.
Espero que os haya resultado útil.
Saludos.