node.js - AWS Elastic Search Policy,只允许lambda访问Elastic Search

标签 node.js amazon-web-services aws-lambda axios aws-elasticsearch

我正在努力在 AWS 上设置一个 ElasticSearch 实例。我的目标是只允许从我的 Lambda 函数到 ElasticSearch 实例的 http 请求。我制定了一项政策,为 Lambda 提供对 ElasticSearch 实例的访问权。我正在努力解决的部分是ElasticSearch的内联资源策略,它将拒绝所有其他不是来自“Lambda”的请求。

我已尝试将 ElasticSearch 资源策略设置为 Deny 所有请求,然后为我的 Lambda 提供一个可以访问 ElasticSearch 的角色.Lambda 使用该角色时,我正在使用 axios 签署我的 http 请求。和 aws4但是请求被拒绝了 The request signature we calculated does not match the signature you provided. 我不认为问题是请求的实际签名,而是我创建的策略。如果有人能引导我朝着正确的方向前进,那将非常有帮助。

Lambda 政策

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "es:ESHttpGet",
                "es:CreateElasticsearchDomain",
                "es:DescribeElasticsearchDomainConfig",
                "es:ListTags",
                "es:ESHttpDelete",
                "es:GetUpgradeHistory",
                "es:AddTags",
                "es:ESHttpHead",
                "es:RemoveTags",
                "es:DeleteElasticsearchDomain",
                "es:DescribeElasticsearchDomain",
                "es:UpgradeElasticsearchDomain",
                "es:ESHttpPost",
                "es:UpdateElasticsearchDomainConfig",
                "es:GetUpgradeStatus",
                "es:ESHttpPut"
            ],
            "Resource": "arn:aws:es:us-east-1:,accountid>:domain/<es-instance>"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "es:PurchaseReservedElasticsearchInstance",
                "es:DeleteElasticsearchServiceRole"
            ],
            "Resource": "*"
        }
    ]
}

ElasticSearch 内联策略

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Principal": {
        "AWS": [
          "*"
        ]
      },
      "Action": [
        "es:*"
      ],
      "Resource": "arn:aws:es:us-east-1:<account-number>:domain/<es-instance>/*"
    }
  ]
}

使用 Aws4 和 Axios 的 Lambda 代码

//process.env.HOST = search-<es-instance>-<es-id>.us-east-1.es.amazonaws.com
function createRecipesIndex(url, resolve, reject){

         axios(aws4.sign({
            host: process.env.HOST,
            method: "PUT",
            url: "https://" + process.env.HOST,
            path: '/recipes/',
       }))
      .then(response => {
          console.log("----- SUCCESS INDEX CREATED -----");
        resolve();
      })
      .catch(error => {
          console.log("----- FAILED TO CREATE INDEX -----");
        console.log(error);
        reject();
      });
}

注意:我尝试创建索引时将 ElasticSearch 上的内联策略设置为允许 *(all) 并删除 aws4 库签名,它工作正常。现在我只想保护对该资源的访问。

最佳答案

我找到了我的问题的解决方案,它是 2 倍。第一个问题是我的内联 resource policy在我的 ElasticSearch实例。我需要更新它以允许我赋予 Lambda 的角色.这是通过获取 role arn 完成的。来自 IAM然后创建以下要内联附加到 ElasticSearch 上的策略实例。

我的第二个问题是 aws4 . pathurl我设置的不匹配。我的路径有 /xxxx/而我的网址是 https://search-<es-instance>-<es-id>.us-east-1.es.amazonaws.com/xxxx .自 path包含在 url 中找不到的额外正斜杠, 签名失败。对于使用该库的任何其他人,请确保这些值是一致的。我希望这对将来的其他人有帮助 :D

Elastic Search Policy

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<account-id>:role/service-role/<role-name>"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:<account-id>:domain/<es-instance>/*"
    }
  ]
}

关于node.js - AWS Elastic Search Policy,只允许lambda访问Elastic Search,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53266927/

相关文章:

javascript - 为什么我从 Loopback4 收到“访问被拒绝”错误,同时能够使用相同的凭据从 MySql 工作台进行连接

node.js - dotenv模块的意义

javascript - 在 node.js 中获取控制台路径

amazon-web-services - CDK : Template format error: Parameter count 63 is greater than max allowed 60

amazon-web-services - Lambda 仅返回 200 响应代码

amazon-web-services - Lambda 上的 AWS SES - 无法(静默地)发送电子邮件

java - 用两个地理位置坐标点创建一个框

EC2 上的 Java 8 应用程序

ios - AWSS3 区域/plist 配置问题 'The service configuration is ` nil`

node.js - AWS Lambda查询二级索引