Después de configurar su propio servidor OpenVPN, es posible que desee mejorar su seguridad. Una forma de hacerlo y agilizar su proceso de autenticación es usar el inicio de sesión único o el inicio de sesión único (SSO), también conocido como SAML (este es un protocolo SSO). Esto agrega otra medida de seguridad para evitar que usuarios no deseados se conecten a su servidor y, al mismo tiempo, se integra con su sistema de administración de usuarios, identidades o clientes o proceso de autenticación existente.
Esta guía proporciona un ejemplo de cómo podría funcionar esto con Okta, una popular plataforma de identidad basada en la nube. Los conceptos básicos de este ejemplo se traducen en la mayoría de los sistemas de administración de identidades (IDMS) con solo cambios en la forma en que se comunica con el IDMS de su elección.
Tenga en cuenta que este ejemplo está diseñado para mostrar los conceptos básicos de cómo un sistema IDM o SSO puede integrarse con OpenVPN en el lado del servidor, no está diseñado para usarse tal cual.
Preparación
Para esta guía, asumimos:
- Tiene una cuenta de Okta (esta guía funcionará con la versión de prueba gratuita de Okta)
- Ya has instalado la última versión de Ubuntu (20.04 en el momento de escribir este artículo)
- Tienes raíz acceso a esta instalación
- Tiene acceso público a este sistema en los puertos 80 y 443 para acceso HTTP y HTTPS, y un DNS A-NAME que lo apunta (por ejemplo, openvpnsso.server.com)
- Ya tiene una copia de Viscosity instalada en su dispositivo cliente y ya está configurada para este servidor
La documentación de Okta se puede encontrar en https://help.okta.com/en/prod/Content/index.htm
Puede encontrar más ejemplos de Okta en su página de GitHub en https://github.com/okta
Esta guía solo debe usarse como ejemplo para configurar SSO en su servidor. El sitio web proporcionado de Python Flask está diseñado solo como ejemplo y no está diseñado para uso de producción.
Si está comenzando desde cero con una instalación nueva de Ubuntu 20.04, este proceso desde aquí hasta el final solo debería tomar unos 20 minutos.
Configuración de Okta
Primero, debemos configurar Okta para el nuevo sitio web que manejará la comunicación entre OpenVPN y Okta.
- Inicie sesión en Okta en su cuenta de administrador
- A la izquierda, expanda el menú y vaya a Aplicaciones> Aplicaciones
- Haga clic en Crear integración de aplicaciones
- Seleccione ODIC - OpenID Connect , luego Aplicación web y haga clic en Siguiente
- Proporcione su nombre de integración de la aplicación un nombre que reconocerá como 'Mi servidor OpenVPN'
- Asegúrese de Código de autorización es la única opción marcada en "Cliente que actúa en nombre de un usuario" en "Tipo de concesión"
- Reemplazando '
' en lo siguiente, configure sus URI de redirección de inicio de sesión a http://<yourserver.com>/authorization-code/callback
- Opcionalmente, reemplazando nuevamente '
' en lo siguiente, configure sus URI de redirección de cierre de sesión a http://<yourserver.com>/logout
- Establecer acceso controlado a su elección, con fines de prueba si se trata de una cuenta de prueba, simplemente seleccione Permitir que todos en su organización accedan
- Haga clic en Guardar
Después de guardar, la página se recargará. Mantenga esta página abierta o tome nota ahora del ID de cliente , Secreto del cliente y dominio Okta , los necesitaremos más tarde.
Configuración del servidor
A continuación, necesitamos configurar el servidor. En resumen, necesitamos un servidor OpenVPN listo para funcionar, para instalar nginx como proxy para la aplicación Python Flask, realizar algunos pequeños cambios en el firewall, instalar un certificado SSL, configurar la aplicación Flask y realizar algunos pequeños cambios en OpenVPN.
Preparación del servidor
Primero, inicie sesión en su servidor a través de SSH o abra una Terminal y ejecute lo siguiente para asegurarse de que todo esté actualizado
sudo apt-get update
sudo apt-get -y upgrade
Configuración del servidor OpenVPN
Primero necesitaremos un servidor OpenVPN listo para funcionar. Si aún no tiene uno en este servidor, siga la Configuración de un servidor OpenVPN con Ubuntu y Viscosity.
Una vez configurado, asegúrese de poder conectarse.
A continuación, debemos agregar algunas líneas a la configuración del servidor OpenVPN:
- Edite la configuración
sudo nano /etc/openvpn/server.conf
- Al final del archivo, agregue lo siguiente:
management 127.0.0.1 50123 auth-user-pass-optional management-client-auth
- Presione Ctrl+X para salir, Y para guardar, luego Enter para confirmar la ruta
- Reinicie el servidor con
sudo systemctl restart [email protected]
Si intenta conectarse ahora, la conexión debería fallar eventualmente con un mensaje de error de autenticación.
Notas:
Si tiene un servidor existente que tiene scripts de autenticación o complementos, estos deberán eliminarse ya que SSO los reemplazará. Okta se puede configurar con opciones 2FA, aunque no las cubriremos en esta guía, consulte la documentación de Okta.
Configuración del servidor web
Cortafuegos
Si siguió la guía Configuración de un servidor OpenVPN con Ubuntu y Viscosity, primero debemos abrir el firewall para permitir el tráfico HTTP y HTTPS, ejecute lo siguiente:
-
sudo ufw allow http
-
sudo ufw allow https
-
sudo ufw reload
Instalar ningx
A continuación, necesitamos instalar nginx. nginx es un servidor proxy inverso y HTTP que proporcionará componentes de nuestra aplicación web y permitirá el uso de funciones como TLS/SSL. Haga lo siguiente en su servidor Ubuntu:
- Ejecute
sudo apt-get -y install nginx
- Edite
sudo nano /etc/nginx/sites-enabled/default
- Desplácese hacia abajo hasta la línea
server_name _;
y reemplace el guión bajo (_) con el nombre DNS de su servidor, por ejemplo myserver.com, para que se vea así:server_name myserver.com;
- Presione Ctrl+X para salir, Y para guardar, luego Enter para confirmar la ruta
- Vuelva a cargar nginx con
sudo nginx -s reload
Configurar Let's Encrypt
Si ya tiene un certificado SSL para esta sección, puede pasar a la siguiente sección. De lo contrario, Let's Encrypt y Certbot simplifican la obtención de un certificado SSL.
- Ejecute
sudo apt-get install -y certbot python3-certbot-nginx
- Ejecute lo siguiente, reemplace myserver.com con su FQDN y siga las indicaciones
sudo certbot --nginx -d myserver.com
. Puede especificar dominios adicionales si los necesita, por ejemplosudo certbot --nginx -d myserver.com -d www.myserver.com -d sso.myserver.com
. - Es posible que el certbot tarde unos minutos en responder después de responder a las indicaciones
- Una vez terminado, certbot puede renovar automáticamente su certificado, simplemente agregue un cronjob para ejecutar
/usr/bin/certbot renew --quiet
una vez al día.
Configurar nginx
Ahora que tiene un certificado SSL, podemos finalizar la configuración de nginx.
- Edite
sudo nano /etc/nginx/sites-enabled/default
- Eliminar la siguiente sección:
location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; }
- Desplácese hacia abajo hasta después de las líneas
# managed by Certbot
, pero antes del}
y pega lo siguiente:
real_ip_header X-Real-IP; real_ip_recursive on; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; location / { try_files $uri @proxy; } location @proxy { proxy_pass http://127.0.0.1:8080; proxy_pass_header Server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass_header Server; proxy_connect_timeout 3s; proxy_read_timeout 10s; }
- Presione Ctrl+X para salir, Y para guardar, luego Enter para confirmar la ruta
- Vuelva a cargar nginx con
sudo nginx -s reload
Instalación de la aplicación web
Ahora podemos instalar la aplicación web e iniciarla. Crearemos un usuario para ejecutar la aplicación web, ya que crea un poco más de seguridad. Ejecute lo siguiente:
-
sudo apt-get install -y python3-pip
Instale python pip para que podamos instalar las dependencias de Flask -
sudo adduser --system --no-create-home --group ssoappuser
Cree un usuario para ejecutar la aplicación web como -
cd /home
-
sudo mkdir ssoapp
-
sudo chown ssoappuser:ssoappuser ssoapp
-
cd ssoapp
-
sudo git clone https://github.com/thesparklabs/openvpn-okta-sso-example.git
Descarga la aplicación web desde GitHub -
cd openvpn-okta-sso-example
-
sudo python3 -m pip install -r requirements.txt
Instalar dependencias para la aplicación web -
sudo cp ssoapp.service /lib/systemd/system/ssoapp.service
Instale el archivo de servicio -
sudo chown root:root /lib/systemd/system/ssoapp.service
-
sudo systemctl daemon-reload
Configuración de la aplicación web
Finalmente, solo necesitamos un trabajo de configuración rápido para que la aplicación web funcione y hable con Okta. Aquí es donde necesitará ID de cliente , Secreto del cliente y dominio Okta nos reunimos para configurar Okta antes.
- Haga una copia de la plantilla de secretos con
sudo cp client_secrets.json.dist client_secrets.json
- Cree un secreto aleatorio con lo siguiente y cópielo
openssl rand -hex 20
- Edite la configuración con
sudo nano client_secrets.json
- Reemplazar {{ESTO_ES_UN_SECRETO}} con la cadena aleatoria que generamos hace dos pasos
- Reemplazar {{OKTA_DOMAIN}} en auth_uri, emisor, token_uri y userinfo_uri con tu dominio Okta
- Reemplazar {{CLIENT_ID}} con su ID de cliente
- Reemplazar {{CLIENT_SECRET]] con su secreto de cliente
- Reemplazar {{SU_DOMINIO}} con la dirección de su servidor, p. myserver.com
- Presione Ctrl+X para salir, Y para guardar, luego Enter para confirmar la ruta
- Vuelva a cargar nginx con
sudo nginx -s reload
Ahora podemos habilitar e iniciar el servicio de la aplicación con
- Habilite el servicio para que se inicie cuando el sistema
sudo systemctl enable ssoapp
- Inicie el servicio
sudo systemctl start ssoapp
Configuración del cliente
Si ha seguido esta guía incluyendo el uso de nuestra guía Configuración de un servidor OpenVPN con Ubuntu y Viscosity, no tiene que hacer nada, simplemente conéctese con Viscosity.
Si ha modificado un servidor existente, el único cambio que deberá hacer es desactivar la autenticación de usuario/contraseña si está activada. Para hacer esto, edite la conexión, vaya a Autenticación y desmarque "Usuario Nombre de usuario/Contraseña de autenticación", Guarde la conexión y conéctese.
Tokens de autenticación
OpenVPN auth-gen-token
La aplicación de ejemplo incluye soporte para auth-gen-token. Como no usamos nombre de usuario/contraseña a través de OpenVPN, esto debe manejarse a través de la interfaz de administración. Para habilitarlo, simplemente agregue auth-gen-token 0 external-auth
a la configuración de su servidor.
Actualización de token Okta
El ejemplo anterior se puede ampliar para usar tokens de Okta en lugar de los tokens de autenticación de OpenVPN para la reautenticación. No proporcionaremos un ejemplo de esto ya que el soporte integrado de OpenVPN cubrirá la gran mayoría de las configuraciones.
Sin embargo, si desea usar Okta en su lugar, estas son las principales cosas que debe tener en cuenta:
- Deberá modificar la respuesta de la función clientAllow para enviar su token de autenticación.
- Deberá modificar la función clientReauth para tomar la contraseña del entorno del cliente que se pasa a través de la interfaz de administración, seguir la documentación de Oktas para actualizar este token y luego enviar una respuesta de autenticación de cliente similar a clientAllow que incluya el token actualizado.
- Deberá modificar la configuración del servidor y del cliente para asegurarse de que el reneg-sec sea menor que el vencimiento de los tokens de Okta