Comment utiliser un proxy NGINX pour accéder à OpenSearch Dashboards de l'extérieur d'un VPC utilisant l'authentification Amazon Cognito ?

Dernière mise à jour : 16/09/2022

Mon cluster Amazon OpenSearch Service se trouve dans un cloud virtuel privé (VPC). Je souhaite utiliser un proxy NGINX pour accéder à OpenSearch Dashboards depuis l'extérieur du VPC avec l'authentification Amazon Cognito. Comment puis-je procéder ?

Brève description

Utilisez NGINX pour configurer une instance Amazon Elastic Compute Cloud (Amazon EC2) en tant que serveur proxy. Le serveur proxy transmet ensuite les demandes de navigateur à Amazon Cognito et à OpenSearch Dashboards.

Remarque : cette solution ne fonctionne que pour les utilisateurs natifs d'Amazon Cognito.

Vous pouvez également utiliser un tunnel SSH ou un VPN client pour accéder à OpenSearch Dashboards en dehors d'un VPC avec l'authentification Amazon Cognito. Pour plus d'informations, consultez Comment puis-je accéder à OpenSearch Dashboards depuis l'extérieur d'un VPC utilisant l'authentification Amazon Cognito ?

Remarque : OpenSearch Dashboards est le successeur de Kibana.

Résolution

Important : votre domaine OpenSearch Services est plus sécurisé lorsque vous limitez l'accès aux utilisateurs qui se trouvent dans le VPC. Avant de poursuivre, assurez-vous que cette procédure n'enfreint pas les exigences de sécurité de votre organisation.

1.    Créez un groupe d'utilisateurs Amazon Cognito.

2.    Configurez un domaine de groupe d'utilisateurs hébergé.

3.    Dans le volet de navigation de la console Amazon Cognito, sélectionnez Utilisateurs et groupes.

4.    Sélectionnez Créer un utilisateur, puis complétez les champs. Assurez-vous de saisir une adresse e-mail et cochez la case Marquer l'adresse e-mail comme vérifiée.

5.    Sélectionnez l'onglet Groupes, puis Créer un groupe. Pour Priorité, saisissez 0. Pour plus d'informations, consultez la section Création d'un nouveau groupe dans l'AWS Management Console.

6.    Ouvrez à nouveau la console Amazon Cognito.

7.    Sélectionnez Manage Identity Pools (Gérer des groupes d'identités), puis Créer un groupe d'identités.

8.    Saisissez un nom pour votre groupe d'identités, cochez la case Activer l'accès aux identités non authentifiées, puis sélectionnez Créer un groupe.

9.    Lorsque vous êtes invité à accéder à vos ressources AWS, choisissez Allow (Autoriser) pour créer les deux rôles par défaut associés à votre groupe d'identité. Créez un rôle par défaut pour les utilisateurs non authentifiés, puis un autre rôle par défaut pour les utilisateurs authentifiés.

10.    Configurez votre domaine OpenSearch Services pour utiliser l'authentification Amazon Cognito pour les tableaux de bord OpenSearch : Pour le groupe d'utilisateurs Cognito, choisissez le groupe d'utilisateurs que vous avez créé. Pour Groupe d'identités Cognito, sélectionnez le groupe d'identités que vous avez créé. Pour plus d'informations, consultez Démarrer avec Amazon OpenSearch Services : utilisation d'Amazon Cognito pour le contrôle d'accès aux tableaux de bord OpenSearch.

11.    Configurez votre stratégie d'accès pour qu'elle soit basée sur les ressources comme suit :

{
  "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/*"
    }
  ]
}

Vous devez mettre à jour ces valeurs :
account-id : votre ID de compte AWS
identity-name : le nom de votre groupe d'identité Amazon Cognito
domain-name : le nom de votre domaine OpenSearch Services
region : région dans laquelle réside votre domaine OpenSearch Service, telle que us-east-1

Remarque : les paramètres de cet exemple s'appliquent à l'AMI Amazon Linux 2. Si vous utilisez une autre AMI, vous devrez peut-être ajuster vos paramètres spécifiques.

12.    Lancez une instance EC2 dans un sous-réseau public du même VPC de votre domaine OpenSearch Services. Assurez-vous que l'instance utilise le même groupe de sécurité que votre domaine.

13.    (Facultatif) Si vous n'utilisez pas un environnement de test, attribuez une adresse IP élastique à associer à l'instance que vous avez créée. Pour plus d'informations sur l'allocation des adresses IP élastiques, consultez Utilisation d'adresses IP élastiques.

14.    (Facultatif) Si vous n'utilisez pas un environnement de test, configurez votre serveur DNS pour résoudre des requêtes adressées à l'adresse IP élastique. Pour plus d'informations sur la manière de résoudre des requêtes avec Amazon Route 53, consultez la section Configuration d'Amazon Route 53 pour acheminer le trafic vers une instance Amazon EC2.

15.    Connectez-vous à votre instance, puis installez NGINX.

Pour les instances lancées avec une AMI Amazon Linux 2, utilisez la commande suivante :

$ sudo amazon-linux-extras install nginx1

16.    Obtenez un certificat SSL auprès d'une autorité de certification (AC) pour configurer SSL pour NGINX.

Remarque : si vous utilisez un environnement de test, générez plutôt un certificat auto-signé. Notez qu'il est recommandé d'utiliser uniquement des certificats SSL signés par une autorité de certification tierce dans votre environnement de production.

17.    (Facultatif) Si vous utilisez un environnement de test avec un certificat auto-signé, utilisez la commande OpenSSL x509 pour générer une clé privée :

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

Cette syntaxe de commande génère cert.key, une clé privée pour le certificat SSL auto-signé.

18.    Accédez au répertoire /etc/nginx/conf.d, puis créez un fichier nommé default.conf. Modifiez le fichier avec les valeurs suivantes : /etc/nginx/cert.crt : le chemin vers votre certificat SSL /etc/nginx/cert.key : le chemin vers la clé privée que vous avez générée pour le certificat SSL my_domain_host : vos services OpenSearch endpoint my_cognito_host : votre domaine de groupe d'utilisateurs Amazon Cognito (que vous avez configuré à l'étape 2)

Vous pouvez utiliser la commande sed pour attribuer $domain_endpoint et $cognito_host en tant que variables, au lieu de les remplacer directement dans le fichier default.conf. Assurez-vous également d'utiliser HTTPS, sinon vous risquez de rencontrer une erreur.

Dans cet exemple, prenez en compte les points suivants :

  • Si votre domaine Amazon OpenSearch Service exécute OpenSearch Service version 1.0 ou supérieure, utilisez le point de terminaison _dashboards.
  • Si votre domaine Amazon OpenSearch Service exécute Elasticsearch versions 5.x à 7.x, utilisez le point de terminaison _plugin/kibana.

Important : le paramètre résolveur change en fonction des paramètres de votre VPC. Le résolveur DNS se trouve à l'adresse IP de base de votre bloc d'adresse CIDR principal, plus deux. Par exemple, si vous créez un VPC avec le bloc d'adresse CIDR 10.0.0.0/24, votre résolveur DNS se trouve à l'adresse 10.0.0.2.

server {
 listen 443;
 server_name $host;
 rewrite ^/$ https://$host/_dashboards redirect;
 resolver 10.0.0.2 ipv6=off valid=5s;
 set $domain_endpoint my_domain_host;
 set $cognito_host my_cognito_host;

 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;

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

     # Handle redirects to Dashboards
     proxy_redirect https://$domain_endpoint 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|confirm) {

     # Forward requests to Cognito
     proxy_pass https://$cognito_host;

     # Handle redirects to Dashboards
     proxy_redirect https://$domain_endpoint https://$host;

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

     proxy_cookie_domain $cognito_host $host;
 }
}

19.    (Facultatif) Utilisez la commande sed pour attribuer les variables my_domain_host et my_cognito_host :

sudo sed -i 's/my_domain_host/vpc-cognito-private-xxxxxxxxxx.us-east-1.es.amazonaws.com/' /etc/nginx/conf.d/default.conf
sudo sed -i 's/my_cognito_host/dean-kumo-xxxxxxx.auth.us-east-1.amazoncognito.com/' /etc/nginx/conf.d/default.conf

Remarque : vous n'avez pas besoin de remplacer my_domain_host et my_cognito_host dans le fichier /etc/nginx/conf.d/default.conf.

20.    Utilisez cette commande pour redémarrer NGINX.

$ sudo systemctl restart nginx.service

21.    Utilisez votre navigateur pour accéder à l'adresse IP NGINX ou au nom DNS. Vous êtes redirigé vers la page de connexion à Amazon Cognito.

22.    Pour vous connecter aux tableaux de bord, saisissez votre nom d'utilisateur et votre mot de passe temporaire. Ensuite, modifiez votre mot de passe lorsque vous y êtes invité et connectez-vous à nouveau.