如何使用 NGINX 代理通过 Amazon Cognito 身份验证从 VPC 外部访问 OpenSearch Dashboards?
我的 Amazon OpenSearch Service 域位于虚拟私有云 (VPC) 中。我想使用 NGINX 代理通过 Amazon Cognito 身份验证从 VPC 外部访问 OpenSearch Dashboards。
简短描述
使用 NGINX 将 Amazon Elastic Compute Cloud (Amazon EC2) 实例配置为代理服务器。然后,该代理服务器会将浏览器请求转发到 Cognito 和 OpenSearch 控制面板。
**注意:**以下解决方法仅适用于本地 Cognito 用户。
您也可以使用 SSH 隧道或 Client VPN 通过 Cognito 身份验证从 VPC 外部访问 OpenSearch 控制面板。有关详细信息,请参阅如何通过 Amazon Cognito 身份验证从 VPC 外部访问 OpenSearch 控制面板?
解决方法
**重要事项:**当您限制对 VPC 内用户的访问时,您的 OpenSearch Service 域会更加安全。在继续操作之前,请确保此解决方法符合您组织的安全要求。
创建 Cognito 用户池和身份池
完成以下步骤:
-
创建 Cognito 用户池。配置以下设置:
对于 Application type(应用程序类型),选择 Traditional web application(传统 Web 应用程序)。
对于 Name your application(给应用程序命名),输入自定义应用程序名称或保留默认名称。
对于 Options for sign-in identifiers(登录标识符选项),选择 Username(用户名)。
对于 Required attributes for sign-up(注册的必填属性),选择 Email(电子邮件)。 -
打开 Cognito 控制台。
-
在导航窗格中,选择 User pools(用户池)。
-
选择您的用户池,然后配置以下设置:
在导航窗格中的 Branding(品牌)下,选择 Managed Login(托管登录)。
对于 Domains with managed login branding(启用了托管登录品牌的域),选择 Update version(更新版本)。
对于 Branding version(品牌版本),选择 Hosted UI (classic)(托管 UI(经典))。 -
创建 Cognito 身份池。配置以下设置:
对于 User Access(用户访问),选择 Authenticated access(经过身份验证的访问)。
对于 Authenticated identity sources(经过身份验证的身份来源),输入 Amazon Cognito 用户池。
对于 IAM role(IAM 角色),选择 Create a new IAM role(创建新的 IAM 角色),然后输入角色名称。
对于 User pool details(用户池详细信息),选择您的用户池 ID,然后选择 App client ID(应用程序客户端 ID)。
对于 Role settings(角色设置),选择 Use default authenticated role(使用经过身份验证的默认角色)。
对于 Claim mapping(声明映射),选择 Inactive(非活动)。 -
配置您的 OpenSearch Service 域以使用 Cognito 身份验证。配置以下设置:
对于 Cognito User Pool(Cognito 用户池),选择您的用户池。
对于 Cognito Identity Pool(Cognito 身份池),选择您的身份池。 -
对于 Domain(域)访问策略,输入以下访问策略:
{ "Version": "2012-10-17", "Statement": \[ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-id:role/service-role/identitypool-role" }, "Action": "es:\*", "Resource": "arn:aws:es:region:account-id:domain/domain-name/\*" } \] }**注意:**请将 account-id 替换为您的 AWS 账户 ID,将 identitypool-role 替换为您的身份池角色的名称。请将 domain-name 替换为您的 OpenSearch Service 域,将 region 替换为您的域的 AWS 区域。
配置 NGINX 代理
**注意:**以下设置适用于 Amazon Linux 2023 上的亚马逊机器映像 (AMI)。如果您使用其他 AMI,则可能需要调整设置。
完成以下步骤:
-
在您的 OpenSearch Service 域所在的 VPC 的公有子网中启动 EC2 实例。该实例必须使用与您的域相同的安全组。
-
(可选)如果您不使用测试环境,请分配一个弹性 IP 地址,以便与您的 EC2 实例相关联。
-
(可选)如果您不使用测试环境,请配置您的 DNS,以便将请求解析到弹性 IP 地址。有关如何使用 Amazon Route 53 解析请求的详细信息,请参阅配置 Amazon Route 53 以将流量路由到 Amazon EC2 实例。
-
运行以下命令以连接到您的实例并安装 NGINX:
sudo yum updatesudo yum install nginx -y -
从证书颁发机构 (CA) 获取 SSL 证书。
**注意:**如果您使用测试环境,请改为生成自签名证书。在您的生产环境中,最佳做法是使用第三方 CA 签署的 SSL 证书。 -
(可选)如果您使用带有自签名证书的测试环境,请运行 OpenSSL x509 命令以生成私钥:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt有关详细信息,请参阅 OpenSSL 网站上的 x509。
**注意:**上述命令生成的 cert.key 是自签名 SSL 证书的私钥。 -
导航到 /etc/nginx/conf.d 目录,然后创建一个名为 default.conf 的文件。
-
使用以下值修改 default.conf 文件:
对于 /etc/nginx/cert.crt,输入 SSL 证书的路径。
对于 /etc/nginx/cert.key,输入为 SSL 证书生成的私钥的路径。
对于 my_domain_host,输入您的 OpenSearch Service 端点。
对于 my_cognito_host,输入您的 Cognito 用户池域。
**重要事项:**必须使用 HTTPS。
如果您的 Amazon OpenSearch Service 域运行 OpenSearch Service 版本 1.0 或更高版本,请使用 _dashboards 端点。
如果您的 Amazon OpenSearch Service 域运行 Elasticsearch 版本 5.x-7.x,请使用 _plugin/kibana 端点。**注意:**resolver 的值会根据您的 VPC 设置而变化。在主 CIDR 块的基础 IP 地址加 2 位置处使用 DNS 解析器。例如,如果您创建的 VPC 的 CIDR 块为 10.0.0.0/24,则您的 DNS 解析器将位于 10.0.0.2。
default.conf 文件示例:
server { listen 443 ssl; 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; } } -
(可选)要将 my_domain_host 和 my_cognito_host 指定为变量,请运行 sed 命令:
sudo sed -i 's/my_domain_host/vpc-cognito-private-xxxxxxxxxx.us-east-1.es.amazonaws.com/' /etc/nginx/conf.d/default.confsudo sed -i 's/my_cognito_host/domain-xxxxxxx.auth.us-east-1.amazoncognito.com/' /etc/nginx/conf.d/default.conf**注意:**如果您运行上述命令,则无需在 /etc/nginx/conf.d/default.conf 文件中替换 my_domain_host 和 my_cognito_host。
-
运行以下命令以激活并启动 NGINX:
sudo systemctl enable nginx && sudo systemctl start nginx
访问 OpenSearch 控制面板
完成以下步骤:
- 使用您的浏览器打开 NGINX IP 地址或 DNS 名称,这会将您重定向到 Cognito 登录页面。
- 输入您的用户名和临时密码以登录 OpenSearch 控制面板。
- 出现提示时,更改密码并重新登录。
- 语言
- 中文 (简体)

