Wie kann ich mithilfe eines NGINX-Proxys außerhalb einer VPC, die Amazon-Cognito-Authentifizierung verwendet, auf OpenSearch Dashboards zugreifen?

Letzte Aktualisierung: 26.10.2021

Mein Amazon-OpenSearch-Service-Cluster (Nachfolger von Amazon Elasticsearch Service) 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.

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 einen SSH-Tunnel verwenden, um von außerhalb einer VPC mit Amazon Cognito-Authentifizierung auf OpenSearch Dashboards zuzugreifen“. Weitere Informationen finden Sie unter Wie kann ich einen SSH-Tunnel verwenden, um von außerhalb einer VPC mit Amazon-Cognito-Authentifizierung auf OpenSearch Dashboards zuzugreifen?

Hinweis: OpenSearch Dashboards ist der Nachfolger von Kibana.

Auflösung

Wichtig: Ihre OpenSearch-Services-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 die andere für authentifizierte Benutzer.

10.    Konfigurieren Sie Ihre OpenSearch-Services-Domäne zur Verwendung der Amazon-Cognito-Authentifizierung für OpenSearch Dashboards:
Wählen Sie unter Cognito-Benutzerpool den von Ihnen erstellten Benutzerpool aus.
Wählen Sie unter Cognito-Identitätspools den von Ihnen erstellten Identitätspool aus.
Weitere Informationen finden Sie unter Erste Schritte mit Amazon 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
ES-name: der Name Ihrer OpenSearch-Services-Domäne
region: die Region, in der sich Ihre OpenSearch-Service-Domäne befindet, z. B.us-east-1

12.    Starten Sie eine EC2-Instance in einem öffentlichen Subnetz derselben VPC Ihrer OpenSearch Services-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 Amazon Route 53, um den Datenverkehr an eine Amazon-EC2-Instance weiterzuleiten.

15.    Verbinden Sie sich mit Ihrer Instance und installieren Sie 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. Selbstsignierte Zertifikate werden von Browsern nicht als vertrauenswürdig eingestuft und sollten in Produktionsumgebungen nicht verwendet werden.

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 generiert haben
$domain-endpoint: der OpenSearch-Services-Endpunkt
$cognito_host: Ihre Amazon-Cognito-Benutzerpool-Domäne (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 den Endpunkt _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;
    }
}

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.

19.    (Optional) Verwenden Sie den Befehl sed, um die Variablen $domain-endpoint und $cognito_host zuzuweisen:

$ 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

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

20.    Starten Sie NGINX neu.

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

$ sudo service nginx restart

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

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