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 : 21/10/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 du 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 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 Amazon ES pour qu'il utilise l'authentification Amazon Cognito pour Kibana.
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 Get started with Amazon Elasticsearch Service: Use Amazon Cognito for Kibana access control.

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: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 à associer à l'instance que vous avez créée. Pour plus d'informations sur l'allocation d'une adresse IP Elastic, consultez Utilisation d'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 Configuration des fournisseurs d'identité.
$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 $ES_endpoint et $cognito_host en tant que variables, au lieu de les remplacer directement dans le fichier default.conf. Veillez également à utiliser HTTPS, ou vous risquez de rencontrer une erreur.

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.

resolver 10.0.0.2 ipv6=off;

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;

    set $es_endpoint $ES_endpoint;
    set $cognito_endpoint $cognito_host;

    location ^~ /_plugin/kibana {
        # Forward requests to Kibana
        proxy_pass https://$es_endpoint;

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

        # Update cookie domain and path
        proxy_cookie_domain $es_endpoint $host;

        # 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_endpoint;

        # Handle redirects to Kibana
        proxy_redirect https://$es_endpoint https://$host;

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

        # Update cookie domain
        proxy_cookie_domain $cognito_endpoint $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 besoin de 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.