Conceder / revocar credenciales de acceso a servidor OpenVPN

Para trabajar remotamente en la nueva plataforma y en otros servicios accesibles solo desde la RAU, contamos con un servidor OpenVPN en producción en el contenedor LXC Bo y accesible en vpn.interior.edu.uy.

El servicio fue montado y aprovisionado completamente a través de nuestros playbooks Ansible y fork al role Stouts.openvpn. Dicho role contempla no solo la instalación del servidor OpenVPN, sino también la creación de certificados de acceso para los clientes y su respectivo archivo de configuración.

En esta entrada se documenta el procedimiento de concesión y revocado de acceso a un usuario haciendo uso del proceso automatizado con Ansible.

Las únicas variables que nos interesarán para este proceso son:
  • openvpn_clients: listado con los nicknames de los usuarios cuyo acceso deseamos conceder o mantener (en caso de que ya haya sido concedido).
  • openvpn_clients_revoke: listado con los nicknames de los usuarios a los cuales se les concedió acceso y ahora se desea revocar.
  • openvpn_download_clients: booleano para indicar si deseamos o no, descargar desde el servidor OpenVPN a nuestro equipo los archivos de credenciales y configuración de los clientes con acceso.
  • openvpn_download_dir: ubicación del equipo donde se descargarán los archivos .zip (uno por usuario), en caso de indicar true en la variable anterior.

Para el servidor Bo, el archivo de variables correspondientes al role Stouts.openvpn se encuentra aquí, y para la tarea que nos ocupa, supongamos que tenemos las variables declaradas de la siguiente manera:

openvpn_clients:  # Listado de clientes a crear/mantener certificado de acceso
  - usuario01
  - usuario02
  - usuario03
  - usuario04

openvpn_clients_revoke: []   # Listado de clientes a revocar acceso

openvpn_download_clients: true   # Descarga de los archivos de cliente
openvpn_download_dir: ../openvpn_interior_credentials/  # Ubicación de la descarga

Conceder nuevo acceso

Para conceder acceso a uno o varios usuarios nuevos, deberemos agregarlos a la lista simple openvpn_clients, indicando un nickname único asignado a dicho usuario. Por ejemplo para agregar los usuarios nuevo01 y nuevo02, la variable quedaría definida de la siguiente manera:

openvpn_clients:
  - usuario01
  - usuario02
  - usuario03
  - usuario04
  - nuevo01
  - nuevo02

Los nuevos juegos de llaves de cifrado y archivos de configuración serán almacenados en el servidor en la ruta /etc/openvpn/keys/<nick-de-usuario>.zip. Si también queremos que las nuevas credenciales se descarguen a nuestro equipo en la ubicación indicada en openvpn_download_dir, establecemos openvpn_download_clients: true.

Con estas modificaciones, solo resta correr el playbook site.yml con el tag correspondiente sobre Bo para apliacar los cambios:

ansible-playbook -i hosts_prod --limit bo.interior.edu.uy --tags openvpn site.yml

Una vez ejecutado correctamente, no olvides guardar tus cambios en el proyecto generando un nuevo commit y subiéndolo con git push.

Revocar acceso preexistente

En caso de que se desee revocar el acceso concedido previamente a uno o varios usuarios, se deberá "mover" su nickname de la lista openvpn_clients a la lista openvpn_clients_revoke.

Por ejemplo, supongamos que se desea revocar el acceso al usuario usuario02. En base a la configuración inicial, las listas deberían quedar definidas así:

openvpn_clients:
  - usuario01
  - usuario03
  - usuario04

openvpn_clients_revoke:
  - usuario02

Con estas modificaciones, corremos el playbook site.yml del mismo modo que en el caso anterior:

ansible-playbook -i hosts_prod --limit bo.interior.edu.uy --tags openvpn site.yml

Una vez los cambios son aplicados correctamente, modificamos nuevamente la lista openvpn_clients_revoke para dejarla vacía.

openvpn_clients:
  - usuario01
  - usuario03
  - usuario04

openvpn_clients_revoke: []

Con todo el proceso ejecutado correctamente, generamos un commit para registrar los accesos revocados, y lo subimos al repositorio con git push.

Notar que la concesión a nuevos usuarios y el revocado a antiguos puede llevarse a cabo en usa sola ejecución del playbook, simplemente con reflejar los valores correspondientes en ambas listas.