bwinfosec.openvpn

TODO: Actualizar este README para reflejar los cambios en el fork de bwinfosec.

OpenVPN

Github Actions (PRs y línea principal): Github CI

Travis CI (lanza OpenVPN): Build Status

Este rol instala OpenVPN, lo configura como servidor, establece redes y cortafuegos (principalmente firewalld, ufw y iptables en base a lo que funcione mejor), y puede crear certificados de cliente opcionalmente.

Sistemas operativos en la construcción de CI:

  • Fedora 32+
  • CentOS 7 y 8

Nota: Estoy proporcionando el código en el repositorio bajo una licencia de código abierto. Dado que este es mi repositorio personal, la licencia que recibes para mi código es de mi parte y no de mi empleador.

Requisitos

¡OpenVPN debe estar disponible como un paquete en yum/dnf/apt! Para los usuarios de CentOS, este rol ejecutará yum install epel-release para asegurarse de que OpenVPN esté disponible.

Ubuntu precise tiene un error extraño que puede hacer que la instalación de iptables-persistent falle. Hay un solucionador.

Ansible 2.10 y versiones superiores

Con el lanzamiento de Ansible 2.10, los módulos se han movido a colecciones. Con la excepción de los módulos ansible.builtin, esto significa que se deben instalar colecciones adicionales para usar módulos como seboolean (ahora ansible.posix.seboolean). Esta colección ahora es necesaria: ansible.posix y esta colección es necesaria si se usa ufw: community.general. Instalando las colecciones:

ansible-galaxy collection install ansible.posix
ansible-galaxy collection install community.general

Notas/Expectativas de Soporte

Personalmente, utilizo este rol para gestionar OpenVPN en CentOS 8. Intento mantener el rol completamente funcional en esa plataforma con la configuración predeterminada. Por favor, reconoce que soy una sola persona, y tengo un trabajo a tiempo completo y otros compromisos.

Las respuestas a cualquier problema serán en base a lo que pueda, incluyendo la posibilidad de que no responda en absoluto. Los problemas que surjan del uso de las configuraciones no predeterminadas (incluyendo cualquiera de las contribuciones importantes de la comunidad) serán despriorizados.

Contribuciones importantes de la comunidad:

  • Funcionalidad para revocar certificados
  • Todo el soporte de LDAP

Variables del Rol

Opciones del rol

Estas opciones cambian la forma en que funciona el rol. Este es un grupo general, grupos específicos se desglosan a continuación.

Variable Tipo Opciones Predeterminado Comentario
clients lista [] Lista de clientes para agregar a OpenVPN
openvpn_base_dir cadena /etc/openvpn Ruta donde se almacenará la configuración de OpenVPN
openvpn_client_config_no_log booleano true, false true Evitar que los archivos de configuración del cliente se registren en stdout por Ansible
openvpn_key_dir cadena /etc/openvpn/keys Ruta donde se almacenarán las claves privadas del servidor y la CA
openvpn_ovpn_dir cadena /etc/openvpn Ruta donde se almacenarán las configuraciones de los clientes
openvpn_revoke_these_certs lista [] Lista de certificados de cliente para revocar.
openvpn_selinux_module cadena my-openvpn-server Establecer el nombre del módulo SELinux
openvpn_service_name cadena openvpn Nombre del servicio. Usado por systemctl para iniciar el servicio
openvpn_sync_certs booleano true, false false Revoca certificados que no están definidos explícitamente en 'clients'
openvpn_uninstall booleano true, false false Establecer en verdadero para desinstalar el servicio OpenVPN
openvpn_use_ldap booleano true, false false Usar backend LDAP activo para la autenticación. No se necesita certificado de cliente más

Recogida de Configuración

Cambia estas opciones si necesitas ajustar cómo se descargan las configuraciones a tu sistema local.

Variable Tipo Opciones Predeterminado Comentario
openvpn_fetch_client_configs booleano true, false true Descargar configuraciones de cliente generadas al sistema local
openvpn_fetch_client_configs_dir cadena /tmp/ansible Si openvpn_fetch_client_configs es verdadero, el directorio local para descargar los archivos de configuración del cliente
openvpn_fetch_client_configs_suffix cadena "" Si openvpn_fetch_client_configs es verdadero, el sufijo a agregar a los archivos de configuración del cliente descargados antes de la extensión .ovpn

Cortafuegos

Cambia estas opciones si necesitas forzar un cortafuegos en particular o cambiar cómo el playbook interactúa con el cortafuegos.

Variable Tipo Opciones Predeterminado Comentario
firewalld_default_interface_zone cadena public Zona de Firewalld donde se enviará "ansible_default_ipv4.interface"
iptables_service cadena iptables Sobrescribir el nombre del servicio de iptables
manage_firewall_rules booleano true, false true Permitir que el playbook gestione iptables
openvpn_firewall cadena auto, firewalld, ufw, iptables auto El software de cortafuegos para configurar las reglas de red. "auto" intentará detectarlo inspeccionando el sistema
openvpn_masquerade_not_snat booleano true, false false Establecer en verdadero si quieres configurar MASQUERADE en lugar del SNAT predeterminado en iptables.

Opciones de Configuración de OpenVPN

Estas opciones cambian cómo funciona OpenVPN en sí.

Redes

Variable Tipo Opciones Predeterminado Comentario
openvpn_client_register_dns booleano true, false true Agregar la opción register-dns a la configuración del cliente (solo Windows).
openvpn_client_to_client booleano true, false false Establecer en verdadero si quieres que los clientes se accedan entre sí.
openvpn_custom_dns lista[string] [] Lista de servidores DNS, solo aplicado si openvpn_set_dns está establecido en verdadero
openvpn_dualstack booleano true Si usar o no un socket de doble pila (IPv4 + v6)
openvpn_keepalive_ping int 5 Establecer el intervalo de ping keepalive en segundos.
openvpn_keepalive_timeout int 30 Establecer el tiempo de espera keepalive en segundos
openvpn_local cadena unset Nombre de host o dirección IP local para vincular. Si se especifica, OpenVPN solo se vinculará a esta dirección. Si no se especifica, OpenVPN se vinculará a todas las interfaces.
openvpn_port int 1194 El puerto en el que deseas que OpenVPN se ejecute. Si tienes puertos diferentes en diferentes servidores, te sugiero que establezcas el puerto en tu archivo de inventario.
openvpn_proto cadena udp, tcp udp El protocolo que deseas que use OpenVPN
openvpn_redirect_gateway booleano true, false true Empuje el gateway de OpenVPN
openvpn_resolv_retry int/string cualquier int, infinito 5 Tiempo de reintento de fallo de resolución de hostname. Establecer "infinito" para intentar indefinidamente en caso de mala conexión o recuperación del modo de suspensión del laptop.
openvpn_server_hostname cadena {{ inventory_hostname }} El nombre del servidor que se colocará en el archivo de configuración del cliente
openvpn_server_ipv6_network cadena unset Si se establece, la dirección de red y el prefijo de una red IPv6 para asignar a los clientes. Si es verdadero, IPv4 también se utilizará.
openvpn_server_netmask cadena 255.255.255.0 Máscara de red de la red privada
openvpn_server_network cadena 10.9.0.0 Red privada utilizada por el servicio OpenVPN
openvpn_set_dns booleano true, false true Enviará DNS al cliente (Cloudflare y Google)
openvpn_tun_mtu int unset Establecer el valor tun-mtu. Vacío para predeterminado.

Seguridad

Variable Tipo Opciones Predeterminado Comentario
openvpn_auth_alg cadena SHA256 Establecer el algoritmo de autenticación auth.
openvpn_ca_key dict unset Contiene "crt" y "key". Si no se establece, el certificado CA y la clave se generarán automáticamente en el sistema de destino.
openvpn_cipher cadena AES-256-CBC Establecer la opción cipher para el servidor y el cliente.
openvpn_crl_path cadena unset Definir una ruta al archivo CRL para la verificación de revocación del servidor.
openvpn_duplicate_cn booleano true, false false Agregar la opción duplicate-cn a la configuración del servidor - permite a los clientes conectarse múltiples veces con la misma clave. ¡NOTA! Las direcciones IP de los clientes ya no serán estáticas.
openvpn_rsa_bits int 2048 Número de bits utilizados para proteger los certificados generados.
openvpn_script_security int 1 Establecer la opción de seguridad del script de OpenVPN
openvpn_tls_auth_key cadena unset Elemento único con una clave de autenticación TLS pre-generada.
openvpn_use_crl booleano true, false false Configurar el servidor OpenVPN para honrar la lista de revocación de certificados.
openvpn_use_hardened_tls booleano true, false true Requerir una versión mínima de TLS 1.2
openvpn_use_modern_tls booleano true, false true Usar cifrado moderno para la encriptación TLS (no recomendado con OpenVPN 2.4)
openvpn_use_pregenerated_dh_params booleano true, false false Los parámetros DH se generan con la instalación por defecto
openvpn_verify_cn booleano true, false false Verificar que el CN del certificado coincida con el FQDN
tls_auth_required booleano true, false true Solicitar al cliente que envíe la ta.key generada del servidor durante la conexión

Operaciones

Variable Tipo Opciones Predeterminado Comentario
openvpn_addl_client_options lista vacío Lista de opciones de cliente definidas por el usuario que no están ya presentes en la plantilla del cliente. (por ejemplo, - mssfix 1400)
openvpn_addl_server_options lista vacío Lista de opciones de servidor definidas por el usuario que no están ya presentes en la plantilla del servidor. (por ejemplo, - ping-timer-rem)
openvpn_compression cadena lzo Establecer la opción de compresión compress. Vacío para sin compresión.
openvpn_config_file cadena openvpn_{{ openvpn_proto }}_{{ openvpn_port }} El nombre del archivo de configuración que deseas usar (establecido en vars/main.yml)
openvpn_enable_management booleano true, false false
openvpn_ifconfig_pool_persist_file cadena ipp.txt
openvpn_management_bind cadena /var/run/openvpn/management unix La interfaz para vincular a la interfaz de gestión. Puede ser un socket unix o TCP.
openvpn_management_client_user cadena root Usar este usuario al usar un socket Unix para la interfaz de gestión.
openvpn_push lista vacío Establecer aquí una lista de cadenas que se insertarán en el archivo de configuración como push "". Ej. - route 10.20.30.0 255.255.255.0 generará push "route 10.20.30.0 255.255.255.0"
openvpn_script_client_connect cadena unset Ruta a tu script de conexión de cliente OpenVPN
openvpn_script_client_disconnect cadena unset Ruta a tu script de desconexión de cliente OpenVPN
openvpn_script_down cadena unset Ruta a tu script de apagado de OpenVPN
openvpn_script_up cadena unset Ruta a tu script de encendido de OpenVPN
openvpn_service_group cadena nogroup Establecer el grupo del servicio OpenVPN.
openvpn_service_user cadena nobody Establecer el usuario del servicio OpenVPN.
openvpn_status_version int 1, 2, 3 1 Definir el formato del archivo openvpn-status.log donde se enumeran las conexiones actuales de clientes
openvpn_topology cadena unset La palabra clave "topología" se establecerá en la configuración del servidor con el valor especificado.

Configuración de cliente OpenVPN personalizada (enviada desde el servidor)

Variable Tipo Opciones Predeterminado Comentario
openvpn_client_config booleano false Establecer en verdadero si habilitar el directorio de configuración del cliente
openvpn_client_config_dir cadena ccd Ruta del client-config-dir
openvpn_client_configs dict {} Diccionario de configuraciones de cliente personalizadas

Logrotate

Establecer tus propias opciones de logrotate personalizadas

Variable Tipo Opciones Predeterminado Comentario
openvpn_log_dir cadena /var/log Establecer la ubicación de los archivos de registro de openvpn. Este parámetro es parte de la configuración log-append.
openvpn_log_file cadena openvpn.log Establecer el nombre del archivo de registro. Este parámetro es parte de la configuración log-append.
openvpn_logrotate_config cadena rotate 4
weekly
missingok
notifempty
sharedscripts
copytruncate
delaycompress
Configurar el script de logrotate.

Empaquetado

Este rol incluye un montón de paquetes diferentes. Sobrescribe los nombres según sea necesario.

Variable Tipo Opciones Predeterminado Comentario
epel_package_name cadena epel-release Nombre del paquete epel-release a instalar desde el gestor de paquetes
iptables_persistent_package_name cadena iptables-persistent Nombre del paquete iptables-persistent a instalar desde el gestor de paquetes
iptables_services_package_name cadena iptables-services Nombre del paquete iptables-services a instalar desde el gestor de paquetes
openssl_package_name cadena openssl Nombre del paquete openssl a instalar desde el gestor de paquetes
openvpn_ldap_plugin_package_name cadena openvpn-auth-ldap Nombre del paquete openvpn-auth-ldap a instalar desde el gestor de paquetes
openvpn_package_name cadena openvpn Nombre del paquete openvpn a instalar desde el gestor de paquetes
python_firewall_package_name cadena python-firewall Nombre del paquete python-firewall a instalar desde el gestor de paquetes

Objeto LDAP

Variable Tipo Opciones Predeterminado Comentario
ldap dict Diccionario que contiene la configuración de LDAP
url cadena ldap://host.example.com Dirección de tu backend LDAP con la sintaxis ldap[s]://host[:puerto]
anonymous_bind cadena False , True False Esta no es una variable booleana de Ansible, sino una cadena que se enviará al archivo de configuración.
bind_dn cadena uid=Manager,ou=People,dc=example,dc=com Bind DN utilizado si "anonymous_bind" está establecido en "False"
bind_password cadena mysecretpassword Contraseña del usuario bind_dn
tls_enable cadena true , no no Forzar cifrado TLS. No es necesario con direcciones ldaps
tls_ca_cert_file cadena /etc/openvpn/auth/ca.pem Ruta al CA de ldap backend. Esto debe haberse enviado antes
tls_cert_file cadena Ruta al certificado de autenticación del cliente
tls_key_file cadena Ruta a la clave de autenticación del cliente
base_dn cadena ou=People,dc=example,dc=com Base DN donde el backend buscará usuarios válidos
search_filter cadena (&(uid=%u)(accountStatus=active)) Filtro de búsqueda ldap
require_group cadena False , True Esta no es una variable booleana de Ansible, sino una cadena que se enviará al archivo de configuración.
group_base_dn cadena ou=Groups,dc=example,dc=com Precisa el grupo a buscar. Necesario si require_group está establecido en "True"
group_search_filter cadena ((cn=developers)(cn=artists)) Precisa grupos válidos
verify_client_cert cadena none , optional , require client-cert-not-required En OpenVPN 2.4+, client-cert-not-required está obsoleto. Usa verify-client-cert en su lugar.

Dependencias

No depende de ningún otro rol

Ejemplo de Playbook

- hosts: vpn
  gather_facts: true
  roles:
    - role: kyl191.openvpn
      openvpn_port: 4300
      openvpn_sync_certs: true
      clients:
        - client1
        - client2

Nota: Como el rol necesitará conocer la plataforma remota utilizada (32 o 64 bits), debes establecer gather_facts en true en tu juego.

Licencia

MIT

Información del Autor

Escrito por Kyle Lexmond

Acerca del proyecto

Ansible role to install and configure openvpn.

Instalar
ansible-galaxy install bwinfosec.openvpn
Licencia
eupl-1.2
Descargas
19.5k
Propietario
The universities in the state of Baden-Württemberg have joined forces to form the bwInfoSec federation in order to jointly improve information security.