Политика поиска AWS Elastic, разрешить только лямбда-доступ к Elastic Search - PullRequest
0 голосов
/ 12 ноября 2018

Я работаю над настройкой ElasticSearch экземпляра на AWS.Моя цель - разрешить http-запрос только от моей функции Lambda к экземпляру ElasticSearch.Я создал одну политику, которая дает 'Lambda access to the ElasticSearch instance. The part I'm struggling with is the inline resource policy for ElasticSearch that will deny all other request that aren't from the 'Lambda.

Я попытался установить политику ресурсов ElasticSearch на Deny все запросы, а затем присвоил моей Lambda роль с доступом к ElasticSearch. Пока Lambda использует эту роль, я подписываю своюHTTP-запросы с использованием axios и aws4 , но запрос отклоняется с помощью The request signature we calculated does not match the signature you provided. Я не думаю, что проблема заключается в фактическом подписании запроса, а вместо этого в созданных мною политиках.Если кто-нибудь может направить меня в правильном направлении, это действительно поможет.

Lambda Policy

{
    "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 Inline Policy

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

Lambda Code Using Aws4 and Axios

//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, установленной для разрешения * (все) и удаления сигнатуры библиотеки aws4, и все работает нормально.Сейчас я просто хочу обеспечить доступ к этому ресурсу.

1 Ответ

0 голосов
/ 12 ноября 2018

Я нашел решение своей проблемы, и оно было в 2 раза. Первой проблемой был мой встроенный resource policy в моем экземпляре ElasticSearch. Мне нужно было обновить его, чтобы разрешить роль, которую я дал моему Lambda. Это было сделано путем получения role arn от IAM и последующего создания политики ниже для встраивания в экземпляр ElasticSearch.

Моя вторая проблема была с aws4. path и url, которые я установил, не совпадали. Мой путь был /xxxx/, в то время как мой URL был 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>/*"
    }
  ]
}
...