authentication n-factor SSH para CentOS 7

¿Cómo puedo habilitar (y exigir) la authentication n-factor para todas las conexiones SSH a un server CentOS 7?

He leído sobre Google Authenticator, que proporciona authentication de dos factores. Pero eso se limita a un pin proporcionado por una aplicación que debe instalar en el dispositivo mobile de cada usuario.

¿Cómo puedo agregar numbers variables de factores de authentication? Algunos ejemplos de factores adicionales pueden include:

 1.) a pin code emailed to the administrator's work email address 2.) a USB key 3.) a pin texted to the administrator using a tool like twilio etc.) ... 

Un progtwig Java para enviar posts de correo electrónico y texts sería lo suficientemente fácil de build, y podría ser llamado por un script de shell que reemplace el script de authentication ssh pnetworkingeterminado, pero nunca antes he escrito un script de shell.

¿Cómo se vería el código del shell para lograr esto, suponiendo que Java ya está escrito? ¿Y dónde colocaría el script de shell? El pseudocódigo para el script de shell puede include los siguientes pasos:

 1.) Trigger the Java program to send email, text, etc. with custom pins when administrator types ssh adminaccount@secureserver.com 2.) Replace the login password prompt with a series of prompts to get the pins/cnetworkingentials from 2.) Possibly interact with a client program to get the usb signature 3.) Send the cnetworkingentials to the java program, with time stamp to ensure login was done within a minute after java sent the pins 4.) Compare the Boolean returned by the java program with the CentOS password check 5.) Either authenticate or reject the user 

Supongo que un primer borrador de un script de shell podría ser:

 #!/bin/bash USER_NAME=#How do I populate this? TEXT_PIN=shuf -i 1-10000 -n 1 EMAIL_PIN=shuf -i 1-10000 -n 1 CLASSPATH=/path/to/classes java -cp $CLASSPATH my.package.SendPinsClass TEXT_PIN EMAIL_PIN if [ $? -eq 0 ] then echo -n "We were not able to send authentication cnetworkingentials. Please log the current time and report this to the chief administrator. " else echo -n "Pin numbers have been sent to your email and phone number. Please check your email and text messages now before continuing the authentication process. " fi echo -n "Enter Pin number from cell phone: " read TEXT_PIN echo -n "Enter Pin number from email: " read EMAIL_PIN java -cp $CLASSPATH my.package.AuthenticationClass USER_NAME TEXT_PIN EMAIL_PIN if [ $? -eq 0 ] then #DO NOT AUTHENTICATE else #LOG THIS USER IN! fi #HOW DO WE CHECK THE USER'S CentOS 7 PASSWORD? #THIS SCRIPT MUST INCLUDE A PASSWORD CHECK IN AUTHENTICATION PROCESS. 

¿Qué más va en el script de shell? ¿Y cómo ponerlo en su lugar?

Las especificaciones para una respuesta se dan arriba. Sin embargo, los comentarios que sugieran herramientas más fáciles en lugar de rodar las propias también son bienvenidos.


EDITAR:


En base a mi investigación en curso, acabo de agregar detalles más explícitos al borrador del script de shell anterior para documentar los pasos que debe seguir el script para autenticar al usuario. Se puede suponer que los pasos key se completan con éxito mediante dos progtwigs java de "caja negra" que el script de shell llama. Las principales preguntas restantes que deben responderse antes de que se pueda completar incluyen:

 1.) How does the script receive and populate the value for the USER_NAME variable? 2.) How does the script check the user's CentOS 7 OS password, and how should the password be integrated into the script's authentication process? Note the security of the password needs to be protected. 3.) How does the script process the approval or rejection of the authentication request with the CentOS 7 operating system? 4.) How is the working shell script placed in the authentication process to replace the default authentication script? 

Nota: Si la implementación de la secuencia de commands en CentOS 7 implica agrupar la secuencia de commands como un PAM module como @steve sugiere en su comentario, entonces la respuesta aceptada debe dar instrucciones explícitas no solo para alterar la secuencia de commands del shell, sino también para integrar el script de shell en el PAM module y en cualquier otro aspecto del process de authentication. La respuesta necesita funcionar en CentOS 7.


SEGUNDA EDICION


Según este enlace que se publicó en un comentario de @steve a continuación, los contenidos de /etc/pam.d/sshd son por defecto de la siguiente manera:

 #%PAM-1.0 auth requinetworking pam_sepermit.so auth substack password-auth auth include postlogin account requinetworking pam_nologin.so account include password-auth password include password-auth # pam_selinux.so close should be the first session rule session requinetworking pam_selinux.so close session requinetworking pam_loginuid.so # pam_selinux.so open should only be followed by sessions to be executed in the user context session requinetworking pam_selinux.so open env_params session optional pam_keyinit.so force revoke session include password-auth session include postlogin 

Tenga en count que, en CentOS 7, /lib/security/ no existe, y por lo tanto no es la location de los modules PAM, como en el enlace de @ steve, que es para Debian. Por lo tanto, sin los modules PAM, no podemos almacenar el script de shell en mi OP como /lib/security/2ndfactor.so . El tutorial en el enlace de @ steve sugiere el siguiente código para asignar la secuencia de commands a /lib/security/2ndfactor.so . ¿Cómo cambiamos el siguiente código?

 apt-get update apt-get install build-essential libpam0g-dev libcurl4-openssl-dev gcc -fPIC -lcurl -c 2ndfactor.c ld -lcurl -x --shanetworking -o /lib/security/2ndfactor.so 2ndfactor.o 

El enlace de @ steve también sugiere que editemos /etc/pam.d/sshd para agregar una reference al 2ndfactor.o después de @common-auth siguiente manera:

 # PAM configuration for the Secure Shell service # Read environment variables from /etc/environment and # /etc/security/pam_env.conf. auth requinetworking pam_env.so # [1] # In Debian 4.0 (etch), locale-related environment variables were moved to # /etc/default/locale, so read that as well. auth requinetworking pam_env.so envfile=/etc/default/locale # Standard Un*x authentication. @include common-auth auth requinetworking 2ndfactor.so base_url=http://my.server.com/send_code.php code_size=5 

Pero, como puede ver arriba, el /etc/pam.d/sshd que viene pnetworkingeterminado en CentOS 7 no contiene @include common-auth . Además, el enlace de @ steve usa una url web para un script php, pero estoy tratando de llamar a un progtwig java desde un script de shell. Debe haber una forma de hacerlo sin exponer una url web.

Por último, el enlace de @ steve dice que establecer ChallengeResponseAuthentication = yes en /etc/ssd/sshd_config , pero en CentOS 7 no hay directory /etc/ssd/ .

¿Alguien puede mostrar cómo adaptar todo esto para trabajar con CentOS 7 y Java?

La stack de authentication estándar * nix usa PAM. Deseará search la creación de un module para PAM: http://www.linux-pam.org/Linux-PAM-html/

Por lo general, los proveedores de authentication multifactor proporcionarán uno. Por ejemplo, aquí hay una guía práctica para implementar Google Authenticator como un segundo factor para el inicio de session de SSH: http://spod.cx/blog/two-factor-ssh-auth-with-pam_oath-google-authenticator.shtml

Puede configurar PAM para admitir una variedad de factores diferentes como suficientes u obligatorios.


EDITAR: No estoy tratando de ser difícil, estoy tratando de networkingirigir tu investigación. Desde su segunda edición, solicita ayuda para adaptar un set de líneas que incluye: gcc -fPIC -lcurl -c 2ndfactor.c Este es el sorteo. No puede comstackr un script de shell. Los modules PAM están escritos en C y comstackdos (en este ejemplo) con gcc. Es posible que pueda llamar a una aplicación Java desde dentro de un module PAM, pero eso está fuera del scope de este sitio y fuera del scope de mi conocimiento.

Otras notas:

  • Los modules PAM para una versión moderna de CentOS estarán en / lib64 / security /, hecho en caso de que necesite bibliotecas de 32 y 64 bits
  • Lastly, @steve's link says to set ChallengeResponseAuthentication = yes in /etc/ssd/sshd_config, but in CentOS 7 there is no /etc/ssd/ directory. Esto es probablemente solo un error tipográfico y debería ser / etc / sshd

Alternativa: Como administrador de sistema, desaconsejo el uso de configuraciones "extrañas". PAM es el método de authentication bien conocido y aceptado, y muchas aplicaciones además de sshd pueden y lo usarán.

Sin embargo, si solo está preocupado por la implementación de 2FA para sshd en las sesiones de tty, puede ver el uso de la opción ForceCommand en su configuration sshd: http://ben.akrin.com/?p=1290

Debe tener en count que es relativamente fácil para un usuario autenticado eludir los bashs futuros de aplicar 2FA a través de ForceCommand, por lo que esta no es realmente una buena solución: https://serverfault.com/questions/639771/how-secure-is- ssh-forcecommand-on-a-jump-host