Właściwa polityka dostępu dla Amazon Elastic Search Cluster

99

Niedawno zacząłem korzystać z nowej usługi Amazon Elasticsearch i nie potrafię określić, jakiej polityki dostępu potrzebuję, aby mieć dostęp tylko do usług z moich instancji EC2, które mają przypisaną określoną rolę IAM.

Oto przykład polityki dostępu, którą obecnie przypisałem dla domeny 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]/*"
    }
  ]
}

Ale jak powiedziałem, to nie działa. Loguję się do instancji EC2 (która ma my_es_roleprzypisaną rolę) i próbuję uruchomić proste wywołanie curl w punkcie końcowym „https: //*.es.amazonaws.com”, pojawia się następujący błąd:

{"Message": "Użytkownik: anonymous nie ma uprawnień do wykonywania: es: ESHttpGet on resource: arn: aws: es: us-east-1: [ACCOUNT_ID]: domain / [ES_DOMAIN] /"}

Czy ktoś wie, co muszę zmienić w polityce dostępu, żeby to zadziałało?

hartfordfive
źródło
14
Uwaga, zmiany zasad dostępu ElasticSearch wymagają dłuższego czasu, w przeciwieństwie do innych zmian IAM, które są prawie natychmiastowe. Łatwo jest po prostu kliknąć „zastosuj” i przełączyć kartę, nie zauważając „Przetwarzanie ...”
Cyril Duchon-Doris

Odpowiedzi:

63

Możesz zablokować dostęp tylko do IAM, ale jak będziesz wyświetlać Kibana w swojej przeglądarce? Możesz skonfigurować serwer proxy ( zobacz moduł Gist i / lub NPM ) lub włączyć dostęp oparty na IAM i IP w celu przeglądania wyników.

Udało mi się uzyskać dostęp do IAM z ograniczonym dostępem IP z następującą polityką dostępu. Zwróć uwagę, że kolejność jest ważna: nie mogłem sprawić, by działała z instrukcją opartą na adresie IP przed instrukcją IAM.

{
  "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"
          ]
        }
      }
    }
  ]
}

Moja instancja EC2 ma profil instancji z arn:aws:iam::aws:policy/AmazonESFullAccess polityką. Logstash powinien podpisywać żądania przy użyciu wtyczki wyjściowej logstash-output-amazon-es . Logstash działający na mojej instancji EC2 zawiera następującą sekcję wyjściową:

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

Mam dostęp do Kibany z dwóch adresów IP w polityce dostępu (192.168.1.0 i 192.168.1.1).

Pete
źródło
Cześć, potrzebujesz wtyczki tylko wtedy, gdy korzystasz z zasad opartych na uprawnieniach. Możesz użyć standardowej wtyczki Elasticsearch w Logstash, jeśli Twoje zasady dostępu są oparte na adresach IP. W tym przypadku również nie potrzebujesz profilu instancji. Ponadto usługa ES nie jest dostępna w VPC. Aby się połączyć, musisz użyć publicznych adresów IP. Nie jestem pewien, czy odwołania do adresów 192.168 zastępują coś innego, ale mogą wprowadzać w błąd.
Garreth McDaid
W aws:SourceIpmoim przykładzie są to adresy IP Twojej osobistej stacji roboczej, więc możesz używać Kibany. Dostęp z ograniczeniami IAM umożliwia jednemu lub kilku wystąpieniom EC2 zapis do Elasticsearch bez martwienia się o to, które adresy IP należą do konkretnej instancji lub bloku CIDR.
Pete
1
Warto zauważyć, że ograniczenie do prywatnego zakresu adresów IP CIDR Twojego VPC wydaje się nie działać. ES nie działa w VPC czy coś w tym stylu.
sventechie
Dziękujemy za podanie przykładowej polityki w odpowiedzi; Nie udało mi się usunąć Kibany z przerażającym błędem „Użytkownik: anonimowy”, dopóki nie przełączyłem się aws:SourceIpz wartości skalarnej na tablicę, jak w podanym przykładzie. (Jestem notacją CIDR, jeśli to pomoże komukolwiek innemu.) Cały proces ustawiania zasad dla AWS ES byłby mniej frustrujący, gdyby każda pojedyncza zmiana polityki nie wprowadzała klastra w tajemniczy stan „przetwarzania” na 20 minut, ponieważ polityka jest starannie wypisana na kamiennych tablicach, czy cokolwiek robią.
Robert Calhoun
38

Zgodnie z dokumentacją AWS i jak właśnie testowaliśmy (i ja), nie możesz ograniczyć dostępu do domeny AWS ES do roli / konta / użytkownika / ... i po prostu zakreślić ją!

Klienci standardowi, tacy jak curl, nie mogą wykonywać podpisywania żądań, które jest wymagane w przypadku zasad dostępu opartych na tożsamości. Aby pomyślnie wykonać instrukcje dla tego kroku, należy użyć zasad dostępu opartych na adresach IP, które umożliwiają dostęp anonimowy. ( http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html )

Masz więc zasadniczo dwa rozwiązania:

Podpisanie żądania jest prawdopodobnie najlepszym rozwiązaniem, jeśli chcesz zachować swoją politykę dostępu w obecnym kształcie (która jest bardziej elastyczna niż ograniczenie do adresu IP), ale wydaje się być nieco bardziej złożona. Nie próbowałem dotąd i nie mogę znaleźć żadnego doktora, który mógłby pomóc.

Olivier
źródło
3
Użyłem publicznego adresu IP mojego laptopa i próbowałem uzyskać dostęp do punktu końcowego za pomocą curl / browser, ale nadal otrzymuję błąd User: anonymous.
Anant Gupta
7
mam do czynienia z tym samym problemem. Zauważyłem, że przetwarzanie zmian przez aws flexiblesearch zajmuje dłuuuugo czasu.
nemo
Ustaw politykę dostępu z dwoma instrukcjami: jedną dla dostępu IAM do zapisywania dzienników, a drugą z dostępem ograniczonym do IP w celu przeglądania KIbana. Zobacz moją odpowiedź po szczegóły
Pete
2
Zastanawiałem się, czy „dłuuuugo” oznacza minuty, godziny czy dni. Wygląda na to, że to 10-15 minut. Możesz to zobaczyć, sprawdzając status swojego ES (zielony „aktywny”, jeśli aktualizacja jest zakończona, w innym przypadku coś w rodzaju pomarańczowego „przygotowuje się”.
Balmipour
Miałem ten sam problem i po przeszukaniu znalazłem tę podręczną bibliotekę .
gmajivu
6

Trochę spóźniłem się na przyjęcie, ale udało mi się poradzić sobie z tym samym problemem, dodając podpis do moich wniosków.

Jeśli używasz Pythona (tak jak ja), możesz użyć następującej biblioteki, aby ułatwić jej wdrożenie: https://github.com/DavidMuller/aws-requests-auth

U mnie zadziałało idealnie.

Philippe Oger
źródło
1

Wystarczy podać pełną nazwę użytkownika w zasadach elastycznego wyszukiwania.

W takim przypadku pełną nazwę użytkownika można uzyskać na podstawie samego komunikatu o błędzie. W moim przypadku: „arn: aws: sts :: [ACCOUNT_ID]: przejęta-rola / [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]/*"
        }
      ]

    }
Oguz
źródło
0

Rola ARN musi zostać zmieniona. będzie wyglądać następująco: „arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role”

Kunal
źródło
-2

Próbuję to również zrobić, ale działało, używając Allow access to the domain from specific IP(s)opcji z elastycznym adresem IP mojej instancji EC2 (może również działać przy użyciu prywatnego adresu IP instancji, ale nie jestem zbyt pewien)

rkrdo
źródło