针对 AWS Elastic Search HTTP 请求在 EB 上对 EC2 进行身份验证

Posted

技术标签:

【中文标题】针对 AWS Elastic Search HTTP 请求在 EB 上对 EC2 进行身份验证【英文标题】:Authenticating EC2 on EB for AWS Elastic Search HTTP requests 【发布时间】:2020-11-03 06:16:36 【问题描述】:

我正在尝试从在弹性 beanstalk 内运行 Node.js 的 EC2 实例向 AWS Elastic Search 发出 HTTP 请求(用于插入/索引删除/查询等)。我的问题在于 AWS 处理身份验证的方式。

弹性搜索索引中的文档没有用于查询/更新等的 SDK。 (有一个用于管理域)。他们推荐的签名请求方式是here。简而言之,他们使用 AWS.Signers.V4 类将凭证添加到 HTTP 标头,并且需要访问密钥、秘密密钥和会话令牌。

我正在使用的 EC2 实例不会将凭据存储在环境中(决定不在我手中)或文件中,这就是我在我的机器上获取凭据的方式。它已经具有访问弹性搜索节点的正确角色,我需要提取三个凭据(访问密钥、密钥和会话令牌)的最佳方法,因为它们作为参数传递给 addAuthorization方法。我尝试记录CredentialProviderChain,但没有一个提供者有任何存储的凭据。在本地记录此内容会按预期显示具有正确凭据的环境变量和共享凭据文件。有人告诉我不应该使用假设角色 API(它会返回凭据),这对我来说也没有意义,因为我承担了 EC2 已经拥有的角色,哈哈

我遇到了this method 来检索实例元数据,包括安全凭证。这是我最好的选择吗?或者有没有我没有考虑过的替代方案?我对此并不太兴奋,因为我必须添加一些逻辑来检查进程是否在 EC2 实例中运行(这样我可以在没有运行时在本地进行测试)所以它不像我期望的那样干净,并且我想确保我已经探索了所有可能性。

附: AWS 开发工具包如何处理身份验证?如果我使用 AWS 使用的相同方法,我认为我的更改最有可能获得批准,因为弹性搜索是我们必须手动签署请求的唯一服务。所有其他的都由 SDK 处理。

【问题讨论】:

这可能是因为我不太了解身份验证,但是当我们的凭据经常更改时,这不是问题吗?每次我们的凭据过期时,我们都不需要更新这些吗? 啊,好的,非常感谢您的提示!希望我会在某个时候恢复更新,哈哈 【参考方案1】:

最简单且非常好的做法是使用 SSM。 System Manager 有一个 Parameter Store,它可以让您保存加密的凭据。然后,您需要做的就是使用策略为 EC2 分配一个 IAM 角色以访问 SSM,或者只需编辑现有角色并授予完全 SSM 访问权限以使其运行,然后将其锁定为最低权限。

但是当我们的凭据经常更改时,这不是一个问题吗?每次我们的凭据过期时,我们都不需要更新这些吗?

IAM 用户有轮换密码,您需要一个服务帐户密码。

默认情况下,EC2 可以访问某些内容,因为当您启动一个时,您必须为 EC2 分配一个 IAM 角色。此外,大多数 EC2 AMI 都安装了 AWS CLI 和 SDK,因此您可以直接获取 SSM 参数存储值。下面是一些 Python 演示:

ssm = boto3.client('ssm', region_name='ap-southeast-2', config=Config(proxies='http': 'proxy:123', 'https': 'proxy:123'))
key = "thePasswordKeyToGetTheValue"
response = ssm.get_parameter(Name=key, WithDecryption=True)
        value = response['Parameter']['Value']

【讨论】:

再次感谢!我最终找到了一个解决方案(作为答案发布),但这对提高我的理解非常有帮助,因此非常感谢:D【参考方案2】:

答案非常简单,实际上记录在 here。 AWS.config 对象有一个 getCredentials 方法,该方法将默认凭证加载到 AWS.config.credentials 中,并且可以从那里访问,也可以在 EC2 内部访问。

我的猜测是它正在使用 EC2 实例元数据,因为它确实应该包含凭据,但我不确定为什么当我尝试在 CredentialProviderChain 中记录 EC2 实例元数据提供程序时,我得到一个空对象,而记录相同在我的机器上显示 SharedIniFileCredentials 和 Environment Credentials 都包含这些凭据。

【讨论】:

以上是关于针对 AWS Elastic Search HTTP 请求在 EB 上对 EC2 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk - 针对不同环境的单独配置

将 Elastic Search 数字字段转换为文本值

Elastic Search 中的多租户

在 AWS Elastic Load Balancer 后面使用 Primus.io (websockets)

Elastic beanstalk 实例无法访问私有 S3 文件

elastic search 6.3 nested exist or missing