Richtige Zugriffsrichtlinie für Amazon Elastic Search Cluster

99

Ich habe kürzlich begonnen, den neuen Amazon Elasticsearch-Dienst zu verwenden, und ich kann anscheinend nicht herausfinden, welche Zugriffsrichtlinie ich benötige, damit ich nur von meinen EC2-Instanzen auf die Dienste zugreifen kann, denen eine bestimmte IAM-Rolle zugewiesen ist.

Hier ist ein Beispiel für die Zugriffsrichtlinie, die ich derzeit für die ES-Domäne zugewiesen habe:

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

Aber wie gesagt, das funktioniert nicht. Ich melde mich bei der EC2-Instanz an (der die my_es_roleRolle zugeordnet ist) und versuche, einen einfachen Curl-Aufruf am Endpunkt "https: //*.es.amazonaws.com" auszuführen. Es wird folgende Fehlermeldung angezeigt:

{"Nachricht": "Benutzer: anonym ist nicht berechtigt auszuführen: es: ESHttpGet auf Ressource: arn: aws: es: us-east-1: [ACCOUNT_ID]: domain / [ES_DOMAIN] /"}

Weiß jemand, was ich an der Zugriffsrichtlinie ändern muss, damit dies funktioniert?

Hartfordfive
quelle
14
Beachten Sie, dass die Anwendung von Änderungen an den ElasticSearch-Zugriffsrichtlinien im Gegensatz zu anderen IAM-Änderungen, die fast sofort erfolgen, lange dauert. Es ist einfach, auf "Übernehmen" zu klicken und die Registerkarte zu wechseln, ohne die "Verarbeitung ..." zu bemerken
Cyril Duchon-Doris

Antworten:

63

Sie können den Zugriff nur auf IAM sperren, aber wie werden Sie Kibana in Ihrem Browser anzeigen? Sie können einen Proxy einrichten ( siehe Gist- und / oder NPM-Modul ) oder sowohl den IAM- als auch den IP-basierten Zugriff zum Anzeigen der Ergebnisse aktivieren.

Mit der folgenden Zugriffsrichtlinie konnte ich beiden IP-beschränkten IAM-Zugriff erhalten. Beachten Sie, dass die Reihenfolge wichtig ist: Ich konnte sie nicht mit der IP-basierten Anweisung vor der IAM-Anweisung zum Laufen bringen.

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

Meine EC2-Instanz verfügt über ein Instanzprofil mit der arn:aws:iam::aws:policy/AmazonESFullAccess Richtlinie. Logstash sollte Anforderungen mit dem Ausgabe-Plugin logstash-output-amazon-es signieren . Der auf meiner EC2-Instanz ausgeführte Logstash enthält einen Ausgabeabschnitt wie den folgenden:

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

Ich kann über die beiden IPs in der Zugriffsrichtlinie (192.168.1.0 und 192.168.1.1) auf Kibana zugreifen.

Pete
quelle
Hallo, Sie müssen das Plugin nur verwenden, wenn Sie eine IAM-basierte Richtlinie verwenden. Sie können das Standard-Elasticsearch-Plugin in Logstash verwenden, wenn Ihre Zugriffsrichtlinie auf IP-Adressen basiert. Auch in diesem Fall benötigen Sie kein Instanzprofil. Außerdem ist der ES-Dienst in VPCs nicht verfügbar. Sie müssen öffentliche IP-Adressen verwenden, um eine Verbindung herzustellen. Sie sind sich nicht sicher, ob Ihre Verweise auf 192.168-Adressen Ersatz für etwas anderes sind, können aber irreführend sein.
Garreth McDaid
Die aws:SourceIpin meinem Beispiel sind als Ihre persönliche Workstation-IP gedacht, damit Sie Kibana verwenden können. Der IAM-beschränkte Zugriff ermöglicht es einer oder mehreren EC2-Instanzen, in Elasticsearch zu schreiben, ohne sich Gedanken darüber zu machen, welche IPs zu einer bestimmten Instanz oder einem bestimmten CIDR-Block gehören.
Pete
1
Es ist erwähnenswert, dass die Beschränkung auf den privaten IP-CIDR-Bereich Ihrer VPC nicht zu funktionieren scheint. ES funktioniert nicht innerhalb der VPC oder so.
Sventechie
Vielen Dank, dass Sie in Ihrer Antwort eine Beispielrichtlinie angegeben haben. Ich konnte Kibana nicht über den gefürchteten Fehler "Benutzer: anonym" hinausbringen, bis ich aws:SourceIpvon einem skalaren Wert zu einem Array gewechselt bin , wie in dem von Ihnen angegebenen Beispiel. (Ich bin CIDR-Notation, wenn dies jemand anderem hilft.) Der gesamte Prozess des Festlegens von Richtlinien für AWS ES wäre weniger frustrierend, wenn nicht jede einzelne Richtlinienänderung den Cluster 20 Minuten lang in den mysteriösen "Verarbeitungsstatus" versetzt hätte Die Richtlinie ist sorgfältig auf Steintafeln oder was auch immer sie tun, eingeschrieben.
Robert Calhoun
38

Laut AWS-Dokument und wie Sie (und ich) gerade getestet haben, können Sie den Zugriff auf eine AWS ES-Domäne nicht auf eine Rolle / ein Konto / einen Benutzer / ... beschränken und diese einfach cURLEN!

Standardclients wie Curl können die für identitätsbasierte Zugriffsrichtlinien erforderliche Anforderungssignatur nicht ausführen. Sie müssen eine IP-Adress-basierte Zugriffsrichtlinie verwenden, die es dem anonymen Zugriff ermöglicht, die Anweisungen für diesen Schritt erfolgreich auszuführen. ( http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html )

Sie haben also grundsätzlich zwei Lösungen:

Das Signieren Ihrer Anfrage ist wahrscheinlich die beste Lösung, wenn Sie Ihre Zugriffsrichtlinie unverändert lassen möchten (die flexibler ist als die Beschränkung auf eine IP-Adresse), sie scheint jedoch etwas komplexer zu sein. Ich habe es bisher noch nicht versucht und kann kein Dokument finden, das mir helfen könnte.

Olivier
quelle
3
Ich habe die öffentliche IP-Adresse meines Laptops verwendet und versucht, mit Curl / Browser auf den Endpunkt zuzugreifen, erhalte jedoch weiterhin den Fehler Benutzer: anonym.
Anant Gupta
7
Ich habe es mit dem gleichen Problem zu tun. und ich habe festgestellt, dass die Verarbeitung der Änderungen durch aws elasticsearch eine lange Zeit in Anspruch nimmt.
Nemo
Legen Sie eine Zugriffsrichtlinie mit zwei Anweisungen fest: eine für den IAM-Zugriff zum Schreiben von Protokollen, die andere für den IP-eingeschränkten Zugriff zum Anzeigen von KIbana. Siehe meine Antwort für Details
Pete
2
Ich fragte mich, ob "loooong" Minuten, Stunden oder Tage bedeutete. Sieht aus wie es 10-15 Minuten ist. Sie können dies sehen, wenn Sie den Status Ihres ES überprüfen (grün 'aktiv', wenn das Update abgeschlossen ist, sonst so etwas wie eine orangefarbene 'Vorbereitung'.
Balmipour
Ich hatte das gleiche Problem und nach der Suche fand ich diese handliche Bibliothek .
Gmajivu
6

Ein bisschen spät zur Party, aber ich konnte genau das gleiche Problem lösen, indem ich meinen Anfragen eine Unterschrift hinzufügte.

Wenn Sie Python verwenden (wie ich), können Sie die folgende Bibliothek verwenden, um die Implementierung besonders einfach zu gestalten: https://github.com/DavidMuller/aws-requests-auth

Es hat perfekt für mich funktioniert.

Philippe Oger
quelle
1

Sie müssen nur den vollständigen Benutzernamen in der elastischen Suchrichtlinie angeben.

In diesem Fall können Sie Ihren vollständigen Benutzernamen aus der Fehlermeldung selbst abrufen. In meinem Fall: "arn: aws: sts :: [ACCOUNT_ID]: angenommene Rolle / [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
quelle
0

Sie können entweder eine ressourcenbasierte Richtlinie oder eine identitätsbasierte Richtlinie anstelle einer IP-basierten Richtlinie verwenden, bei der die IP-Adresse fest codiert wird.

Sie müssen jedoch Signature Version 4 verwenden, um die Anforderung zu signieren

Informationen zur Java-Implementierung finden Sie unter http://mytechbites.blogspot.in/2017/04/secure-amazon-elastic-search-service.html

Selvakumar Ponnusamy
quelle
0

Die Rollen-ARN muss geändert werden. es sieht aus wie "arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role"

Kunal
quelle
-2

Ich versuche dies auch und habe es mit der Allow access to the domain from specific IP(s)Option mit der elastischen IP meiner EC2-Instanz zum Laufen gebracht (könnte auch mit der privaten IP der Instanz funktionieren, bin mir aber nicht sicher).

rkrdo
quelle