在不绕过 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;
}
}
我提前道歉 - 我对 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;
}
}