Recientemente comencé a usar el nuevo Amazon Elasticsearch Service y parece que no puedo averiguar la política de acceso que necesito para poder acceder solo a los servicios desde mis instancias EC2 que tienen un rol de IAM específico asignado.
A continuación, se muestra un ejemplo de la política de acceso que he asignado actualmente para el dominio 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]/*"
}
]
}
Pero como dije, esto no funciona. Entro en la instancia EC2 (que tiene el my_es_role
rol adjunto) e intento ejecutar una simple llamada curl en el punto final "https: //*.es.amazonaws.com", obtengo el siguiente error:
{"Mensaje": "Usuario: anónimo no está autorizado para realizar: es: ESHttpGet en recurso: arn: aws: es: us-east-1: [ACCOUNT_ID]: dominio / [ES_DOMAIN] /“}
¿Alguien sabe qué tengo que cambiar en la política de acceso para que esto funcione?
Respuestas:
Puede bloquear el acceso solo a IAM, pero ¿cómo verá Kibana en su navegador? Puede configurar un proxy ( consulte el módulo Gist y / o NPM ) o habilitar el acceso basado en IAM y IP para ver los resultados.
Pude obtener acceso restringido por IP de acceso IAM con la siguiente Política de acceso. Tenga en cuenta que el orden es importante: no pude hacerlo funcionar con la declaración basada en IP antes de la declaración de IAM.
Mi instancia EC2 tiene un perfil de instancia con la
arn:aws:iam::aws:policy/AmazonESFullAccess
política. Logstash debe firmar las solicitudes con el complemento de salida logstash-output-amazon-es . Logstash que se ejecuta en mi instancia EC2 incluye una sección de salida como esta:Puedo acceder a Kibana desde las dos direcciones IP en la política de acceso (192.168.1.0 y 192.168.1.1).
fuente
aws:SourceIp
de mi ejemplo están pensados para ser la IP de su estación de trabajo personal para que pueda usar Kibana. El acceso restringido de IAM permite que una o más instancias EC2 escriban en Elasticsearch sin preocuparse por las direcciones IP que pertenecen a una instancia particular o bloque CIDR.aws:SourceIp
de un valor escalar a una matriz, como en el ejemplo que dio. (Soy notación CIDR, si eso ayuda a alguien más). Todo el proceso de establecimiento de políticas para AWS ES sería menos frustrante si cada cambio de política no pusiera al clúster en el misterioso estado de "procesamiento" durante 20 minutos como la política está cuidadosamente inscrita en tablas de piedra, o lo que sea que estén haciendo.De acuerdo con el documento de AWS y como usted (y yo) acabamos de probar, no puede restringir el acceso a un dominio de AWS ES a un rol / cuenta / usuario / ... y simplemente ¡CURL!
Entonces tienes básicamente dos soluciones:
Firmar su solicitud es probablemente la mejor solución si desea mantener su política de acceso como está (que es más flexible que restringir a una IP), pero parece ser un poco más complejo. No lo he probado hasta ahora y no puedo encontrar ningún documento que me ayude.
fuente
Un poco tarde para la fiesta, pero pude lidiar exactamente con el mismo problema agregando una firma a mis solicitudes.
Si usa Python (como yo), puede usar la siguiente biblioteca para que sea particularmente fácil de implementar: https://github.com/DavidMuller/aws-requests-auth
Funcionó perfectamente para mí.
fuente
Solo necesita el nombre de usuario completo en la política de búsqueda elástica.
En este caso, puede obtener su nombre de usuario completo en el mensaje de error. En mi caso: "arn: aws: sts :: [ACCOUNT_ID]: función asumida / [LAMBDA_POLICY_NAME] / [LAMBDA_NAME]"
fuente
Puede utilizar una política basada en recursos o una política basada en identidad en lugar de una política basada en IP, que es como codificar la dirección IP.
Pero necesita usar Signature versión 4 para firmar la solicitud
Para la implementación de Java, consulte http://mytechbites.blogspot.in/2017/04/secure-amazon-elastic-search-service.html
fuente
Es necesario cambiar el ARN del rol. se verá como "arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role"
fuente
También estoy tratando de hacer esto, y lo hice funcionar usando la
Allow access to the domain from specific IP(s)
opción con la IP elástica de mi instancia EC2 (también podría funcionar usando la IP privada de la instancia, pero no estoy muy seguro)fuente