Wie verwende ich einen NGINX-Proxy für den Zugriff auf OpenSearch Dashboards von außerhalb einer VPC, die Amazon Cognito-Authentifizierung verwendet?

Letzte Aktualisierung: 16.09.2022

Mein Amazon-OpenSearch-Service-Cluster befindet sich in einer Virtual Private Cloud (VPC). Ich möchte einen NGINX-Proxy für den Zugriff auf OpenSearch Dashboards von außerhalb der VPC mit Amazon Cognito-Authentifizierung verwenden. Wie kann ich vorgehen?

Kurzbeschreibung

Verwenden Sie NGINX, um eine Amazon-Elastic-Compute-Cloud-(Amazon EC2)-Instance als Proxy-Server zu konfigurieren. Der Proxy-Server leitet dann Browseranfragen an Amazon Cognito und OpenSearch Dashboards weiter.

Hinweis: Diese Lösung funktioniert nur für native Amazon Cognito-Benutzer.

Sie können auch einen SSH-Tunnel oder ein Client VPN verwenden, um von außerhalb einer VPC mit Amazon-Cognito-Authentifizierung auf OpenSearch Dashboards zuzugreifen. Weitere Informationen finden Sie unter Wie kann ich mithilfe der Amazon-Cognito-Authentifizierung von außerhalb einer VPC auf OpenSearch Dashboards zugreifen?

Lösung

Wichtig: Ihre OpenSearch-Service-Domäne ist sicherer, wenn Sie den Zugriff auf Benutzer in der VPC beschränken. Bevor Sie fortfahren, stellen Sie sicher, dass dieses Verfahren nicht gegen die Sicherheitsanforderungen Ihres Unternehmens verstößt.

1.    Erstellen Sie einen Amazon-Cognito-Benutzerpool.

2.    Konfigurieren Sie eine gehostete Benutzerpool-Domäne.

3.    Wählen Sie im Navigationsbereich der Amazon-Cognito-Konsole Benutzer und Gruppen aus.

4.    Wählen Sie Benutzer erstellen und füllen Sie dann die Felder aus. Geben Sie unbedingt eine E-Mail-Adresse ein und aktivieren Sie das Kontrollkästchen E-Mail als bestätigt markieren.

5.    Wählen Sie die Registerkarte Gruppen und dann Gruppe erstellen. Geben Sie für Priorität 0 ein. Weitere Informationen finden Sie unter Erstellen einer neuen Gruppe in der AWS-Managementkonsole.

6.    Öffnen Sie die Amazon-Cognito-Konsole erneut.

7.    Wählen Sie Identitätspools verwalten und dann Neuen Identitätspool erstellen.

8.    Geben Sie einen Namen für Ihren Identitätspool ein, aktivieren Sie das Kontrollkästchen Zugriff auf nicht authentifizierte Identitäten aktivieren und wählen Sie dann Pool erstellen.

9.    Wenn Sie aufgefordert werden, auf Ihre AWS-Ressourcen zuzugreifen, wählen Sie Zulassen aus, um die beiden Standardrollen zu erstellen, die Ihrem Identitätspool zugeordnet sind. Erstellen Sie eine Standardrolle für nicht authentifizierte Benutzer und dann die andere für authentifizierte Benutzer.

10.    Konfigurieren Sie Ihre OpenSearch-Service-Domäne für die Verwendung der Amazon-Cognito-Authentifizierung für OpenSearch Dashboards: Wählen Sie für den Cognito-Benutzerpool den Benutzerpool aus, den Sie erstellt haben. Wählen Sie unter Cognito-Identitätspools den von Ihnen erstellten Identitätspool aus. Weitere Informationen finden Sie unter Erste Schritte mit OpenSearch Service: Verwenden von Amazon Cognito für die Zugriffskontrolle von OpenSearch Dashboards.

11.    Konfigurieren Sie Ihre Zugriffsrichtlinie so, dass sie eine ressourcenbasierte Richtlinie wie die folgende ist:

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

Diese Werte müssen Sie aktualisieren:
account-id: Ihre AWS-Konto-ID
identity-name: der Name des Amazon-Cognito-Identitätspools
Domainname: der Name Ihrer OpenSearch-Service-Domäne
region: die Region, in der sich Ihre OpenSearch-Service-Domäne befindet, z. B. us-east-1

Hinweis: Die Einstellungen in diesem Beispiel gelten für Amazon Linux 2 AMI. Wenn Sie ein anderes AMI verwenden, müssen Sie möglicherweise Ihre spezifischen Einstellungen anpassen.

12.    Starten Sie eine EC2-Instance in einem öffentlichen Subnetz derselben VPC Ihrer OpenSearch-Service-Domäne. Stellen Sie sicher, dass die Instance dieselbe Sicherheitsgruppe wie Ihre Domäne verwendet.

13.    (Optional) Wenn Sie keine Testumgebung verwenden, weisen Sie eine elastische IP-Adresse zu, die Sie mit der von Ihnen erstellten Instance verknüpfen können. Weitere Informationen zum Zuweisen von elastischen IP-Adressen finden Sie unter Arbeiten mit elastischen IP-Adressen.

14.    (Optional) Wenn Sie keine Testumgebung verwenden, konfigurieren Sie das DNS so, dass es Anfragen an die elastische IP-Adresse auflöst. Weitere Informationen zum Beheben von Anfragen mit Amazon Route 53 finden Sie unter Konfigurieren von Route 53, um den Datenverkehr an eine EC2-Instance weiterzuleiten.

15.    Verbinden Sie sich mit Ihrer Instance und installieren Sie dann NGINX.

Verwenden Sie den folgenden Befehl für Instances, die mit einem Amazon Linux 2 AMI gestartet wurden:

$ sudo amazon-linux-extras install nginx1

16.    Besorgen Sie sich ein SSL-Zertifikat von einer Zertifizierungsstelle (CA), um für NGINX SSL zu konfigurieren.

Hinweis: Wenn Sie eine Testumgebung verwenden, generieren Sie stattdessen ein selbstsigniertes Zertifikat. Beachten Sie, dass es eine bewährte Methode ist, in Ihrer Produktionsumgebung nur SSL-Zertifikate zu verwenden, die von einer Drittanbieter-Zertifizierungsstelle signiert wurden.

17.    (Optional) Wenn Sie eine Testumgebung mit einem selbstsignierten Zertifikat verwenden, verwenden Sie den Befehl OpenSSL x509, um einen privaten Schlüssel zu generieren:

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

Diese Befehlssyntax generiert cert.key, einen privaten Schlüssel für das selbstsignierte SSL-Zertifikat.

18.    Navigieren Sie zum Verzeichnis /etc/nginx/conf.d und erstellen Sie dann eine Datei mit dem Namen default.conf. Ändern Sie die Datei mit den folgenden Werten: /etc/nginx/cert.crt: der Pfad zu Ihrem SSL-Zertifikat /etc/nginx/cert.key: der Pfad zum privaten Schlüssel, den Sie für das SSL-Zertifikat my_domain_host generiert haben: Ihre OpenSearch-Service-Endpunkt my_cognito_host: Ihre Amazon Cognito-Benutzerpool-Domain (die Sie in Schritt 2 konfiguriert haben).

Sie können den Befehl sed verwenden, um $domain-endpoint und $cognito_host als Variablen zuzuweisen, anstatt sie direkt in der Datei default.conf zu ersetzen. Stellen Sie außerdem sicher, dass Sie HTTPS verwenden, da sonst ein Fehler auftritt.

In diesem Beispiel sollten Sie Folgendes beachten:

  • Wenn Ihre Amazon OpenSearch Service-Domäne die OpenSearch Service-Version 1.0+ ausführt, sollten Sie den Endpunkt _dashboards verwenden.
  • Wenn Ihre Amazon OpenSearch Service-Domäne die Elasticsearch-Versionen 5.x-7.x ausführt, verwenden Sie dann den Endpunkt _plugin/kibana.

Wichtig: Der Resolver-Parameter ändert sich je nach Ihren VPC-Einstellungen. Der DNS-Resolver befindet sich an der Basis-IP Ihres primären CIDR-Blocks plus zwei. Wenn Sie beispielsweise eine VPC mit CIDR-Block 10.0.0.0/24 erstellen, dann befindet sich Ihr DNS-Resolver bei 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.    (Optional) Verwenden Sie den Befehl sed, um die Variablen $domain-endpoint und $cognito_host zuzuweisen:

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

Hinweis: Sie müssen $domain-endpoint und $cognito_host nicht in der Datei /etc/nginx/conf.d/default.conf ersetzen.

20.    Verwenden Sie diesen Befehl, um NGINX neu zu starten.

$ sudo systemctl restart nginx.service

21.    Verwenden Sie Ihren Browser, um auf die NGINX-IP oder den DNS-Namen zuzugreifen. Sie werden zur Anmeldeseite von Amazon Cognito weitergeleitet.

22.    Um sich bei Dashboards anzumelden, geben Sie Ihren Benutzernamen und Ihr temporäres Passwort ein. Ändern Sie dann Ihr Passwort, wenn Sie dazu aufgefordert werden, und melden Sie sich erneut an.