Politique d'accès appropriée pour Amazon Elastic Search Cluster

99

J'ai récemment commencé à utiliser le nouveau service Amazon Elasticsearch et je n'arrive pas à comprendre la politique d'accès dont j'ai besoin pour ne pouvoir accéder qu'aux services de mes instances EC2 auxquelles un rôle IAM spécifique leur est attribué.

Voici un exemple de la politique d'accès que j'ai actuellement attribuée pour le domaine 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]/*"
    }
  ]
}

Mais comme je l'ai dit, cela ne fonctionne pas. Je me connecte à l'instance EC2 (qui a le my_es_rolerôle qui lui est attaché) et tente d'exécuter un simple appel curl sur le point final "https: //*.es.amazonaws.com", j'obtiens l'erreur suivante:

{"Message": "Utilisateur: anonyme n'est pas autorisé à effectuer: es: ESHttpGet sur la ressource: arn: aws: es: us-east-1: [ACCOUNT_ID]: domain / [ES_DOMAIN] /"}

Quelqu'un sait-il ce que je dois changer dans la politique d'accès pour que cela fonctionne?

Hartfordfive
la source
14
Attention, les modifications de la stratégie d'accès ElasticSearch prennent du temps à s'appliquer, contrairement aux autres modifications IAM qui sont presque instantanées. Il est facile de cliquer simplement sur "appliquer" et de changer d'onglet sans remarquer le "Traitement ..."
Cyril Duchon-Doris

Réponses:

63

Vous pouvez verrouiller l'accès à IAM uniquement, mais comment allez-vous afficher Kibana dans votre navigateur? Vous pouvez configurer un proxy ( voir module Gist et / ou NPM ) ou activer à la fois l'accès IAM et IP pour afficher les résultats.

J'ai pu obtenir à la fois un accès IP restreint à IAM avec la politique d'accès suivante. Notez que l'ordre est important: je n'ai pas pu le faire fonctionner avec l'instruction IP avant l'instruction 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"
          ]
        }
      }
    }
  ]
}

Mon instance EC2 a un profil d'instance avec la arn:aws:iam::aws:policy/AmazonESFullAccess stratégie. Logstash doit signer les demandes à l'aide du plugin de sortie logstash-output-amazon-es . Logstash s'exécutant sur mon instance EC2 comprend une section de sortie comme celle-ci:

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

Je peux accéder à Kibana à partir des deux adresses IP dans la politique d'accès (192.168.1.0 et 192.168.1.1).

Pete
la source
Bonjour, vous ne devez utiliser le plug-in que si vous utilisez une stratégie basée sur IAM. Vous pouvez utiliser le plug-in elasticsearch standard dans Logstash si votre politique d'accès est basée sur des adresses IP. Vous n'avez pas non plus besoin d'un profil d'instance dans ce cas. De plus, le service ES n'est pas disponible dans les VPC. Vous devez utiliser des adresses IP publiques pour vous connecter. Je ne sais pas si vos références à 192.168 adresses sont des substitutions à autre chose, mais peuvent induire en erreur.
Garreth McDaid
Les aws:SourceIp's dans mon exemple sont destinés à être l'adresse IP de votre poste de travail personnel afin que vous puissiez utiliser Kibana. L'accès restreint IAM permet à une ou plusieurs instances EC2 d'écrire dans Elasticsearch sans se soucier des adresses IP appartenant à une instance ou à un bloc CIDR particulier.
Pete
1
Il est à noter que la limitation à la plage CIDR IP privée de votre VPC ne semble pas fonctionner. ES ne fonctionne pas dans le VPC ou quelque chose comme ça.
sventechie
Merci de donner un exemple de politique dans votre réponse; J'avais été incapable de faire passer Kibana au-delà de la redoutable erreur "Utilisateur: anonyme" jusqu'à ce que je passe aws:SourceIpd'une valeur scalaire à un tableau, comme dans l'exemple que vous avez donné. (Je suis la notation CIDR, si cela aide quelqu'un d'autre.) L'ensemble du processus de définition des stratégies pour AWS ES serait moins frustrant si chaque changement de stratégie ne mettait pas le cluster dans l'état mystérieux de "traitement" pendant 20 minutes. la politique est soigneusement inscrite sur des tablettes de pierre, ou quoi que ce soit qu'ils font.
Robert Calhoun
38

Selon le document AWS et comme vous (et moi) venons de le tester, vous ne pouvez pas restreindre l'accès à un domaine AWS ES à un rôle / compte / utilisateur / ... et simplement le cURL!

Les clients standard, tels que curl, ne peuvent pas effectuer la signature de demande requise pour les stratégies d'accès basées sur l'identité. Vous devez utiliser une stratégie d'accès basée sur l'adresse IP qui autorise l'accès anonyme pour exécuter avec succès les instructions de cette étape. ( http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html )

Vous avez donc essentiellement deux solutions:

Signer votre demande est probablement la meilleure solution si vous souhaitez conserver votre politique d'accès telle quelle (ce qui est plus flexible que de se limiter à une adresse IP), mais cela semble être un peu plus complexe. Je n'ai pas essayé jusqu'à présent et je ne trouve aucun doc pour vous aider.

Olivier
la source
3
J'ai utilisé l'adresse IP publique de mon ordinateur portable et essayé d'accéder au point de terminaison avec curl / browser, mais j'obtiens toujours l'erreur User: anonymous.
Anant Gupta
7
je suis confronté au même problème. et j'ai remarqué que le traitement des modifications par aws elasticsearch prend beaucoup de temps.
nemo
Définissez une stratégie d'accès avec deux instructions: une pour l'accès IAM pour écrire les journaux, l'autre avec un accès IP restreint pour afficher KIbana. Voir ma réponse pour plus de détails
Pete
2
Je me suis demandé si «loooong» signifiait des minutes, des heures ou des jours. On dirait que ses 10-15 minutes. Vous pouvez le voir lors de la vérification de l'état de votre ES (vert 'actif' si la mise à jour est terminée, sinon, quelque chose comme une 'préparation' orange.
Balmipour
J'ai eu le même problème et après avoir cherché, j'ai trouvé cette bibliothèque pratique .
gmajivu
6

Un peu tard à la fête, mais j'ai pu régler exactement le même problème en ajoutant une signature à mes demandes.

Si vous utilisez Python (comme moi), vous pouvez utiliser la bibliothèque suivante pour la rendre particulièrement facile à implémenter: https://github.com/DavidMuller/aws-requests-auth

Cela a parfaitement fonctionné pour moi.

Philippe Oger
la source
1

Vous avez juste besoin du nom d'utilisateur complet dans la politique de recherche élastique.

Dans ce cas, vous pouvez obtenir votre nom d'utilisateur complet à partir du message d'erreur lui-même. Dans mon cas: "arn: aws: sts :: [ACCOUNT_ID]: assume-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]/*"
        }
      ]

    }
Oguz
la source
0

Le rôle ARN doit être modifié. cela ressemblera à "arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role"

Kunal
la source
-2

J'essaie également de faire cela, et je l'ai fait fonctionner en utilisant le Allow access to the domain from specific IP(s) option avec l'adresse IP Elastic de mon instance EC2 (pourrait également fonctionner en utilisant l'adresse IP privée de l'instance, mais je ne suis pas trop sûr)

rkrdo
la source