如何使用 NGINX 代理從藉助 Amazon Cognito 身分驗證的 VPC 外部存取 OpenSearch Dashboards?

3 分的閱讀內容
0

我的 Amazon OpenSearch Service 叢集是在虛擬私有雲端 (VPC) 中。我想要使用 NGINX 代理從 VPC 外部藉助 Amazon Cognito 身分驗證存取 OpenSearch Dashboards。該如何進行?

簡短描述

使用 NGINX 設定 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體作為代理伺服器。接著代理伺服器會將瀏覽器請求轉發至 Amazon Cognito 和 OpenSearch Dashboards。

注意 :此解決方案僅適用於原生 Amazon Cognito 使用者。

您也可以使用 SSH 通道或 Client VPN 從 VPC 外部藉助 Amazon Cognito 身分驗證存取 OpenSearch Dashboards。如需詳細資訊,請參閱如何使用 Amazon Cognito 身分驗證從 VPC 外部存取 OpenSearch Dashboards?

解決方案

重要事項:限制 VPC 中的使用者存取權後,您的 OpenSearch Service 網域會更安全。在繼續之前,請確定此程序未違反組織的安全性需求。

1.    建立 Amazon Cognito 使用者集區

2.    設定託管使用者集區網域

3.    在 Amazon Cognito 主控台導覽窗格中,選擇 Users and groups (使用者和群組)。

4.    選擇Create user (建立使用者),然後填寫欄位。請務必輸入電子郵件地址,並選取 Mark email as verified (將電子郵件標示為已驗證)的 核取方塊。

5.    選擇 Groups (群組) 標籤,然後選擇 Create group (建立群組)。在 Precedence (優先順序) 中,輸入 0。如需詳細資訊,請參閱在 AWS 管理主控台中建立新群組

6.    再次開啟 Amazon Cognito 主控台

7.    選擇 Manage Identity Pools (管理身分集區),然後選擇 Create new identity pool (建立新的身分集區)。

8.    輸入身分集區的名稱,選取 Enable access to unauthenticated identities (啟用存取未驗證的身分) 核取方塊,然後選擇 Create Pool (建立集區)。

9.    當系統提示您存取 AWS 資源時,請選擇 Allow (允許) 以建立與您的身分集區相關聯的兩個預設角色。為未驗證使用者建立一個預設角色,然後為已驗證的使用者建立另一個預設角色。

10.    設定 OpenSearch Service 網域以將 Amazon Cognito 驗證用於 OpenSearch Dashboards:對於 Cognito User Pool (Cognito 使用者集區),請選擇您建立的使用者集區。對於 Cognito Identity Pool (Cognito 身分集區),請選擇您建立的身分集區。如需詳細資訊,請參閱開始使用 OpenSearch Service:在 OpenSearch Dashboards 存取控制上使用 Amazon Cognito。

11.    設定您的存取政策,使其成為以資源為基礎的政策,如下所示:

{
     "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/*"
     }]
}

您必須更新這些值:
account-id您的 AWS 帳戶 ID
identity-name:您的 Amazon Cognito 身分集區的名稱
domain-name:您的 OpenSearch Service 網域的名稱
region:您的 OpenSearch Service 網域所在的「區域」,例如 us-east-1

注意:此範例中的設定適用於 Amazon Linux 2 AMI。如果您是使用不同的 AMI,則可能需要調整特定設定。

12.    將 EC2 執行個體啟動到您的 OpenSearch Service 網域中相同 VPC 的公有子網路。請確定執行個體使用與您的網域相同的安全群組。

13.    (選擇性) 如果您未使用測試環境,請配置彈性 IP 地址,以與您建立的執行個體建立關聯。如需配置彈性 IP 地址的詳細資訊,請參閱使用彈性 IP 地址

14.    (選擇性) 如果您未使用測試環境,請設定 DNS 以將請求解析為彈性 IP 地址。如需有關如何使用 Amazon Route 53 解析請求的詳細資訊,請參閱設定 Route 53 以將流量路由傳送到 EC2 執行個體

15.    連接到您的執行個體,然後安裝 NGINX。

對於使用 Amazon Linux 2 AMI 啟動的執行個體,請使用下列命令:

$ sudo amazon-linux-extras install nginx1

16.    從憑證授權單位 (CA) 取得 SSL 憑證,以設定 NGINX 的 SSL。

**注意:**如果您使用測試環境,請改為產生自我簽署憑證。請注意,在生產環境中最好只使用由第三方憑證授權單位簽署的 SSL 憑證。

17.    (選擇性) 如果您使用具有自我簽署憑證的測試環境,請使用 OpenSSL x509 命令以產生私有金鑰:

$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt

此命令語法會產生 cert.key,這是自我簽署 SSL 憑證的私有金鑰。

18.    導覽至 /etc/nginx/conf.d 目錄,然後建立名稱為 default.conf 的檔案。使用下列值修改檔案:/etc/nginx/cert.crt:您的 SSL 憑證的路徑 /etc/nginx/cert.key:您為 SSL 憑證產生之私有金鑰的路徑 my_domain_host:您的 OpenSearch Service 端點 my_cognito_host:您的 Amazon Cognito 使用者集區網域 (步驟 2 中所設定)。

您可以使用 sed 命令將 my_cognito_hostmy_domain_host 指派為變數,而不是直接在 default.conf 檔案中替換它們。此外,請務必使用 HTTPS,否則您可能會遇到錯誤。

在此範例中,請注意下列事項:

  • 如果您的 Amazon OpenSearch Service 網域正在執行 OpenSearch Service 1.0 以上版本,則應使用 _dashboards 端點。
  • 如果您的 Amazon OpenSearch Service 網域正在執行 Elasticsearch 5.x 至 7.x 版,則應使用 _plugin/kibana 端點。

**重要:**解析程式 參數會根據您的 VPC 設定而變更。DNS 解析程式位於您主要 CIDR 區塊的基礎 IP 加二。例如,如果您建立具有 CIDR 區塊 10.0.0.0/24 的 VPC,則您的 DNS 解析程式位於 10.0.0.2。

server {
  listen 443;
  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;
  }
}

19.    (選擇性) 使用 sed 命令來指派 my_domain_hostmy_cognito_host 變數:

sudo sed -i 's/my_domain_host/vpc-cognito-private-xxxxxxxxxx.us-east-1.es.amazonaws.com/' /etc/nginx/conf.d/default.conf
sudo sed -i 's/my_cognito_host/dean-kumo-xxxxxxx.auth.us-east-1.amazoncognito.com/' /etc/nginx/conf.d/default.conf

**注意:**您不需要在 /etc/nginx/conf.d/default.conf 檔案中替換 my_domain_hostmy_cognito_host

20.    使用此命令重新啟動 NGINX。

$ sudo systemctl restart nginx.service

21.    使用您的瀏覽器存取 NGINX IP 或 DNS 名稱。系統會將您重新導向到 Amazon Cognito 登入頁面。

22.    若要登入 Dashboards,請輸入您的使用者名稱和臨時密碼。接著,在出現提示時變更您的密碼,然後再次登入。


相關資訊

使用代理從 Dashboards 存取 OpenSearch Service

如何使用 OpenSearch Dashboards 對 Amazon Cognito 身分驗證問題進行疑難排解?

我在嘗試存取 Amazon OpenSearch Service 叢集時收到「使用者:匿名未經授權」的錯誤訊息

AWS 官方
AWS 官方已更新 2 年前