Amazon Elastic Search Cluster에 대한 적절한 액세스 정책


99

최근에 새로운 Amazon Elasticsearch Service를 사용하기 시작했는데 특정 IAM 역할이 할당 된 EC2 인스턴스에서만 서비스에 액세스 할 수 있도록 필요한 액세스 정책을 파악할 수없는 것 같습니다.

다음은 현재 ES 도메인에 할당 한 액세스 정책의 예입니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::[ACCOUNT_ID]:role/my_es_role",
        ]
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-east-1:[ACCOUNT_ID]:domain/[ES_DOMAIN]/*"
    }
  ]
}

그러나 내가 말했듯이 이것은 작동하지 않습니다. my_es_role역할이 연결된 EC2 인스턴스에 로그인 하고 "https : //*.es.amazonaws.com"끝점에서 간단한 curl 호출을 실행하려고하면 다음 오류가 발생합니다.

{ "Message": "User : anonymous는 수행 할 권한이 없습니다. 리소스에 대한 es : ESHttpGet : arn : aws : es : us-east-1 : [ACCOUNT_ID] : domain / [ES_DOMAIN] /“}

이 작업을 수행하기 위해 액세스 정책에서 변경해야 할 사항을 아는 사람이 있습니까?


14
ElasticSearch 액세스 정책 변경은 거의 즉각적인 다른 IAM 변경과 달리 적용하는 데 시간이 오래 걸립니다. "적용"을 클릭하고 "처리 중 ..."을 눈치 채지 않고 탭을 전환하는 것은 쉽습니다.
Cyril Duchon-Doris

답변:


63

IAM 전용 액세스를 잠글 수 있지만 브라우저에서 Kibana를 어떻게 볼 수 있습니까? 당신은 할 수 설정 프록시 ( 요점 참조 및 / 또는 NPM 모듈 ) 또는 결과를 볼 IAM 모두 IP 기반 액세스를 가능하게한다.

다음 액세스 정책을 통해 IAM 액세스 IP 제한 액세스를 모두 얻을 수있었습니다. 순서가 중요합니다. IAM 문 이전에 IP 기반 문으로 작업 할 수 없었습니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::xxxxxxxxxxxx:root"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-west-2:xxxxxxxxxxxx:domain/my-elasticsearch-domain/*"
    },
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-west-2:xxxxxxxxxxxx:domain/my-elasticsearch-domain/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "192.168.1.0",
            "192.168.1.1"
          ]
        }
      }
    }
  ]
}

내 EC2 인스턴스에는 arn:aws:iam::aws:policy/AmazonESFullAccess 정책 이 포함 된 인스턴스 프로필이 있습니다. Logstash는 logstash-output-amazon-es 출력 플러그인을 사용하여 요청에 서명해야합니다 . 내 EC2 인스턴스에서 실행되는 Logstash에는 다음과 같은 출력 섹션이 포함됩니다.

output {
    amazon_es {
        hosts => ["ELASTICSEARCH_HOST"]
        region => "AWS_REGION"
    }
    # If you need to do some testing & debugging, uncomment this line:
    # stdout { codec => rubydebug }
}

액세스 정책의 두 IP (192.168.1.0 및 192.168.1.1)에서 Kibana에 액세스 할 수 있습니다.


안녕하세요, IAM 기반 정책을 사용하는 경우에만 플러그인을 사용하면됩니다. 액세스 정책이 IP 주소를 기반으로하는 경우 Logstash에서 표준 elasticsearch 플러그인을 사용할 수 있습니다. 이 경우에도 인스턴스 프로필이 필요하지 않습니다. 또한 ES 서비스는 VPC에서 사용할 수 없습니다. 연결하려면 공용 IP 주소를 사용해야합니다. 192.168 주소에 대한 참조가 다른 것을 대체하는지 확실하지 않지만 오도 할 수 있습니다.
Garreth McDaid

aws:SourceIp내 예제 의 's는 Kibana를 사용할 수 있도록 개인 워크 스테이션 IP를위한 것입니다. IAM 제한 액세스를 사용하면 하나 이상의 EC2 인스턴스가 특정 인스턴스 또는 CIDR 블록에 속하는 IP에 대해 걱정하지 않고 Elasticsearch에 쓸 수 있습니다.
Pete

1
VPC 의 프라이빗 IP CIDR 범위로 제한하는 것이 작동하지 않는 것 같다는 점은 주목할 가치가 있습니다. ES는 VPC 등에서 작동하지 않습니다.
sventechie

답변에 샘플 정책을 제공해 주셔서 감사합니다. 나는 aws:SourceIp당신이 준 예제 에서처럼 스칼라 값에서 배열 로 전환 할 때까지 두려운 "사용자 : 익명"오류를지나 Kibana를 얻을 수 없었습니다 . (다른 사람에게 도움이된다면 저는 CIDR 표기법입니다.) 모든 단일 정책 변경으로 인해 클러스터가 20 분 동안 신비한 "처리"상태가되지 않으면 AWS ES에 대한 정책 설정의 전체 프로세스가 덜 실망 스러울 것입니다. 이 정책은 돌판이나 그들이하는 일에주의 깊게 새겨 져 있습니다.
Robert Calhoun

38

AWS 문서에 따르면 방금 테스트 한대로 AWS ES 도메인에 대한 액세스를 역할 / 계정 / 사용자 / ...로 제한 할 수 없으며 단순히 컬링 할 수 없습니다!

curl과 같은 표준 클라이언트는 ID 기반 액세스 정책에 필요한 요청 서명을 수행 할 수 없습니다. 이 단계에 대한 지침을 성공적으로 수행하려면 익명 액세스를 허용하는 IP 주소 기반 액세스 정책을 사용해야합니다. ( http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html )

따라서 기본적으로 두 가지 솔루션이 있습니다.

액세스 정책을있는 그대로 유지하려는 경우 (IP로 제한하는 것보다 더 유연함) 요청에 서명하는 것이 아마도 가장 좋은 해결책 일 수 있지만 조금 더 복잡해 보입니다. 지금까지 시도하지 않았으며 도움이 될 문서를 찾을 수 없습니다.


3
랩톱의 공용 IP 주소를 사용하고 curl / browser로 엔드 포인트에 액세스를 시도했지만 여전히 User : anonymous 오류가 발생합니다.
Anant Gupta

7
나는 같은 문제를 다루고 있습니다. aws elasticsearch로 변경 사항을 처리하는 데 시간이 많이 걸린다는 사실을 알게되었습니다.
nemo

두 개의 문으로 액세스 정책을 설정합니다. 하나는 로그를 쓰기위한 IAM 액세스 용이고 다른 하나는 KIbana를보기위한 IP 제한 액세스 용입니다. 자세한 내용은 내 대답을 참조하십시오
피트

2
"loooong"이 몇 분, 몇 시간 또는 며칠을 의미하는지 궁금했습니다. 10 ~ 15 분 정도입니다. ES의 상태 (업데이트가 완료되면 녹색 '활성', 그렇지 않으면 주황색 '준비 중')를 확인할 때 확인할 수 있습니다.
Balmipour

나는 같은 문제가 있었고 검색 후이 편리한 라이브러리를 발견했습니다 .
gmajivu

6

파티에 조금 늦었지만 요청에 서명을 추가하여 똑같은 문제를 처리 할 수있었습니다.

Python을 사용하는 경우 (저와 마찬가지로) 다음 라이브러리를 사용하여 특히 쉽게 구현할 수 있습니다. https://github.com/DavidMuller/aws-requests-auth

그것은 나를 위해 완벽하게 작동했습니다.


1

탄력적 검색 정책에서 전체 사용자 이름 만 있으면됩니다.

이 경우 오류 메시지 자체에서 전체 사용자 이름을 가져올 수 있습니다. 제 경우 : "arn : aws : sts :: [ACCOUNT_ID] : assumed-role / [LAMBDA_POLICY_NAME] / [LAMBDA_NAME]"

    {
        "Version": "2012-10-17",
        "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws:sts::xxxxxxxxxxxx:assumed-role/[lambda-role]/[full-lambda-name]"
            ]
          },
          "Action": "es:*",
          "Resource": "arn:aws:es:[region]:xxxxxxxxxxxxx:domain/[elasticsearch-domain-name]/*"
        }
      ]

    }


0

역할 ARN을 변경해야합니다. "arn : aws : iam :: [ACCOUNT_ID] : role / service-role / my_es_role"과 같이 표시됩니다.


-2

나는 또한 이것을 시도하고 있으며 Allow access to the domain from specific IP(s)EC2 인스턴스의 탄력적 IP 옵션을 사용하여 작동하게했습니다 (인스턴스의 프라이빗 IP를 사용하여 작동 할 수도 있지만 확실하지 않습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.