Política de acceso adecuado para Amazon Elastic Search Cluster

99

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_rolerol 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?

Hartfordfive
fuente
14
Tenga cuidado, los cambios en la política de acceso de ElasticSearch tardan mucho en aplicarse, a diferencia de otros cambios de IAM que son casi instantáneos. Es fácil hacer clic en "aplicar" y cambiar de pestaña sin notar el "Procesando ..."
Cyril Duchon-Doris

Respuestas:

63

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.

{
  "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"
          ]
        }
      }
    }
  ]
}

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:

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

Puedo acceder a Kibana desde las dos direcciones IP en la política de acceso (192.168.1.0 y 192.168.1.1).

Pete
fuente
Hola, solo necesita usar el complemento si está usando una política basada en IAM. Puede utilizar el complemento estándar de elasticsearch en Logstash si su política de acceso se basa en direcciones IP. En ese caso, tampoco necesita un perfil de instancia. Además, el servicio ES no está disponible en VPC. Tienes que usar direcciones IP públicas para conectarte. No estoy seguro si sus referencias a las direcciones 192.168 son sustituciones de otra cosa, pero pueden inducir a error.
Garreth McDaid
Los aws:SourceIpde 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.
Pete
1
Vale la pena señalar que la limitación al rango de CIDR de IP privada de su VPC no parece funcionar. ES no funciona dentro de la VPC o algo así.
sventechie
Gracias por dar un ejemplo de política en su respuesta; No había podido hacer que Kibana superara el temido error "Usuario: anónimo" hasta que cambié aws:SourceIpde 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.
Robert Calhoun
38

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!

Los clientes estándar, como curl, no pueden realizar la firma de solicitudes que se requiere para las políticas de acceso basadas en identidad. Debe utilizar una política de acceso basada en direcciones IP que permita el acceso anónimo para realizar correctamente las instrucciones de este paso. ( http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html )

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.

Olivier
fuente
3
Usé la dirección IP pública de mi computadora portátil e intenté acceder al punto final con curl / browser, pero sigo recibiendo el error User: anonymous.
Anant Gupta
7
estoy lidiando con el mismo problema. y he notado que procesar los cambios mediante aws elasticsearch lleva mucho tiempo.
nemo
Establezca una política de acceso con dos declaraciones: una para el acceso de IAM para escribir registros, la otra con acceso restringido por IP para ver KIbana. Vea mi respuesta para más detalles
Pete
2
Me preguntaba si "muuuucho" significaba minutos, horas o días. Parece que son 10-15 minutos. Puede ver eso al verificar el estado de su ES (verde 'activo' si la actualización está completa, de lo contrario, algo así como una naranja 'preparando'.
Balmipour
Tuve el mismo problema y después de buscar encontré esta práctica biblioteca .
gmajivu
6

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í.

Philippe Oger
fuente
1

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]"

    {
        "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
fuente
0

Es necesario cambiar el ARN del rol. se verá como "arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role"

Kunal
fuente
-2

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)

rkrdo
fuente