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_role
rô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?
Réponses:
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.
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: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).
la source
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.aws:SourceIp
d'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.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!
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.
la source
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.
la source
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]"
la source
Vous pouvez utiliser une politique basée sur les ressources ou une politique basée sur l'identité plutôt qu'une politique basée sur IP, ce qui revient à coder en dur l'adresse IP.
Mais vous devez utiliser Signature version 4 pour signer la demande
Pour l'implémentation Java, veuillez consulter http://mytechbites.blogspot.in/2017/04/secure-amazon-elastic-search-service.html
la source
Le rôle ARN doit être modifié. cela ressemblera à "arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role"
la source
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)la source