¿Cómo utilizo un proxy de NGINX para acceder a OpenSearch Dashboards desde fuera de una VPC que utiliza la autenticación de Amazon Cognito?

Última actualización: 26/10/2021

Mi clúster de Amazon OpenSearch Service (sucesor de Amazon Elasticsearch Service) se encuentra en una nube virtual privada (VPC). Quiero utilizar un proxy de NGINX para acceder a OpenSearch Dashboards desde fuera de la VPC con autenticación de Amazon Cognito. ¿Cómo puedo hacerlo?

Descripción breve

Utilice NGINX para configurar una instancia de Amazon Elastic Compute Cloud (Amazon EC2) como servidor proxy. Después, el servidor proxy reenvía las solicitudes del navegador a Amazon Cognito y OpenSearch Dashboards.

También puede utilizar un túnel SSH o Client VPN para acceder a OpenSearch Dashboards desde fuera de una VPC con autenticación de Amazon Cognito. Para obtener más información, consulte ¿Cómo puedo utilizar un túnel SSH para acceder a OpenSearch Dashboards desde fuera de una VPC con la autenticación de Amazon Cognito? Para obtener más información, consulte ¿Cómo puedo utilizar un túnel SSH para acceder a OpenSearch Dashboards desde fuera de una VPC con la autenticación de Amazon Cognito?

Nota: OpenSearch Dashboards es el sucesor de Kibana.

Resolución

Importante: El dominio de OpenSearch Services es más seguro cuando el usuario restringe el acceso a los usuarios de la VPC. Antes de continuar, asegúrese de que este procedimiento no infrinja los requisitos de seguridad de su organización.

1.    Cree un grupo de usuarios de Amazon Cognito.

2.    Configure un dominio de grupo de usuarios alojado.

3.    En el panel de navegación de la consola de Amazon Cognito, elija Users and groups (Usuarios y grupos).

4.    Elija Create user (Crear un usuario) y, a continuación, complete los campos. Asegúrese de ingresar una dirección de email y seleccionar la casilla Mark email as verified (Marcar email como verificado).

5.    Elija la pestaña Groups (Grupos) y, a continuación, elija Create group (Crear un grupo). En Precedence (Prioridad), ingrese 0. Para obtener más información, consulte Creación de un grupo nuevo en la consola de administración de AWS.

6.    Vuelva a abrir la consola de Amazon Cognito.

7.    Elija Manage Identity Pools (Administrar grupos de identidades) y, a continuación, elija Create new identity pool (Crear un nuevo grupo de identidades).

8.    Ingrese un nombre para el grupo de identidades, active la casilla de verificación de Enable access to unauthenticated identities (Habilitar el acceso a identidades no autenticadas) y, a continuación, elija Create Pool (Crear un grupo).

9.    Cuando se le solicite acceso a los recursos de AWS, elija Allow (Permitir) para crear los dos roles predeterminados asociados al grupo de identidades. Cree un rol predeterminado para los usuarios no autenticados y cree el otro rol predeterminado para los usuarios autenticados.

10.    Configure el dominio de OpenSearch Services para que utilice la autenticación de Amazon Cognito para OpenSearch Dashboards:
En Cognito User Pool (Grupo de usuarios de Cognito), elija el grupo de usuarios que creó.
En Cognito Identity Pool (Grupo de identidades de Cognito), elija el grupo de identidades que creó.
Para obtener más información, consulte Get started with Amazon OpenSearch Service: Use Amazon Cognito for OpenSearch Dashboards access control.

11.    Configure la política de acceso para que sea una política basada en recursos como la siguiente:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::account-id:role/Cognito_identity-nameAuth_Role"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:region:aws-account-id:domain/domain-name/*"
    }
  ]
}

Debe actualizar estos valores:
account-id: el ID de la cuenta de AWS
identity-name: el nombre del grupo de identidades de Amazon Cognito
ES-name: el nombre del dominio de OpenSearch Services
region: la región en la que reside el dominio de OpenSearch Service, como us-east-1

12.    Lance una instancia EC2 en una subred pública de la misma VPC que el dominio de OpenSearch Services. Asegúrese de que la instancia utilice el mismo grupo de seguridad que el dominio.

13.    (Opcional) Si no utiliza un entorno de prueba, asigne una dirección IP elástica para asociarla a la instancia que haya creado. Para obtener más información sobre la asignación de direcciones IP elásticas, consulte Trabajar con direcciones IP elásticas.

14.    (Opcional) Si no usa un entorno de prueba, configure el DNS para resolver las solicitudes de la dirección IP elástica. Para obtener más información sobre cómo resolver solicitudes con Amazon Route 53, consulte Configuración de Amazon Route 53 para dirigir el tráfico a una instancia de Amazon EC2.

15.    Conéctese a la instancia e instale NGINX.

Para las instancias lanzadas con una AMI de Amazon Linux 2, utilice el siguiente comando:

$ sudo amazon-linux-extras install nginx1

16.    Obtenga un certificado SSL de una entidad emisora de certificados (CA) para configurar SSL para NGINX.

Nota: Si utiliza un entorno de prueba, genere un certificado autofirmado en su lugar. Los navegadores no confían en los certificados autofirmados y no deben utilizarse en entornos de producción.

17.    (Opcional) Si utiliza un entorno de prueba con un certificado autofirmado, utilice el comando OpenSSL x509 para generar una clave privada:

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt

Esta sintaxis de comandos genera cert.key, una clave privada para el certificado SSL autofirmado.

18.    Vaya al directorio /etc/nginx/conf.d y, a continuación, cree un archivo denominado default.conf. Modifique el archivo con los valores siguientes:
/etc/nginx/cert.crt: la ruta de acceso al certificado SSL
/etc/nginx/cert.key: la ruta de acceso a la clave privada que generó para el certificado SSL
$domain-endpoint: el punto de enlace de OpenSearch Services
$cognito_host: el dominio del grupo de usuarios de Amazon Cognito (configurado en el paso 2)

Puede utilizar el comando sed para asignar $domain-endpoint y $cognito_host como variables, en lugar de reemplazarlas directamente en el archivo default.conf. Además, asegúrese de utilizar HTTPS, o podría producirse un error.

En este ejemplo, tenga en cuenta lo siguiente:

  • Si en el dominio de Amazon OpenSearch Service se está ejecutando OpenSearch Service versión 1.0+, utilice el punto de enlace _dashboards.
  • Si en el dominio de Amazon OpenSearch Service se están ejecutando las versiones 5.x-7.x de Elasticsearch, utilice el punto de enlace _plugin/kibana.
server {
    listen 443;
    server_name $host;
    rewrite ^/$ https://$host/_dashboards redirect;

    ssl_certificate           /etc/nginx/cert.crt;
    ssl_certificate_key       /etc/nginx/cert.key;

    ssl on;
    ssl_session_cache  builtin:1000  shared:SSL:10m;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;

    location /_dashboards {
        # Forward requests to Dashboards
        proxy_pass https://$domain-endpoint/_dashboards;

        # Handle redirects to Cognito
        proxy_redirect https://$cognito_host https://$host;

        # Update cookie domain and path
        proxy_cookie_domain $domain-endpoint $host;
        proxy_cookie_path / /_dashboards/;

        # Response buffer settings
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
    }

    location ~ \/(log|sign|fav|forgot|change|saml|oauth2) {
        # Forward requests to Cognito
        proxy_pass https://$cognito_host;

        # Handle redirects to Dashboards
        proxy_redirect https://$domain-endpoint https://$host;

        # Update cookie domain
        proxy_cookie_domain $cognito_host $host;
    }
}

Importante: El parámetro resolver (solucionador) cambia según la configuración de la VPC. El solucionador del DNS se encuentra en la IP base del bloque de CIDR principal más dos. Por ejemplo, si crea una VPC con el bloque de CIDR 10.0.0.0/24, el solucionador del DNS se encuentra en 10.0.0.2.

19.    (Opcional) Utilice el comando sed para asignar las variables $domain-endpoint y $cognito_host:

$ sudo sed -i 's/$domain-endpoint/vpc-mydashboards-111xxx.us-east1.es.amazonaws.com/' /etc/nginx/conf.d/default.conf
$ sudo sed -i 's/$cognito_host/mydomain.auth.us-east-1.amazoncognito.com/' /etc/nginx/conf.d/default.conf

Nota: No es necesario reemplazar $domain-endpoint y $cognito_host en el archivo /etc/nginx/conf.d/default.conf.

20.    Reinicie NGINX.

Para las instancias lanzadas con una AMI de Amazon Linux, utilice este comando:

$ sudo service nginx restart

Para las instancias lanzadas con una AMI de Amazon Linux 2, utilice este comando:

$ sudo systemctl restart nginx.service

21.    Utilice su navegador para acceder a la IP de NGINX o al nombre del DNS. Se le redirigirá a la página de inicio de sesión de Amazon Cognito.

22.    Para iniciar sesión en Dashboards, ingrese su nombre de usuario y contraseña temporal. A continuación, cambie la contraseña cuando se le solicite e inicie sesión de nuevo.