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

上次更新日期:2021 年 10 月 26 日

我的 Amazon OpenSearch Service (Amazon Elasticsearch Service 的後繼者) 叢集是在 Virtual Private Cloud (VPC) 中。我想要使用 NGINX 代理從 VPC 外部藉助 Amazon Cognito 身分驗證存取 OpenSearch Dashboards。該如何進行?

簡短描述

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

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

注意:OpenSearch Dashboards 是 Kibana 的繼任者。

解決方案

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

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 Services 網域,以使用適用於 OpenSearch Dashboards 的 Amazon Cognito 身分驗證
對於 Cognito User Pool (Cognito 使用者集區),請選擇您建立的使用者集區。
對於 Cognito Identity Pool (Cognito 身分集區),請選擇您建立的身分集區。
如需詳細資訊,請參閱開始使用 Amazon 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 身分集區的名稱
ES-name:您的 OpenSearch Services 網域的名稱
region:您的 OpenSearch Service 網域所在的「區域」,例如 us-east-1

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

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

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

15.    連接到您的執行個體並安裝 NGINX。

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

$ sudo amazon-linux-extras install nginx1

16.    從憑證授權單位 (CA) 取得 SSL 憑證,以設定 NGINX 的 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 憑證產生之私有金鑰的路徑
$domain-endpoint:您的 OpenSearch Services 端點
$cognito_host:您的 Amazon Cognito 使用者集區網域 (您在「步驟 2」中設定)

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

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

  • 如果您的 Amazon Open OpenSearch Service 網域正在執行 OpenSearch Service 1.0 以上版本,請使用 _dashboards 端點。
  • 如果您的 Amazon OpenSearch Service 網域正在執行 Elasticsearch 5.x 至 7.x 版,請使用 _plugin/kibana 端點。
server {
    listen 443;
    server_name $host;
    rewrite ^/$ https://$host/_dashboards 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 /_dashboards {
        # Forward requests to Dashboards
        proxy_pass https://$domain-endpoint/_dashboards;

        # Handle redirects to Cognito
        proxy_redirect https://$cognito_host 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) {
        # Forward requests to Cognito
        proxy_pass https://$cognito_host;

        # Handle redirects to Dashboards
        proxy_redirect https://$domain-endpoint https://$host;

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

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

19.    (選擇性) 使用 sed 命令來指派 $domain-endpoint$cognito_host 變數:

$ sudo sed -i 's/$domain-endpoint/vpc-mydashboards-111xxx.us-east1.es.amazonaws.com/' /etc/nginx/conf.d/default.conf
$ sudo sed -i 's/$cognito_host/mydomain.auth.us-east-1.amazoncognito.com/' /etc/nginx/conf.d/default.conf

注意:您不需要在 /etc/nginx/conf.d/default.conf 檔案中取代 $domain-endpoint$cognito_host

20.    重新啟動 NGINX。

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

$ sudo service nginx restart

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

$ sudo systemctl restart nginx.service

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

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