bwinfosec.openvpn
TODO: Actualizar este README para reflejar los cambios en el fork de bwinfosec.
OpenVPN
Github Actions (PRs y línea principal):
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
entrue
en tu juego.
Licencia
MIT
Información del Autor
Escrito por Kyle Lexmond
ansible-galaxy install bwinfosec.openvpn