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_role
Rolle 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?
Antworten:
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.
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:Ich kann über die beiden IPs in der Zugriffsrichtlinie (192.168.1.0 und 192.168.1.1) auf Kibana zugreifen.
quelle
aws:SourceIp
in 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.aws:SourceIp
von 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.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!
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.
quelle
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.
quelle
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]"
quelle
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
quelle
Die Rollen-ARN muss geändert werden. es sieht aus wie "arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role"
quelle
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).quelle