Comment utiliser un proxy NGINX pour accéder à Kibana depuis l'extérieur d'un VPC à l'aide de l'authentification Amazon Cognito ?

Date de la dernière mise à jour : 26/05/2020

Mon cluster Amazon Elasticsearch Service (Amazon ES) se trouve dans un Virtual Private Cloud (VPC). Je souhaite utiliser un proxy NGINX pour accéder à Kibana depuis l'extérieur d'un VPC à l'aide de l'authentification Amazon Cognito.

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 du navigateur à Amazon Cognito et à Kibana.

Remarque : vous pouvez également utiliser un tunnel SSH ou VPN Client pour accéder à Kibana depuis l'extérieur d'un VPC à l'aide de l'authentification Amazon Cognito. Pour plus d'informations, consultez la section Comment accéder à Kibana depuis l'extérieur d'un VPC à l'aide de l'authentification Amazon Cognito ?

Solution

Important : votre domaine Amazon ES 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 la 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 Amazon ES de manière à utiliser l'authentification Amazon Cognito pour Kibana.

Pour Groupe d'utilisateurs Cognito, sélectionnez le groupe d'utilisateurs que vous avez créé.

Pour Groupe d'utilisateurs Cognito, sélectionnez le groupe d'identités que vous avez créé.

11.    Configurez votre stratégie d'accès afin qu'il s'agisse d'une stratégie 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:account-id:domain/ES-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 Amazon ES

region : la région dans laquelle se trouve votre domaine Amazon ES, par exemple us-east-1.

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

13.    (Facultatif) Si vous n'utilisez pas un environnement de test, attribuez une adresse IP Elastic et associez-la à l'instance que vous avez créée à l'étape précédente. Pour plus d'informations sur l'allocation d'une adresse IP Elastic, consultez Utilisation des adresses IP Elastic.

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 Elastic. 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 à l'instance et installez NGINX.

Pour les instances lancées avec une Amazon Machine Image (AMI) Amazon Linux, utilisez la commande suivante :

$ sudo yum install nginx

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

$ sudo amazon-linux-extras install nginx1.12

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 générée pour le certificat SSL

$ES_endpoint : votre point de terminaison Amazon ES. Pour plus d'informations, consultez la section Configuration des fournisseurs d'identités.

$cognito_host : le domaine du groupe d'utilisateurs Amazon Cognito que vous avez configuré à l'étape 2

server {
    listen 443;
    server_name $host;
    rewrite ^/$ https://$host/_plugin/kibana 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 ^~ /_plugin/kibana {
        # Forward requests to Kibana
        proxy_pass https://$ES_endpoint/_plugin/kibana;
 
        # Handle redirects to Amazon Cognito
        proxy_redirect https://$cognito_host https://$host;
 
        # Update cookie domain and path
        proxy_cookie_domain $ES_endpoint $host;
 
        proxy_set_header Accept-Encoding "";
        sub_filter_types *;
        sub_filter $ES_endpoint $host;
        sub_filter_once off;
 
        # Response buffer settings
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
    }
 
    location ~ \/(log|sign|error|fav|forgot|change|confirm) {
        # Forward requests to Cognito
        proxy_pass https://$cognito_host;
 
        # Handle redirects to Kibana
        proxy_redirect https://$ES_endpoint https://$host;
 
        # Handle redirects to Amazon Cognito
        proxy_redirect https://$cognito_host https://$host;
 
        # Update cookie domain
        proxy_cookie_domain $cognito_host $host;
    }
}

Remarque : vous pouvez utiliser la commande sed pour attribuer $ES_endpoint et $cognito_host en tant que variables, au lieu de les remplacer directement dans le fichier default.conf.

Par exemple, le fichier de configuration suivant utilise les valeurs ci-dessous :

Point de terminaison Amazon ES : vpc-mykibana-111xxx.us-east1.es.amazonaws.com

Hôte Amazon Cognito : mydomain.auth.us-east-1.amazoncognito.com

server {
    listen 443;
    server_name $host;
    rewrite ^/$ https://$host/_plugin/kibana 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 ^~ /_plugin/kibana {
        # Forward requests to Kibana
        proxy_pass https://vpc-mykibana-111xxx.us-east1.es.amazonaws.com/_plugin/kibana;
 
        # Handle redirects to Amazon Cognito
        proxy_redirect https://mydomain.auth.us-east-1.amazoncognito.com https://$host;
 
        # Update cookie domain and path
        proxy_cookie_domain vpc-mykibana-111xxx.us-east1.es.amazonaws.com $host;
 
        proxy_set_header Accept-Encoding "";
        sub_filter_types *;
        sub_filter vpc-mykibana-111xxx.us-east1.es.amazonaws.com $host;
        sub_filter_once off;
 
        # Response buffer settings
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
    }
 
    location ~ \/(log|sign|error|fav|forgot|change|confirm) {
        # Forward requests to Cognito
        proxy_pass https://mydomain.auth.us-east-1.amazoncognito.com;
 
        # Handle redirects to Kibana
        proxy_redirect https://vpc-mykibana-111xxx.us-east1.es.amazonaws.com https://$host;
 
        # Handle redirects to Amazon Cognito
        proxy_redirect https://mydomain.auth.us-east-1.amazoncognito.com https://$host;
 
        # Update cookie domain
        proxy_cookie_domain mydomain.auth.us-east-1.amazoncognito.com $host;
    }
}

19.    (Facultatif) Utilisez la commande sed pour attribuer les variables $ES_endpoint et $cognito_host :

$ sudo sed -i 's/$ES_endpoint/vpc-mykibana-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 à remplacer $ES_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 à Kibana, 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.