|
|
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.
|
|
|
|
|
|
> 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:
|
|
|
```yaml
|
|
|
openvpn_send_force:
|
|
|
- usuario03
|
|
|
``` |
|
|
\ No newline at end of file |