Recentemente, comecei a usar o novo Amazon Elasticsearch Service e não consigo descobrir a política de acesso de que preciso para poder acessar apenas os serviços de minhas instâncias EC2 que têm uma função IAM específica atribuída a elas.
Aqui está um exemplo da política de acesso que atualmente atribuí para o domínio 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]/*"
}
]
}
Mas, como eu disse, isso não funciona. Eu entro na instância EC2 (que tem a my_es_role
função anexada a ela) e tento executar uma chamada curl simples no ponto de extremidade "https: //*.es.amazonaws.com", recebo o seguinte erro:
{"Message": "Usuário: anonymous não está autorizado a executar: es: ESHttpGet no recurso: arn: aws: es: us-east-1: [ACCOUNT_ID]: domain / [ES_DOMAIN] /“}
Alguém sabe o que tenho que mudar na política de acesso para que funcione?
Respostas:
Você pode bloquear o acesso apenas ao IAM, mas como verá o Kibana em seu navegador? Você pode configurar um proxy ( consulte o módulo Gist e / ou NPM ) ou habilitar o IAM e o acesso baseado em IP para visualizar os resultados.
Consegui obter acesso restrito por IP de acesso IAM com a seguinte Política de Acesso. Observe que a ordem é importante: não consegui fazê-lo funcionar com a instrução baseada em IP antes da instrução IAM.
Minha instância EC2 tem um perfil de instância com a
arn:aws:iam::aws:policy/AmazonESFullAccess
política. Logstash deve assinar solicitações usando o plugin de saída logstash-output-amazon-es . O Logstash em execução na minha instância EC2 inclui uma seção de saída como esta:Posso acessar o Kibana a partir dos dois IPs da política de acesso (192.168.1.0 e 192.168.1.1).
fonte
aws:SourceIp
's no meu exemplo destinam-se a ser o IP da sua estação de trabalho pessoal para que você possa usar o Kibana. O acesso restrito ao IAM permite que uma ou mais instâncias do EC2 gravem no Elasticsearch sem se preocupar com quais IPs pertencem a uma determinada instância ou bloco CIDR.aws:SourceIp
de um valor escalar para um array, como no exemplo que você deu. (Sou a notação CIDR, se isso ajudar mais alguém.) Todo o processo de definição de políticas para AWS ES seria menos frustrante se cada mudança de política não colocasse o cluster no misterioso estado de "processamento" por 20 minutos, como a apólice está cuidadosamente inscrita em tábuas de pedra, ou o que quer que estejam fazendo.De acordo com o documento da AWS e como você (e eu) acabamos de testar, você não pode restringir o acesso a um domínio AWS ES a uma função / conta / usuário / ... e simplesmente CURL-lo!
Portanto, você tem basicamente duas soluções:
Assinar sua solicitação é provavelmente a melhor solução se você deseja manter sua política de acesso como está (que é mais flexível do que restringir a um IP), mas parece ser um pouco mais complexo. Ainda não tentei e não consigo encontrar nenhum médico para ajudar.
fonte
Um pouco tarde para a festa, mas fui capaz de lidar exatamente com o mesmo problema adicionando assinatura às minhas solicitações.
Se você usa Python (como eu), pode usar a seguinte biblioteca para torná-la particularmente fácil de implementar: https://github.com/DavidMuller/aws-requests-auth
Funcionou perfeitamente para mim.
fonte
Você só precisa inserir o nome de usuário completo na política de pesquisa elástica.
Nesse caso, você pode obter seu nome de usuário completo na própria mensagem de erro. No meu caso: "arn: aws: sts :: [ACCOUNT_ID]: papel assumido / [LAMBDA_POLICY_NAME] / [LAMBDA_NAME]"
fonte
Você pode usar uma política baseada em recursos ou uma política baseada em identidade em vez de uma política baseada em IP, que é como codificar o endereço IP.
Mas você precisa usar a versão 4 da assinatura para assinar a solicitação
Para implementação Java, consulte http://mytechbites.blogspot.in/2017/04/secure-amazon-elastic-search-service.html
fonte
A função ARN precisa ser alterada. será semelhante a "arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role"
fonte
Também estou tentando fazer isso e consegui fazer funcionar usando a
Allow access to the domain from specific IP(s)
opção com o Elastic IP da minha instância EC2 (também poderia funcionar usando o IP privado da instância, mas não tenho certeza)fonte