跳至内容

如何使用 NGINX 代理通过 Amazon Cognito 身份验证从 VPC 外部访问 OpenSearch Dashboards?

3 分钟阅读
0

我的 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 用户池和身份池

完成以下步骤:

  1. 创建 Cognito 用户池。配置以下设置:
    对于 Application type(应用程序类型),选择 Traditional web application(传统 Web 应用程序)。
    对于 Name your application(给应用程序命名),输入自定义应用程序名称或保留默认名称。
    对于 Options for sign-in identifiers(登录标识符选项),选择 Username(用户名)。
    对于 Required attributes for sign-up(注册的必填属性),选择 Email(电子邮件)。

  2. 打开 Cognito 控制台

  3. 在导航窗格中,选择 User pools(用户池)。

  4. 选择您的用户池,然后配置以下设置:
    在导航窗格中的 Branding(品牌)下,选择 Managed Login(托管登录)。
    对于 Domains with managed login branding(启用了托管登录品牌的域),选择 Update version(更新版本)。
    对于 Branding version(品牌版本),选择 Hosted UI (classic)(托管 UI(经典))。

  5. 配置您的用户和组

  6. 创建 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(非活动)。

  7. 配置您的 OpenSearch Service 域以使用 Cognito 身份验证。配置以下设置:
    对于 Cognito User Pool(Cognito 用户池),选择您的用户池。
    对于 Cognito Identity Pool(Cognito 身份池),选择您的身份池。

  8. 对于 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,则可能需要调整设置。

完成以下步骤:

  1. 在您的 OpenSearch Service 域所在的 VPC 的公有子网中启动 EC2 实例。该实例必须使用与您的域相同的安全组。

  2. (可选)如果您不使用测试环境,请分配一个弹性 IP 地址,以便与您的 EC2 实例相关联

  3. (可选)如果您不使用测试环境,请配置您的 DNS,以便将请求解析到弹性 IP 地址。有关如何使用 Amazon Route 53 解析请求的详细信息,请参阅配置 Amazon Route 53 以将流量路由到 Amazon EC2 实例

  4. 运行以下命令以连接到您的实例并安装 NGINX:

    sudo yum updatesudo yum install nginx -y
  5. 从证书颁发机构 (CA) 获取 SSL 证书。
    **注意:**如果您使用测试环境,请改为生成自签名证书。在您的生产环境中,最佳做法是使用第三方 CA 签署的 SSL 证书。

  6. (可选)如果您使用带有自签名证书的测试环境,请运行 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 证书的私钥。

  7. 导航到 /etc/nginx/conf.d 目录,然后创建一个名为 default.conf 的文件。

  8. 使用以下值修改 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;
      }
    }
  9. (可选)要将 my_domain_hostmy_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_hostmy_cognito_host

  10. 运行以下命令以激活并启动 NGINX:

sudo systemctl enable nginx && sudo systemctl start nginx

访问 OpenSearch 控制面板

完成以下步骤:

  1. 使用您的浏览器打开 NGINX IP 地址或 DNS 名称,这会将您重定向到 Cognito 登录页面。
  2. 输入您的用户名和临时密码以登录 OpenSearch 控制面板。
  3. 出现提示时,更改密码并重新登录。
AWS 官方已更新 10 个月前