如何使用 SSH 隧道通过 Amazon Cognito 身份验证从 VPC 外部访问 Kibana?

上次更新时间:2020 年 8 月 27 日

我的 Amazon Elasticsearch Service 集群位于 Virtual Private Cloud (VPC) 中。我想使用 SSH 隧道通过 Amazon Cognito 身份验证从 VPC 外部访问 Kibana。

简短描述

默认情况下,Amazon Cognito 限制 Kibana 访问 VPC 中的 AWS Identity and Access Management (IAM) 用户。但是,您可以使用 SSH 隧道从 VPC 外部访问 Kibana。

重要提示:请确保从 VPC 外部访问 Kibana(第三方工具)时,它符合贵组织的安全要求。

要使用 SSH 隧道从 VPC 外部访问 Kibana,请执行以下步骤:

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

2.    在 Elasticsearch 域所在的同一 VPC 中的公有子网中创建 Amazon Elastic Compute Cloud (Amazon EC2) 实例。

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

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

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

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

解决方法

创建 Amazon Cognito 用户池和身份池

1.    创建 Amazon Cognito 用户池

2.    配置托管用户池域

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

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

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

6.    再次打开 Amazon Cognito 控制台

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

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

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

10.    配置您的 Amazon ES 域以让 Kibana 使用 Amazon Cognito 身份验证。
对于 Cognito 用户池,请选择您在步骤 1 中创建的用户池。
对于 Cognito 身份池,请选择您在步骤 8 中创建的身份池。

11.    将您的 Amazon ES 域配置为使用与于以下类似的访问策略。替换这些值:
account-id 替换为您的 AWS 账户 ID
identity-name 替换为您的 Amazon Cognito 身份池的名称
ES-name 替换为您的 Amazon ES 域名
Region 替换为您的 Amazon ES 域所在的区域,例如 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/ES-name/*"
    }
  ]
}

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

AWS 账户 ID:111122223333
Amazon Cognito 身份池名称:MyIdentityPool
Amazon ES 域名:MyES
Region: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/MyES/*"
    }
  ]
}

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

1.    在您的 Elasticsearch 域所在的 VPC 的公有子网中启动 EC2 实例。在配置实例详细信息页面上,确保自动分配共有 IP 设置为启用
注意:在以下步骤中,EC2 实例称为 tunnel_ec2。

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

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

配置 SOCKS 代理

1.     将 FoxyProxy Standard 添加到 Google Chrome

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

3.    在代理模式下拉列表中,选择根据预定义模式和优先级使用代理。

4.    选择添加新代理

5.    选择常规选项卡,然后输入代理名称,例如“Kibana Proxy”。

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

7.    选择 URL 模式选项卡。

8.    选择添加新模式,然后填写以下字段:
对于模式名称,输入对您有意义的名称,例如“VPC Endpoint”。
对于 URL 模式,输入 Kibana 的 VPC 终端节点。确保选中白名 URL。确保选中通配符

9.     选择保存

创建 SSH 隧道

1.    从将用于访问 Kibana 仪表板的本地计算机上运行以下命令。替换以下内容:
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.    在浏览器中输入 Kibana 终端节点。出现 Kibana 的 Amazon Cognito 登录页面。

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

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

1.    登录您的 AWS 管理控制台

2.    在分析下,选择 Elasticsearch Service

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


这篇文章对您有帮助吗?


您是否需要账单或技术支持?