如何使用 SSH 隧道通过 Amazon Cognito 身份验证从 VPC 外部访问 OpenSearch 控制面板?

上次更新日期:2022 年 12 月 14 日

我的 Amazon OpenSearch Service 集群位于虚拟私有云(VPC)中。我想使用 SSH 隧道通过 Amazon Cognito 身份验证从 VPC 外部访问 OpenSearch 控制面板。

简短描述

默认情况下,Amazon Cognito 限制 OpenSearch 控制面板访问 VPC 中的 AWS Identity and Access Management(IAM)用户。通过设置 OpenSearch Service 托管的 VPC 端点(由 AWS PrivateLink 提供支持),您可以从另一个 VPC 访问 Amazon OpenSearch Service 域。您还可以使用 SSH 隧道从 VPC 外部访问 OpenSearch 控制面板。

重要提示:请确保从 VPC 外部访问 OpenSearch 控制面板时,符合贵组织的安全要求。

使用 SSH 隧道从 VPC 外部访问控制面板:

1.    创建 Amazon Cognito 用户池和身份池。

2.    在公有子网中创建一个 Amazon Elastic Compute Cloud(Amazon EC2)实例。此子网必须与您的 OpenSearch Service 域位于同一 VPC 中。

3.    使用浏览器加载项(如 FoxyProxy)配置 SOCKS 代理。

4.    创建从本地计算机到 EC2 实例的 SSH 隧道。

注意:您还可以使用 NGINX 代理或客户端 VPN 通过 Amazon Cognito 身份验证从 VPC 外部访问控制面板。有关更多信息,请参阅如何使用 Amazon Cognito 身份验证从 VPC 外部访问 OpenSearch 控制面板?

5.    (可选)如果开启了细粒度访问控制(FGAC),请添加经 Amazon Cognito 身份验证的角色。

解决方法

创建 Amazon Cognito 用户池和身份池

1.    创建 Amazon Cognito 用户池

2.    配置托管用户池域

3.    在 Amazon Cognito 控制台导航窗格中,选择用户和组

4.    选择创建用户,然后填写字段。请务必输入电子邮件地址。然后,选中将电子邮件标记为已验证复选框。

5.    选择选项卡,然后选择创建组。对于 Precedence(优先级),输入 0。有关更多信息,请参阅在 AWS 管理控制台中创建新组

6.    再次打开 Amazon Cognito 控制台

7.    选择管理身份池,然后选择创建新身份池

8.    输入身份池的名称,选中启用对未经身份验证的身份的访问权限的复选框。然后选择 Create Pool(创建池)。

9.    当系统提示您访问您的 AWS 资源时,选择 Allow(允许)。 这将创建与您的身份池关联的两个默认角色——一个用于未经身份验证的用户,另一个用于经过身份验证的用户。

10.    配置您的 OpenSearch Service 域,以使用面向 OpenSearch 控制面板的 Amazon Cognito 身份验证
对于 Cognito 用户池,请选择您在步骤 1 中创建的用户池。
对于 Cognito 身份池,请选择您在步骤 8 中创建的身份池。

11.    将您的 OpenSearch Service 域配置为使用与于以下类似的访问策略。替换这些值:
account-id 替换为您的 AWS 账户 ID
identity-name 替换为您的 Amazon Cognito 身份池的名称
domain-name 替换为您的域名
Region 替换为您的域所在的区域,例如 us-east-1

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:sts::account-id:assumed-role/Cognito_identity-nameAuth_Role/CognitoIdentityCredentials"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:Region:account-id:domain/domain-name/*"
    }
  ]
}

例如,以下访问策略使用以下值:

AWS 账户 ID:111122223333
Amazon Cognito 身份池名称:MyIdentityPool
域名:MyDomain
区域:us-east-1

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:sts::111122223333:assumed-role/Cognito_MyIdentityPoolAuth_Role/CognitoIdentityCredentials"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:111122223333:domain/MyDomain/*"
    }
  ]
}

创建 EC2 实例并配置安全组规则

1.    在您的 OpenSearch Service 域所在的 VPC 的公有子网中启动 EC2 实例。在 Configure Instance Details(配置实例详细信息)页面上,确保 Auto-assign Public IP(自动分配公有 IP)设置为 Enable(启用)。
注意:在以下步骤中,EC2 实例称为 tunnel_ec2。

2.    将入站规则添加到与 tunnel_ec2 实例关联的安全组。这些规则必须允许从您访问 OpenSearch Service 控制面板的本地计算机的 IP 地址到 8157 和 22 端口的流量。

3.    将入站规则添加到与 OpenSearch Service 域关联的安全组。此规则必须允许来自 tunnel_ec2 实例的私有 IP 地址的流量。

配置 SOCKS 代理

1.    将 FoxyProxy Standard 添加到 Google Chrome

2.    打开 FoxyProxy,然后选择选项

3.    在 Proxy mode (代理模式) 下拉列表中,选择 Use proxies based on their pre-defined patterns and priorities (根据预定义模式和优先级使用代理)

4.    选择添加新代理

5.    选择 General(常规)选项卡,然后输入 Proxy Name(代理名称),例如“Dashboards Proxy”。

6.    在 Proxy Details (代理详细信息) 选项卡上,确保选中 Manual Proxy Configuration (手动代理配置),然后填写以下字段:
       对于 Host or IP Address (主机或 IP 地址),输入 localhost
       对于端口,输入 8157
       选择 SOCKS 代理
       选择 SOCKS v5

7.    选择 URL Patterns (URL 模式) 选项卡。

8.    选择 Add new pattern(添加新模式),然后填写以下字段:
       对于 Pattern Name(模式名称),输入“VPC 端点”之类的名称。
       对于 URL pattern(URL 模式),输入控制面板的 VPC 端点。确保允许访问该 URL。确保选中 Wildcards(通配符)。

9.     选择 Save(保存)。

创建 SSH 隧道

1.    从您用于访问控制面板的本地计算机上运行此命令。替换以下项目:
       mykeypair.pem:您在启动 tunnel_ec2 EC2 实例时指定的密钥对的 .pem 文件的名称。
       public_dns_name: 您的 tunnel_ec2 EC2 实例的公有 DNS。有关更多信息,请参阅查看 EC2 实例的 DNS 主机名

ssh -i "mykeypair.pem"  ec2-user@public_dns_name -ND 8157

2.    在浏览器中输入控制面板终端节点。出现控制面板的 Amazon Cognito 登录页面。

(可选)如果开启了 FGAC,请添加经 Amazon Cognito 身份验证的角色

如果对 OpenSearch Service 集群启用了细粒度访问控制(FGAC),您可能会遇到“缺少角色”错误。要解决“缺少角色”错误,请执行以下步骤:

1.    登录 OpenSearch Service 控制台。

2.    在导航窗格的 Managed clusters(托管集群)下,选择 Domains(域)。

3.    选择操作

4.    选择 Modify master user(修改主用户)。

5.    选择 Set IAM ARN as your master user(将 IAM ARN 设置为您的主用户)。

6.    在 IAM ARN 字段中,添加经 Amazon Cognito 身份验证的 ARN 角色。

7.    选择 Submit(提交)。

如需有关精细访问控制的更多信息,请参阅教程:IAM 主用户和 Amazon Cognito