web-dev-qa-db-fra.com

Stratégie d'accès appropriée pour Amazon Elasticsearch Cluster

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

Voici un exemple de la politique d'accès que j'ai actuellement assignée au 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 (à laquelle est associé le rôle my_es_role) et tente d'exécuter un simple appel curl sur le noeud final "https: //*.es.amazonaws.com". J'obtiens le message d'erreur suivant:

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

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

88
hartfordfive

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

J'ai pu obtenir un accès IAM d'accès restreint à l'accès IAM avec la stratégie d'accès suivante. Notez que l'ordre est important: je ne pouvais pas le faire fonctionner avec l'instruction basée sur 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 le code arn:aws:iam::aws:policy/AmazonESFullAccess Logstash doit signer les demandes à l'aide du plugin de sortie logstash-output-Amazon-es . Logstash s'exécutant sur mon instance EC2 inclut 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 de la politique d'accès (192.168.1.0 et 192.168.1.1).

55
Pete

Selon la documentation AWS et comme vous (et moi-même) venons de 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 requête requise par les stratégies d'accès basées sur une identité. Vous devez utiliser une stratégie d'accès basée sur une adresse IP permettant à l'accès anonyme d'exécuter correctement les instructions pour cette étape . ( http://docs.aws.Amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html )

Donc, vous avez essentiellement deux solutions:

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

36
Olivier

Un peu tard pour le parti, 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 fonctionné parfaitement pour moi. 

5
Philippe Oger

Vous pouvez utiliser une stratégie basée sur les ressources ou une stratégie basée sur l'identité plutôt que la stratégie basée sur IP, qui ressemble au codage en dur de l'adresse IP.

Mais vous devez utiliser Signature version 4 pour signer la demande.

Pour l'implémentation en Java, veuillez consulter http://mytechbites.blogspot.fr 2017/04/secure-Amazon-elastic-search-service.html

0