{«Сообщение»:»Пользователь: анонимный не имеет права выполнять: es:ESHttpGet»}

#amazon-web-services #elasticsearch #kibana #amazon-kinesis-firehose

Вопрос:

Я попытался нажать на ссылку Kibana из ES-кластера. Но я получаю эту ошибку:

 {"Message":"User: anonymous is not authorized to perform: es:ESHttpGet"}
 

Политика доступа кластера ES является:

 {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::account-number:role/my-role"
      },
      "Action": "es:ESHttpGet",
      "Resource": "arn:aws:es:my-region:account-number:domain/my-es-domain/*"
    },
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "es:*",
      "Resource": "arn:aws:es:my-region:account-number:domain/my-es-domain/*",
      "Condition": {
        "IpAddress": {
          "SourceIp": "xx.xxx.xxx.xx"
        }
      }
    }
  ]
}
 

и код:

 const policy1: PolicyStatement = new PolicyStatement({
      effect: Effect.ALLOW,
      resources: ["arn:aws:es:my-region:account-number:domain/my-es-domain/*"],
      actions: ["es:ESHttpGet"],
      principals: [
        new ArnPrincipal("arn:aws:iam::account-number:role/my-role")
      ],
    });

    const policy2: PolicyStatement = new PolicyStatement({
      effect: Effect.ALLOW,
      resources: ["arn:aws:es:my-region:account-number:domain/my-es-domain/*"],
      actions: ["es:*"],
      principals: [
        new ArnPrincipal("*")
      ],
      conditions: {
        IpAddress: {
          SourceIp: ["xx.xxx.xxx.xx"]
        }
      }
    });

    // es cluster 
    // @ts-ignore
    const elasticsearchDomain = new Domain(this,
      'ElasticsearchDomain',
      {
        accessPolicies: [policy1, policy2],
        domainName: 'my-es-domain',
        version: ElasticsearchVersion.V7_10,
        capacity: {
          dataNodeInstanceType: "r6g.large.elasticsearch"
        }
      }
    );
 

Когда мое приложение развернуто, я не могу нажать на ссылку Kibana в ES-кластере, но если я изменю политику доступа выше, чтобы:

 {
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::account-number:role/my-role"
      },
      "Action": "es:ESHttpGet",
      "Resource": "arn:aws:es:my-region:account-number:domain/my-es-domain/*"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:my-region:account-number:domain/my-es-domain/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "xx.xxx.xxx.xx"
        }
      }
    }
  ]
}
 

Тогда это сработает.

Единственным отличием политики доступа является это утверждение в основном:

 "Principal": {
     "AWS": "*"
  }
 

Кто-нибудь знает, как это исправить?
Или как я должен программно корректировать свой код?

Спасибо.

Ответ №1:

Эта ошибка может указывать на то, что ваша служба ElasticSearch не поддерживает анонимные запросы (те, которые не подписаны действительными учетными данными IAM).