我试图从一个在弹性豆杆中运行EC2的Node.js实例向AWS弹性搜索发出HTTP请求(用于插入/索引删除/查询等)。我的问题是AWS处理身份验证的方式。
在弹性搜索索引中没有用于查询/更新等文档的SDK。(有一个用于管理域)。他们推荐的签署请求的方法是这里。简而言之,它们使用AWS.Signers.V4类将凭据添加到headers,并且需要访问密钥、秘密密钥和会话令牌。
我正在使用的EC2实例不将凭据存储在环境中(决策不在我手中),也不存储在文件中,这就是我在计算机上获取凭据的方式。它已经具有访问弹性搜索节点的正确角色,I需要提取三种凭据(访问密钥、秘密密钥和会话令牌)的最佳方法,因为它们作为参数传递给addAuthorization方法。我尝试记录CredentialProviderChain,但是没有一个提供程序有任何存储的凭据。本地日志显示环境变量和共享凭据文件,该文件具有预期的正确凭据。有人告诉我,我不应该使用假设的角色API (它确实返回凭据),这对我也没有意义,因为我正在承担一个EC2已经拥有lol的角色。
我偶然发现这种方法用于检索实例元数据,包括安全凭据。这是我最好的选择吗?还是有什么我没考虑过的选择?我对此不太感兴趣,因为我需要添加一些逻辑来检查进程是否在EC2实例中运行(这样我就可以在本地进行测试,而不是这样),所以它并不像我所期望的那样干净,我想确保我已经探索了所有的可能性。
AWS SDK如何处理身份验证?我认为,如果我使用AWS使用的相同方法,我将有最好的机会获得更改的批准,因为弹性搜索是我们必须手动签署请求的唯一服务。所有其他的都由SDK处理。
发布于 2020-07-14 22:04:33
答案简单得令人震惊,而且实际上已经记录在案了这里。AWS.config对象有一个getCredentials方法,该方法将默认凭据加载到AWS.config.credentials中,并且可以从那里在EC2中访问。
我的猜测是,它使用的是EC2实例元数据,因为它确实应该包含凭据,但我不知道为什么当我尝试在CredentialProviderChain中记录EC2实例元数据提供程序时,我得到了一个空对象,而在我的机器上记录的结果显示SharedIniFileCredentials和Environment凭据都包含tried。
发布于 2020-07-14 05:23:24
最简单和非常好的实践是使用SSM。系统管理器有一个参数存储库,它允许您保存加密的凭据。然后,您所需要做的就是为EC2分配一个IAM角色,其中包含一个访问SSM的策略,或者只需要编辑现有的角色,并给出完整的SSM访问权限,然后将其锁定为最小特权。
但是,当我们的资历经常变化时,这不是一个问题吗?难道每次我们的证件过期都要更新吗?
IAM用户有旋转密码,您需要一个服务帐户密码。
默认情况下,EC2可以访问某些东西,因为当您将其旋转起来时,您必须为EC2分配一个IAM角色。而且,大多数EC2 AMI都安装了AWS & SDK,因此您可以立即获取值。下面是一些要演示的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']https://stackoverflow.com/questions/62886233
复制相似问题