Cabecera blog ciberseguridad

Configuración de OpenVPN con Google Autenticator

La autenticación multifactor es aquella en la que se necesita introducir varios ítems para poder acceder al sistema. El factor más conocido es la autorización en dos factores, en la que se debe proporcionar algo que se sabe, como la contraseña, y algo que se tiene, como un PIN, método que implementa Google Authenticator.

Por otro lado la autenticación con contraseña de un solo uso, u OTP (One-Time Password), consiste en que la contraseña que se tiene se puede utilizar únicamente para una autenticación o para un período de tiempo, de forma que se evita en gran medida ataques eavesdropping o replay, así como ataques de fuerza bruta sobre la contraseña. El método que utiliza Google Authenticator es generar PINs de 6 dígitos válidos durante 1 minuto, conocidos como TOTP. Para ello es necesario tener la hora de nuestro dispositivo móvil sincronizado con los servidores de Google.

La autorización en dos pasos unida a los OTPs proporciona una gran seguridad en los accesos a sistemas, ya que los usuarios deben introducir su contraseña junto con el PIN que genera Google Authenticator. Este programa puede estar instalado y vinculado a un smartphone (Android, iOS y BlackBerry).

Google proporciona un módulo PAM para poder utilizar Google Authenticator en sistemas GNU/Linux y así proveer a aplicaciones que puedan utilizar módulos PAM, como OpenVPN u OpenSSH, la posibilidad de tener autenticación de dos factores, delegando parte de la autenticación en los OTP de Google Authenticator.

En este artículo se analizará cómo configurar OpenVPN para que haga uso de Google Authenticator sobre un sistema CentOS. Debido a que esta distribución trae activado por defecto SELinux se deberá crear un módulo SELinux que permita a OpenVPN interaccionar con los ficheros creados por Google Authenticator en los directorios home de los usuarios. Se parte del supuesto de que se tiene OpenVPN instalado y funcionando previamente en el sistema.

El primer paso para instalar el módulo PAM es instalar las dependencias:

# yum install pam pam-devel gcc make

A continuación se descarga el tarball con la última versión (1.0 a día de hoy) del módulo PAM desde Google Code, y se instala en el sistema:

# wget https://google-authenticator.googlecode.com/files/libpam-google-authenticator-1.0-source.tar.bz2
# tar xvjf libpam-google-authenticator-1.0-source.tar.bz2
# cd libpam-google-authenticator-1.0
# make install

Una vez se ha instalado el módulo PAM se podrá utilizar la utilidad google-authenticator, con la que se crearán los ficheros secretos de cada uno de los usuarios.

El siguiente paso es configurar el servidor VPN para que utilice el plugin de autenticación con módulos PAM. Para ello se debe editar el fichero de configuración del servidor añadiendo las siguientes líneas:

plugin /usr/local/lib/openvpn/plugin/lib/openvpn-auth-pam.so /etc/pam.d/openvpn
username-as-common-name
client-cert-not-required

Con la primera línea se indica al servidor que utilice el plugin openvpn-auth-pam.so, instalado previamente, y que utilice las instrucciones de validación que se encuentran en /etc/pam.d/openvpn, mientras que con la segunda línea le indica que el nombre de usuario del sistema será el common-name de VPN.

En el fichero /etc/pam.d/openvpn se indica como gestionará el sistema la validación de un usuario de la VPN. Lo primero que hará el sistema es hacer uso del módulo pam_securetty.so que se encarga de comprobar si es seguro realizar la autenticación. En caso de que la comprobación sea positiva pasará a la siguiente etapa, enviar las credenciales al módulo PAM de Google Authenticator. Con la opción forward_pass se le indica que, si la comprobación del token es correcta, envíe la contraseña al siguiente módulo, que será la autenticación contra el sistema del usuario y contraseña.

auth
[user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth required pam_google_authenticator.so forward_pass
auth include system-auth
account include system-auth
password include system-auth

El último paso en la configuración de la VPN será indicar en los ficheros de configuración del cliente (client.ovpn/conf) que se hará uso de autenticación con usuario y contraseña:

# vi usuario.conf auth-user-pass

En un sistema sin SELinux, o con este en modo permisive, se daría por acabada la instalación. Los ficheros de Google Authenticator de cada usuario se almacenan en el home de este, y por defecto SELinux no permite que un proceso acceda a los homes. Para cambiar este comportamiento se puede hacer mediante el uso de los booleanos que dispone SELinux, pero es más útil y elegante crear un módulo que introduzca las reglas en SELinux. Para ello se deben seguir los siguientes pasos:

# mkdir /etc/selinux/targeted/modules/openvpn
# alias semake='make -f /usr/share/selinux/devel/Makefile'
# vi openvpn_ga.te
# Nombre y version del modulo policy_module(openvpn_ga, 1.0)
# Lista de los tipos que va a usar el modulo.
require {
type openvpn_t,admin_home_t,fs_t,openvpn_etc_t,sendmail_exec_t,user_home_t,usr_t,var_lib_t,user_home_dir_t,unconfined_t;
}

# Se define nuestro tipo, que será el que se usara para el fichero .google-authenticator
type openvpn_google_authenticator_t;

# Se permite al proceso OpenVPN acceder a los homes
allow openvpn_t user_home_dir_t:dir { write remove_name add_name };
allow openvpn_t user_home_dir_t:file { rename write getattr read create unlink open };

# Reglas extraidas con la herramienta audit2allow
allow openvpn_t admin_home_t:file execute;
allow openvpn_t fs_t:filesystem getattr;
allow openvpn_t openvpn_etc_t:file unlink;
allow openvpn_t sendmail_exec_t:file { execute getattr };
allow openvpn_t usr_t:lnk_file read;
allow openvpn_t var_lib_t:file read;
allow unconfined_t openvpn_t:dir relabelto;
allow unconfined_t openvpn_t:file relabelto;

files_type(openvpn_google_authenticator_t)

# semake
# semodule -i openvpn_ga.pp

Como se puede observar, con el módulo se cargan reglas que permiten al proceso de OpenVPN acceder a los homes de los usuarios. También se han introducido en el módulo las reglas extraídas con la herramienta audit2allow de SELinux, creadas con el siguiente comando:

# cat /var/log/audit/audit.log
grep openvpn
audit2allow

Una vez compilado y cargado el módulo, se puede utilizar Google Authenticator y OpenVPN sin conflictos en nuestro sistema CentOS. Por último se tiene que crear los usuarios locales, que serán los que utilice el módulo PAM para autenticarse y arrancar todos los servicios:

# useradd usuario
# passwd usuario
# service openvpn restart

Cada usuario deberá entrar con su cuenta y ejecutar el comando que genera los ficheros que necesita el módulo PAM y el código QR para tener los tokens en su smartphone:

google-authenticator-openvpn

Imagen 1 – Comando google-authenticator

A continuación el usuario accederá a la URL que le proporciona el comando anterior y escaneará el código QR con la aplicación de Google Authenticator.

google-authenticator-qr-code

Imagen 2 – Código QR

De este modo se podrán generar los tokens en el dispositivo, necesarios para conectar remotamente a la VPN.

google-authenticator-smartphone

Imagen 3 – Google Authenticator Android

Cuando el usuario quiera acceder remotamente a través de la VPN deberá introducir su nombre de usuario y el token concatenado a la contraseña, por ejemplo:

User: Tarlogic
Pass: P4ssw0rd127132

Tras la generación de los tokens, será necesario deshabilitar la posibilidad de acceder remotamente a través de un terminal (consola, SSH,..), para limitar el riesgo de un acceso no autorizado al servidor que gestiona las conexiones VPN:

# usermod –s /sbin/nologin

En este momento, se dispone de un sistema de VPN con doble factor de autenticación, que otorga una capa extra de seguridad a las conexiones remotas.

Descubre nuestro trabajo y nuestros servicios de ciberseguridad en www.tarlogic.com/es/

En TarlogicTeo y en TarlogicMadrid.