为 AWS Elastic Search HTTP 请求验证 EB 上的 EC2

Authenticating EC2 on EB for AWS Elastic Search HTTP requests

我正在尝试从弹性 beanstalk 中的 EC2 实例 运行 Node.js 向 AWS Elastic Search 发出 HTTP 请求(对于 insertions/index deletions/queries 等)。我的问题是 AWS 处理身份验证的方式。

querying/updating等弹性搜索索引中的文档没有SDK。 (有一个用于管理域)。他们推荐的签署请求的方式已给出 here。简而言之,他们使用 AWS.Signers.V4 class 将凭据添加到 HTTP headers,并且他们需要访问密钥、秘密密钥和 session 令牌。

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

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

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

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

but wouldn't that be an issue when our credentials change often? Wouldn't we have to update those every time our credentials expired?

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']

答案简单得令人震惊,而且确实记录在案 here。 AWS.config 对象有一个 getCredentials 方法,它将默认凭证加载到 AWS.config.credentials 中,并且可以从那里访问,在 EC2 内部也是如此。

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