it-swarm.com.de

Richtige Zugriffsrichtlinie für Amazon Elasticsearch Cluster

Ich habe vor kurzem mit dem neuen Amazon Elasticsearch Service begonnen und kann die erforderliche Zugriffsrichtlinie nicht ermitteln, sodass ich nur auf die Services von meinen EC2-Instanzen 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 geht nicht. Ich melde mich bei der EC2-Instanz an (mit der my_es_role-Rolle verbunden) und versuche, einen einfachen Curl-Aufruf am Endpunkt "https: //*.es.amazonaws.com" auszuführen. Ich erhalte die folgende Fehlermeldung:

{"Message": "Benutzer: anonym ist nicht berechtigt, Folgendes auszuführen: es: ESHttpGet auf Ressource: arn: aws: es: us-east-1: [ACCOUNT_ID]: Domäne/[ES_DOMAIN] /"}

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

88
hartfordfive

Sie können den Zugriff nur auf IAM beschränken, aber wie sehen Sie Kibana in Ihrem Browser? Sie können einen Proxy einrichten ( siehe Gist und/oder NPM-Modul ) oder sowohl IAM- als auch IP-basierten Zugriff für die Anzeige der Ergebnisse aktivieren.

Mit der folgenden Zugriffsrichtlinie konnte ich beide IP-Zugangsberechtigungen für den IAM erhalten. Beachten Sie, dass die Reihenfolge wichtig ist: Ich konnte es 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 hat ein Instanzprofil mit der Richtlinie arn:aws:iam::aws:policy/AmazonESFullAccess Logstash sollte Anforderungen mit dem logstash-output-Amazon-es-Ausgabe-Plugin signieren. Logstash, der auf meiner EC2-Instanz ausgeführt wird, enthält einen Ausgabeabschnitt wie folgt:

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 von den beiden IPs in der Zugriffsrichtlinie (192.168.1.0 und 192.168.1.1) auf Kibana zugreifen.

55
Pete

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 einfach CURL it!

Standardclients wie curl können die Anforderungssignatur nicht ausführen, die für identitätsbasierte Zugriffsrichtlinien erforderlich ist. Sie müssen eine auf IP-Adressen basierende Zugriffsrichtlinie verwenden, die den anonymen Zugriff zulässt, um 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 beibehalten möchten (was flexibler ist als die Beschränkung auf eine IP-Adresse), aber es scheint etwas komplexer zu sein. Ich habe es noch nicht probiert und kann keine Hilfe finden. 

36
Olivier

Ein bisschen zu spät zur Party, aber ich konnte mich mit dem gleichen Problem befassen, indem ich meinen Anfragen 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. 

5
Philippe Oger

Sie können entweder eine ressourcenbasierte Richtlinie oder eine identitätsbasierte Richtlinie anstelle einer IP-basierten Richtlinie verwenden, die einer harten Codierung der IP-Adresse ähnelt.

Sie müssen jedoch die Signaturversion 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