Blog de Amazon Web Services (AWS)

Cree una solución, basada en servicios sin servidor para resolver una sesión con NICE DCV Connection Gateway

Por Andrew Morgan

Los clientes pueden implementar una solución personalizada para resolver una sesión para NICE DCV Connection Gateways utilizando servicios de AWS sin servidor. Este enfoque proporciona un punto de enlace seguro que resuelve conexiones tipo DCV a escala sin requerir infraestructura dedicada. Debido a esto, los administradores se benefician de la alta disponibilidad incorporada, el aumento de la agilidad y las optimizaciones de costos que ofrece la tecnología sin servidor. Los usuarios finales que se conectan a través de una puerta de enlace de conexión DCV se enrutan sin problemas a su sesión DCV, sin depender de un solo punto de falla para resolver su sesión.

En esta publicación es de un  nivel intermededio, en donde se implementa un punto de enlace de resolución de sesión sin servidor para DCV Connection Gateway. Se accede a este mediante el uso de Amazon API Gateway y AWS Lambda. Cuando la puerta de enlace resuelve un ID de sesión, espera como respuesta la dirección IP privada del servidor DCV de destino. En este blog, se usa el ID de instancia de Amazon Elastic Compute Cloud (Amazon EC2) como ID de sesión. Su puerta de enlace hará la acción de POST con la información de la sesión en base a  su API de resolución y obtendrá como respuesta la IP privada del servidor DCV de destino.

Visión generalAn architecture of an API Gateway and Lambda function acting as a serverless resolver for DCV Connection Gateway

Esta arquitectura muestra como un usuario final se conecta a un servidor DCV usando puerta de enlace de conexión DCV. La estructura de esta conexión es DCV-Gateway-IP-or-DNS:8443/?authToken=TOKEN#SessionId. Cuando el usuario se conecta a esta puerta de enlace con esta información, el parámetro SessionID se envía como una solicitud HTTP POST a una API Gateway. Se accede de forma segura a la puerta de enlace API a través de un endpoint privado de Amazon Virtual Private Cloud (Amazon VPC). El método POST en API Gateway envía esta información a una función Lambda que devuelve, a su vez,  la dirección IP privada del servidor DCV de destino. En este tutorial, se usa el ID de instancia EC2 como el ID de sesión, sin embargo, esto se puede personalizar para usar con otro tipo de identificadores.

Prerrequisitos

Para seguir este blog, necesitará un par de claves de Amazon EC2 y permisos de AWS Identity and Access Management (IAM) para:

  • Crear una puerta de enlace API
  • Crear un punto de enlace de VPC
  • Crear una función Lambda
  • Crear un rol y una política de IAM
  • Crear una instancia de Amazon EC2

También necesitará una Amazon VPC con resolución DNS y nombres de host DNS habilitados. Debe tener la subred pública y privada configurada siguiendo las mejores prácticas de VPC.

Tutorial

Paso 1: Crear un punto de enlace de VPC para API Gateway

  1. Acceda a la página Endpoints de Amazon VPC en la consola de administración de AWS.
  2. Seleccione Crear punto de enlace.
  3. (Opcional) Asigne una etiqueta Nombre al punto de enlace.
  4. Verifique que la opción de servicios de AWS esté seleccionada en Categoría de servicio.
  5. En el cuadro de búsqueda Servicios, inserte execute-api, seleccione el filtro propuesto (formateado como com.amazonaws.REGION.execute-api) y luego seleccione el elemento com.amazonaws.REGION.execute-api.
  6. En la sección VPC, selecciona tu ID de VPC en el menú desplegable.
  7. En la sección Subredes, seleccione las subredes privadas a las que se pueda acceder desde donde planea aprovisionar su puerta de enlace de conexión DCV.
  8. En la sección Grupos de seguridad, seleccione un grupo de seguridad que permita el acceso al punto de enlace dentro de la subred.
  9. En la sección Política, seleccione Acceso completo.
  10. Por último, seleccione Crear punto de enlace.
  11. Tome nota del ID de punto de enlace de VPC, es necesario más tarde.

Paso 2: Crear la función DCVSessionResolver Lambda

En este paso, se crea la función DCVSessionResolver Lambda. Esta función permite al usuario generar un token de autenticación para ser utilizado para autenticarse con el servidor DCV.

  1. Vaya a la consola de AWS Lambda.
  2. Seleccione Crear función.
  3. Verificar Crear desde cero está seleccionado.
  4. Escriba DCVSessionResolver en el espacio para Nombre de la función.
  5. En el cuadro Tiempo de ejecución, seleccione Python 3.12 o posterior.
  6. En el cuadro Arquitectura, seleccione arm64.
  7. Seleccione Crear función.
  8. Una vez creada la función, reemplace el contenido de la función Lambda con el código en el repositorio Github.
  9. Seleccione Desplegar.
  10. Vaya a la pestaña Configuración, seleccione Permisos en la lista de la izquierda y luego seleccione el enlace de rol debajo Nombre del rol.
  11. Seleccione el botón Agregar permisos y luego Crear política insertada.
  12. Seleccione el enlace Elija un servicio en la sección de Servicio y busque EC2.
  13. En la sección Acciones permitidas, seleccione la acción de DescribeInstances, este esta en la categoría Enumerar.
  14. Seleccione Siguiente.
  15. Inserte un nombre para la política en el cuadro Nombre de la política.
  16. Seleccione Crear política.

Paso 3: Crear una puerta de enlace API

En este paso, se crea una API Gateway. Esto actúa como un disparador Lambda privado para invocar la función DCVSessionResolver que creó en el paso anterior.

  1. Navegue a la consola de Amazon API Gateway. Verifique que se encuentre en la región en la que creó el punto de enlace de VPC.
  2. Seleccione Crear API.
  3. En la sección REST API Private, seleccione el botón Generar.
  4. En la página Crear API REST, mantenga Nueva API seleccionada y asigne un nombre a su API DCVSessionResolver.
  5. En el menú desplegable ID de punto de enlace de VPC, seleccione el punto de enlace de VPC que creó en el paso uno y seleccione Agregar.
  6. Seleccione Crear API.
  7. Una vez creada la API, en la página Recursos, seleccione Crear recurso.
  8. En Nombre del recurso, ingrese ResolveSession y seleccione Crear recurso.
  9. En el recurso ResolveSession, seleccione Crear método.
  10. Para Tipo de método, seleccione POST.
  11. Seleccione el botón de opción Función Lambda y active el control deslizante de integración de proxy Lambda.
  12. Para el menú desplegable de la función Lambda, seleccione la función Lambda que creó en el paso anterior y seleccione Crear método.
  13. Navegue a la página Política de recursos de la lista de la izquierda y seleccione Crear política.
  14. En el menú desplegable Seleccionar una plantilla, seleccione la lista Permitir VPC de origen.
  15. En la política recién agregada, realice los siguientes cambios:
    • {{stageNameOrWildcard}}: Beta
    • {{httpVerbOrWildcard }}: POST
    • {{ resourcePathOrWildcard }}: resolveSession
    • “aws:sourceVpc”: aws:sourceVpce
    • {{ vpcID }}: ID de punto de enlace de VPC del paso 1
      • Tenga en cuenta que AWS:SourceVPC ha sido reemplazado por AWS:SourceVPCE. A continuación se puede encontrar una política de ejemplo.
        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Deny",
                    "Principal": "*",
                    "Action": "execute-api:Invoke",
                    "Resource": "arn:aws:execute-api:REGION:ACCT-ID:API-ID/Beta/POST/resolveSession",
                    "Condition": {
                        "StringNotEquals": {
                            "aws:sourceVpce": "vpce-1234567890abcdef0"
                        }
                    }
                },
                {
                    "Effect": "Allow",
                    "Principal": "*",
                    "Action": "execute-api:Invoke",
                    "Resource": " arn:aws:execute-api:REGION:ACCT-ID:API-ID/Beta/POST/resolveSession"
                }
            ]
        }
  16. Selecciona Guardar cambios.
  17. Seleccione Recursos en el panel de navegación.
  18. Seleccione Implementar API en la página del método /ResolveSession.
  19. Selecciona *Nueva Etapa* y nombra la etapa Beta.
  20. Seleccione Desplegar.
  21. Tome nota de la URL de invocación de la API recién creada y el ID de API. La URL está en el formato https://API-ID.execute-api.REGION.amazonaws.com/Beta/ y el ID de API se recupera de ella.

Paso 4: Crear una función de IAM para la puerta de enlace de conexión DCV

En este paso, cree un rol de IAM para su instancia EC2 de puerta de enlace de conexión DCV. El rol de IAM permite que la puerta de enlace invoque el API gateway para resolver los ID de sesión entrantes.

  1. Vaya a la página Políticas de la consola de AWS IAM.
  2. Seleccione Crear política.
  3. Seleccione la sección Elegir un servicio en la sección Servicio y seleccione ExecuteAPI.
  4. En la sección Nivel de acción, seleccione Invocar.
  5. En Recursos, seleccione el botón de opción Específico. Dentro de la sección execute-api-general, seleccione Agregar ARN. En el cuadro de diálogo, inserte lo siguiente:
    • Para Recurso en, seleccione Esta cuenta.
    • En el cuadro Región, la región donde creó la API Gateway.
    • En el cuadro Api id el ID de API recuperado al final del paso tres.
    • En el cuadro Etapa inserte Beta.
    • En el cuadro Método inserte POST.
    • En el cuadro Api specific resource path insert DCVSessionResolver.
    • Seleccione Agregar ARN.
  6. Seleccione Siguiente.
  7. Inserte DCVSessionResolverAPIPolicy en el cuadro Nombre.
  8. Seleccione Crear política.
  9. Elija Roles en el panel de navegación.
  10. Elija Crear rol.
  11. Seleccione EC2 en la sección Caso de uso y seleccione Siguiente.
  12. En la página Agregar permisos, seleccione DCVSessionResolverApiPolicy.
  13. Elija Siguiente.
  14. En Nombre de rol, escriba DCVSessionResolverApiRol.
  15. Elija Crear rol.

Paso 5: Crear una puerta de enlace de conexión DCV

En este paso, aprovisiona una única puerta de enlace de conexión DCV que tiene su solucionador configurado para usar el punto de enlace privado de API Gateway.

  1. Navegue a la consola EC2.
  2. Seleccione Lanzar instancia.
  3. Para Nombre ingrese DCV Connection Gateway.
  4. Seleccione Amazon Linux 2 como AMI de la instancia.
  5. Usa el menú desplegable Arquitectura para seleccionar 64 bits (Arm).
  6. En Tipo de instancia, seleccione un c7g.large, de la familia de instancias C7g.
  7. Para Par de claves (inicio de sesión), seleccione su par de claves en el menú desplegable.
  8. En la sección Configuración de red, elija la VPC y la subred para la puerta de enlace de conexión DCV.
    • Tenga en cuenta que para este ejemplo, se debe tener acceso directo a la puerta de enlace para establecer conexiones. Si los usuarios finales están iniciando conexiones desde internet, se debe tener una puerta de enlace a Internet.
  9. Seleccione un grupo de seguridad. Este grupo de seguridad proporciona acceso a la puerta de enlace y permite la comunicación entre la puerta de enlace, la puerta de enlace API y los servidores DCV. La configuración predeterminada se une al puerto 8443, sin embargo esto se puede cambiar.
  10. Dentro de la sección Configurar almacenamiento, seleccione el valor predeterminado de 8GB.
  11. Expanda Detalles avanzados.
  12. Seleccione el rol de IAM que creaste en el paso anterior en el menú desplegable del perfil de instancia de IAM.
  13. En la sección Datos de usuario, pegue en el script bootstrap que se encuentra en el repositorio Github.
    • Tenga en cuenta que necesita descomentar el comando sed que establece su punto de enlace de resolución. Reemplace la opción que aparece por defecto RESOLVER-URL con la URL de invocación que anotó en el paso tres.
  14. Seleccione Iniciar instancia.

Validación

En esta sección, se valida que el sistema de resolución de sesiones esté operativo. En este blog, no se desplegaron servidores DCV. Esta sección validará que la API que implementó pueda responder a la puerta de enlace de conexión DCV. Para probar esto, inicia una conexión a la puerta de enlace con un token de autenticación ficticio y un ID de instancia EC2 en su VPC como ID de sesión. Después de iniciar esta conexión, los registros de la puerta de enlace reflejan la resolución de dicha sesión.

  1. Construya su cadena de conexión DCV reemplazando los siguientes marcadores de posición. Esto comienza con https://ya que se usa el navegador como cliente DCV para conectarte.
    • Reemplace GATEWAY-PUBLIC-IP-OR-DNS por la IP pública o DNS de la puerta de enlace de conexión DCV.
    • Reemplace i-abcdef01234567890 con una instancia EC2 en su VPC. Si no tiene otra instancia EC2, puede usar la instancia de DCV Connection Gateway.
    • https:// GATEWAY-PUBLIC-IP-OR-DNS:8443/?authToken=EXAMPLE-TOKEN#i-abcdef01234567890
  2. Se abre el navegador de forma local y acceda a la URL. Tenga en cuenta que, de forma predeterminada, la puerta de enlace utiliza un certificado autofirmado para cifrar el tráfico. Por lo que le aparecerá una solicitud para que confíe en la conexión. En Chrome, selecciona Avanzado y luego el enlace Proceder. En producción, puedes distribuir tu propio certificado TLS.
  3. Una vez falla la conexión, puede usar SSH o AWS Systems Manager Session Manager para conectarse a la instancia de DCV Connection Gateway.
  4. Una vez conectado, se invoca el siguiente comando. La respuesta ilustrará la API resolviendo la dirección IP privada del ID de la instancia proporcionada.
    • cat /var/log/dcv-connection-gateway/gateway.log | grep 'Route found'

Limpieza

Se recomienda eliminar los recursos que se implementaron en este blog, ya que se implementaron recursos que generan costos; incluyendo una API Gateway, un punto de enlace de VPC, una instancia EC2 y una función Lambda. Para mitigar costos adicionales, puede eliminar estos recursos.

Puede eliminar las políticas y roles de IAM creados durante este tutorial.

Conclusión

En este blog, implementó un punto de enlace de resolución de sesión sin servidor para su Gateway de conexión DCV usando los servicios de  API Gateway y Lambda. Esto permite resolver una sesión enrutando la sesión DCV a través del API.  Gateway al servidor DCV asociado con el ID de sesión. El ID de sesión utilizado en este tutorial era la ID de instancia, pero este puede ser cualquier identificador que dé como resultado una respuesta IP privada de destino. El protocolo DCV necesita ser autenticado para comenzar a transmitir la sesión. La autenticación de protocolo cuando se transmite a través de una puerta de enlace de conexión DCV se realiza a través de Autenticación Externa. Para implementar puntos de enlaces de validadores y proveedores de tokens sin servidor, consulte el blog Usar servicios de AWS sin servidor como autenticador externo para NICE DCV. Cabe resaltar, que en una carga de trabajo de producción, se tendrá en la mayoría de los casos un framework de interfaz de usuario para manejar estas interacciones. Este permite a los usuarios finales seleccionar un botón para manejar las acciones previas a la sesión como aprovisionar un token, localizar el ID de sesión de los usuarios y conectar sin problemas al usuario a su sesión mediante el uso de un URI o un cliente de navegador.

Este blog es una traducción del blog en ingles Build a serverless session resolver for your NICE DCV Connection Gateway

Acerca de los autores

Andrew Morgan llegó a AWS en 2019 desde un gran entorno de centros de datos donde se especializó en VMware, Cisco UCS y automatización. A través de su tiempo en AWS, desarrolló una pasión por las cargas de trabajo de visualización. En 2022, comenzó su papel actual como Defensor Sr. Desarrollador para DCV

Traductores y Revisores

Luiz Rampanelli es arquitecto de soluciones en el equipo de AWS Latam. Cuenta con más de 10 años de experiencia con cargas de trabajo de Microsoft en entornos híbridos y de nube. Trabaja diseñando soluciones siguiendo las mejores prácticas para que los clientes puedan aprovechar al máximo los beneficios de la nube de AWS.
Pilar Pinto es Arquitecta de Soluciones para CSC, Cloud Solution Center, un segmento enfocado en apoyar clientes de pequenas y medianas empresas en Latínoamérica. Ella es miebro activo de la comunidad de Seguridad en Latam, por lo que sus recomendaciones van enfocadas en Mejorar la postura de seguridad desde las fases tempranas de una empresa SMB.