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

Dernière mise à jour : 26/10/2021

Mon cluster Amazon OpenSearch Service (successeur d'Amazon Elasticsearch Service) se trouve dans un Virtual Private Cloud (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.

Vous pouvez également utiliser un tunnel SSH ou un VPN client pour accéder à OpenSearch Dashboards depuis l'extérieur d'un VPC utilisant l'authentification Amazon Cognito. Pour plus d'informations, consultez « Comment puis-je utiliser un tunnel SSH pour accéder à OpenSearch Dashboards depuis l'extérieur d'un VPC utilisant l'authentification Amazon Cognito ». Pour plus d'informations, veuillez consulter Comment puis-je utiliser un tunnel SSH pour 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 Autoriser pour créer les deux rôles par défaut associés à votre groupe d'identités. Créez un rôle par défaut pour les utilisateurs non authentifiés et créez l'autre rôle par défaut pour les utilisateurs authentifiés.

10.    Configurez votre domaine OpenSearch Services pour qu'il utilise l'authentification Amazon Cognito pour OpenSearch Dashboards :
Pour Groupe d'utilisateurs Cognito, sélectionnez 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és Amazon Cognito
ES-name : le nom de votre domaine OpenSearch Services
region : région dans laquelle réside votre domaine OpenSearch Service, telle que us-east-1

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 et 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 un certificat auto-signé. Les navigateurs ne font pas confiance aux certificats auto-signés, qui ne doivent pas être utilisés dans des environnements 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 d'accès à votre certificat SSL
/etc/nginx/cert.key : le chemin d'accès à la clé privée que vous avez générée pour le certificat SSL
$domain-endpoint : votre point de terminaison de services OpenSearch
$cognito_host : le domaine du 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. Veillez également à 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.
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;
    }
}

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.

19.    (Facultatif) Utilisez la commande sed pour attribuer les variables $domain_endpoint et $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

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

20.    Redémarrez NGINX.

Pour les instances lancées avec une AMI Amazon Linux, utilisez cette commande :

$ sudo service nginx restart

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

$ 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.