Para trabajar remotamente en la [nueva plataforma](https://proyectos.interior.edu.uy/projects/servidores/wiki/Plataforma_de_servidores_del_Interior) 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***.
> Procedimiento redactado para la utilización de la versión [v2.0.0-udelarinterior](https://github.com/UdelaRInterior/Stouts.openvpn/tree/v2.0.0-udelarinterior) y superiores del role *Stouts.openvpn*
El servicio fue montado y aprovisionado completamente a través de nuestros playbooks Ansible y fork al role [Stouts.openvpn](https://github.com/UdelaRInterior/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.
Para trabajar remotamente en la [nueva plataforma](https://proyectos.interior.edu.uy/projects/servidores/wiki/Plataforma_de_servidores_del_Interior) y brindar acceso a funcionarios y docentes a servicios exclusivos de la Red Académica Uruguaya (RAU) contamos con varios servidores OpenVPN en producción. En particular ***vpn.interior.edu.uy*** y ***oficina.interior.edu.uy***.
En esta entrada se documenta el procedimiento de concesión y revocado de acceso a un usuario haciendo uso del proceso automatizado con Ansible.
El servicio es montado y aprovisionado completamente a través de nuestros playbooks Ansible y un *fork* al *role*[Stouts.openvpn](https://github.com/UdelaRInterior/Stouts.openvpn) sobre contenedores LXC. ***Stouts.openvpn*** se complementa con un *role* hermano: [nkakouros.easyrsa](https://github.com/nkakouros-original/ansible-role-easyrsa), que gestiona los certificados y llaves de cifrado utilizados por los clientes para establecer conexión al servicio. En versiones previas, ambas funcionalidades eran implementadas por el *role****Stouts.openvpn***.
En esta entrada se documenta el procedimiento de concesión y revocado de acceso a uno o varios usuarios haciendo uso del procedimiento 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.
-`openvpn_users`: listado con los datos 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í](https://git.interior.edu.uy/adminsys/config/blob/master/host_vars/bo.interior.edu.uy/vars/30_openvpn.yml), y para la tarea que nos ocupa, supongamos que tenemos las variables declaradas de la siguiente manera:
Para la tarea que nos ocupa, supongamos que tenemos las variables declaradas de la siguiente manera:
```yaml
openvpn_clients:# Listado de clientes a crear/mantener certificado de acceso
-usuario01
-usuario02
-usuario03
-usuario04
openvpn_users:# Listado de clientes a crear/mantener certificado de acceso
-name:usuario01
email:usuario01@mail.com
fullName:Usuario 01
-name:usuario02
email:usuario02@mail.com
fullName:Usuario 02
-name:usuario03
email:usuario03@mail.com
fullName:Usuario 03
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
openvpn_download_dir:"../credenciales_openvpn_{{ansible_hostname}}/"# 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:
Para conceder acceso a uno o varios usuarios nuevos, deberemos agregarlos a la lista `openvpn_users`; indicando un nickname único asignado a dicho usuario, su *e-mail* de contacto y nombre completo. Por ejemplo para agregar los usuarios `nuevo01` y `nuevo02`, las variable `openvpn_users`quedaría definida de la siguiente manera:
```yaml
openvpn_clients:
-usuario01
-usuario02
-usuario03
-usuario04
-nuevo01
-nuevo02
openvpn_users:# Listado de clientes a crear/mantener certificado de acceso
-name:usuario01
email:usuario01@mail.com
fullName:Usuario 01
-name:usuario02
email:usuario02@mail.com
fullName:Usuario 02
-name:usuario03
email:usuario03@mail.com
fullName:Usuario 03
-name:nuevo01
email:nuevo01@mail.com
fullName:Nuevo 01
-name:nuevo02
email:nuevo02@mail.com
fullName:Nuevo 02
```
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`.
Los nuevos *juegos* de llaves de cifrado y archivos de configuración serán generados y almacenados en el servidor en la ruta `/etc/openvpn/ovpns/<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:
Con estas modificaciones, solo resta correr el playbook `site.yml` con el tag correspondiente y limitado al servidor OpenVPN, para apliacar los cambios:
**Una vez ejecutado correctamente, no olvides guardar tus cambios en el proyecto generando un nuevo *commit* y subiéndolo con *git push*.**
> **Una vez ejecutado correctamente, no olvides reflejar tus cambios en el proyecto generando un nuevo *commit* y [subiéndolo a la rama *master* del repositorio.](la-importancia-de-la-rama-estable)**
## 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`.
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_users`a `openvpn_clients_revoke`. Además del *nickname*, se puede indicar también la "razón de revocado" a través del atributo `reason`
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í:
Por ejemplo, supongamos que se desea revocar el acceso al usuario ***usuario02***. En base a la configuración inicial, la lista debería quedar definida así:
```yaml
openvpn_clients:
-usuario01
-usuario03
-usuario04
openvpn_users:
-name:usuario01
email:usuario01@mail.com
fullName:Usuario 01
-name:usuario03
email:usuario03@mail.com
fullName:Usuario 03
openvpn_clients_revoke:
-usuario02
-name:usuario02
reason:affiliationChanged
```
Con estas modificaciones, corremos el playbook `site.yml` del mismo modo que en el caso anterior:
Una vez los cambios son aplicados correctamente, modificamos nuevamente la lista `openvpn_clients_revoke` para dejarla vacía.
```yaml
openvpn_clients:
-usuario01
-usuario03
-usuario04
openvpn_users:
-name:usuario01
email:usuario01@mail.com
fullName:Usuario 01
-name:usuario03
email:usuario03@mail.com
fullName:Usuario 03
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*.**
> **Con todo el proceso ejecutado correctamente, no olvides reflejar tus cambios en el proyecto generando un nuevo *commit* y [subiéndolo a la rama *master* del repositorio.](la-importancia-de-la-rama-estable)**
> 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.
> 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.
\ No newline at end of file
## Enviar credenciales de acceso y archivo de configuración a los usuarios a través de correo eléctronico
Desde la versión [v2.0.0-udelarinterior](https://github.com/UdelaRInterior/Stouts.openvpn/tree/v2.0.0-udelarinterior) de nuestro *fork* del *role*, es posible enviar por correo electrónico a los usuarios, todos los insumos necesarios para que puedan configurar sus clientes.
Para ello, el las *host_vars* del servidor VPN, deberá estar habilitada esta característica con `openvpn_send_credentials: true` y correctamente configurado el proveedor de *e-mail* a utilizar con `openvpn_sender`.
De esta forma, al crear las credenciales de los usuarios, los archivos serán adjuntos a un correo electrónico enviado a la dirección indicada para el usuario en `openvpn_users`.
Si se desea reenviar estas credenciales al usuario por alguna razón, existe la posibilidad de "forzar" el envío de *e-mail* con adjunto en cada ejecución del *role* para los usuarios cuyo *nickname* se indique en la lista simple `openvpn_send_force`. Por ejemplo: