Actualizado procedimiento de concesion-revocado de acceso VPN authored by Santiago Martinez's avatar Santiago Martinez
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:
```
ansible-playbook -i hosts_prod --limit bo.interior.edu.uy --tags openvpn site.yml
ansible-playbook -i hosts_prod --limit <nombre_servidor>.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*.**
> **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:
```
ansible-playbook -i hosts_prod --limit bo.interior.edu.uy --tags openvpn site.yml
ansible-playbook -i hosts_prod --limit <nombre_servidor>.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.
```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.
## 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:
```yaml
openvpn_send_force:
- usuario03
```
\ No newline at end of file