在不绕过 AWS Cognito 的情况下反向代理到 VPC-Based AWS Elasticsearch 域

Reverse Proxy to VPC-Based AWS Elasticsearch Domain Without Bypassing AWS Cognito

我提前道歉 - 我对 Nginx 非常陌生。

我有两个 VPC-based AWS Elasticsearch 域,我们称之为 dev 和 prod。我希望开放的互联网无法访问这两个域,但在 VPC 之外的某些网络中可用。为此,我将它们设置为 VPC-based 个 Elasticsearch 域,并计划使用只能从我希望的网络访问的反向代理。我已经使用具有以下配置的 NGINX 反向代理设置了没有身份验证的开发集群:

events{

}

http{
  server {
    listen       80;
    server_name kibana-dev.[domain name];

    location / {

      proxy_http_version 1.1;
      proxy_set_header Connection "Keep-Alive";
      proxy_set_header Proxy-Connection "Keep-Alive";

      proxy_pass https://[vpc id].[vpc region].es.amazonaws.com/_plugin/kibana/;
      proxy_redirect https://[vpc id].[vpc region].es.amazonaws.com/_plugin/kibana/ https://kibana-dev.[domain name]/;
    }

      location ~ (/app/kibana|/app/timelion|/bundles|/es_admin|/plugins|/api|/ui|/elasticsearch|/app/opendistro-alerting) {
         proxy_pass          https://[vpc id].[vpc region].es.amazonaws.com;
         proxy_set_header    Host $host;
         proxy_set_header    X-Real-IP $remote_addr;
         proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header    X-Forwarded-Proto $scheme;
         proxy_set_header    X-Forwarded-Host $http_host;
    }

  }
}

这很好用。

但是,对于产品域,我 运行 遇到了问题。我希望所有用户,甚至是那些使用代理的用户,都必须使用 AWS Cognito 进行身份验证(例如,我不只是想为代理的 IP 地址创建一个带有 IP 例外的访问策略,因为这会绕过 Cognito ).

我为我的 "prod" Elasticsearch 实例使用了类似的 NGINX 配置,但没有成功。 Cognito 登录页面在身份验证后重定向到 VPC-based URL。我尝试手动将代理的 URL 添加到 Cognito 应用程序的回调 URL,但默认情况下它仍然重定向到 VPC-based URL。我还尝试手动更改 Cognito URL 中的重定向 URI 以引用我的代理,但我发现在验证后我再次被重定向到 Cognito 登录页面 - 可能是 header或者有什么事情没有通过?

我如何(或能够)在 Nginx 中获得此 运行,以便用户可以访问 "prod" Elasticsearch 域,同时仍然需要使用 AWS Cognito 进行身份验证?

谢谢!

呸!我应该更仔细地阅读文档。 AWS 为具有 Cognito 的 Kibana 代理提供 an example Nginx conf file

{
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://$kibana_host/_plugin/kibana;

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

        # Update cookie domain and path
        proxy_cookie_domain $kibana_host $host;
        proxy_cookie_path / /_plugin/kibana/;

        # 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 Kibana
        proxy_redirect https://$kibana_host https://$host;

        # Update cookie domain
        proxy_cookie_domain $cognito_host $host;
    }
}