Politica di accesso adeguata per Amazon Elastic Search Cluster


99

Recentemente ho iniziato a utilizzare il nuovo Amazon Elasticsearch Service e non riesco a capire la policy di accesso di cui ho bisogno in modo da poter accedere solo ai servizi dalle mie istanze EC2 a cui è assegnato un ruolo IAM specifico.

Ecco un esempio della politica di accesso che attualmente ho assegnato per il 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]/*"
    }
  ]
}

Ma come ho detto, questo non funziona. Accedo all'istanza EC2 (a cui è my_es_roleassociato il ruolo) e tento di eseguire una semplice chiamata curl sull'endpoint "https: //*.es.amazonaws.com", ottengo il seguente errore:

{"Message": "Utente: anonymous non è autorizzato a eseguire: es: ESHttpGet sulla risorsa: arn: aws: es: us-east-1: [ACCOUNT_ID]: domain / [ES_DOMAIN] /"}

Qualcuno sa cosa devo modificare nella politica di accesso affinché funzioni?


14
Attenzione, le modifiche ai criteri di accesso di ElasticSearch richiedono molto tempo per essere applicate, a differenza di altre modifiche IAM che sono quasi istantanee. È facile fare clic su "Applica" e cambiare scheda senza notare "Elaborazione ..."
Cyril Duchon-Doris

Risposte:


63

Puoi bloccare l'accesso solo a IAM, ma come vedrai Kibana nel tuo browser? È possibile configurare un proxy ( vedere Gist e / o modulo NPM ) o abilitare l'accesso basato su IAM e IP per la visualizzazione dei risultati.

Sono stato in grado di ottenere entrambi gli accessi IAM con accesso limitato a IP con la seguente policy di accesso. Nota che l'ordine è importante: non sono riuscito a farlo funzionare con l'istruzione basata su IP prima dell'istruzione 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"
          ]
        }
      }
    }
  ]
}

La mia istanza EC2 ha un profilo istanza con la arn:aws:iam::aws:policy/AmazonESFullAccess policy. Logstash deve firmare le richieste utilizzando il plug-in di output logstash-output-amazon-es . Logstash in esecuzione sulla mia istanza EC2 include una sezione di output come questa:

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

Posso accedere a Kibana dai due IP nella policy di accesso (192.168.1.0 e 192.168.1.1).


Salve, è necessario utilizzare il plug-in solo se si utilizza una policy basata su IAM. Puoi utilizzare il plug-in elasticsearch standard in Logstash se la tua politica di accesso si basa sugli indirizzi IP. Neanche in questo caso è necessario un profilo di istanza. Inoltre, il servizio ES non è disponibile nei VPC. Devi usare indirizzi IP pubblici per connetterti. Non sono sicuro che i tuoi riferimenti a 192.168 indirizzi sostituiscano qualcos'altro, ma potrebbero trarre in inganno.
Garreth McDaid

Nel aws:SourceIpmio esempio, le s sono intese come l'IP della tua workstation personale, quindi puoi usare Kibana. L'accesso limitato a IAM consente a una o più istanze EC2 di scrivere su Elasticsearch senza preoccuparsi di quali IP appartengono a una particolare istanza o blocco CIDR.
Pete

1
Vale la pena notare che la limitazione all'intervallo CIDR IP privato del VPC non sembra funzionare. ES non funziona all'interno del VPC o qualcosa del genere.
sventechie

Grazie per aver fornito una politica di esempio nella tua risposta; Non sono riuscito a far superare a Kibana il temuto errore "Utente: anonimo" finché non sono passato aws:SourceIpda un valore scalare a un array, come nell'esempio che hai fornito. (Sono la notazione CIDR, se questo aiuta qualcun altro.) L'intero processo di impostazione delle policy per AWS ES sarebbe meno frustrante se ogni singola modifica della policy non mettesse il cluster nel misterioso stato di "elaborazione" per 20 minuti come la politica è accuratamente incisa su tavolette di pietra, o qualunque cosa stiano facendo.
Robert Calhoun

38

Secondo il documento AWS e come tu (ed io) abbiamo appena testato, non puoi limitare l'accesso a un dominio AWS ES a un ruolo / account / utente / ... e semplicemente eseguirne l'URL!

I client standard, come curl, non possono eseguire la firma della richiesta richiesta per i criteri di accesso basati sull'identità. È necessario utilizzare un criterio di accesso basato sull'indirizzo IP che consenta l'accesso anonimo per eseguire correttamente le istruzioni per questo passaggio. ( http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html )

Quindi hai fondamentalmente due soluzioni:

La firma della tua richiesta è probabilmente la soluzione migliore se vuoi mantenere la tua politica di accesso così com'è (che è più flessibile della limitazione a un IP), ma sembra essere un po 'più complessa. Finora non ho provato e non riesco a trovare alcun documento che mi aiuti.


3
Ho utilizzato l'indirizzo IP pubblico del mio laptop e ho provato ad accedere all'endpoint con curl / browser, ma ricevo ancora l'errore Utente: anonimo.
Anant Gupta

7
ho a che fare con lo stesso problema. e ho notato che l'elaborazione delle modifiche da parte di aws elasticsearch richiede moltissimo tempo.
nemo

Imposta una policy di accesso con due istruzioni: una per l'accesso IAM per scrivere i log, l'altra con accesso limitato a IP per visualizzare KIbana. Vedi la mia risposta per i dettagli
Pete

2
Mi chiedevo se "moooolto" significasse minuti, ore o giorni. Sembra che siano 10-15 minuti. Puoi vederlo quando controlli lo stato del tuo ES (verde "attivo" se l'aggiornamento è completo, altrimenti, qualcosa come un'arancia "preparazione".
Balmipour

Ho avuto lo stesso problema e dopo aver cercato ho trovato questa comoda libreria .
gmajivu

6

Un po 'in ritardo per la festa, ma sono stato in grado di affrontare lo stesso identico problema aggiungendo la firma alle mie richieste.

Se utilizzi Python (come me), puoi utilizzare la seguente libreria per renderlo particolarmente facile da implementare: https://github.com/DavidMuller/aws-requests-auth

Ha funzionato perfettamente per me.


1

Devi solo inserire il nome utente completo nel criterio di ricerca elastico.

In questo caso, puoi ottenere il tuo nome utente completo dal messaggio di errore stesso. Nel mio caso: "arn: aws: sts :: [ACCOUNT_ID]: assumed-role / [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]/*"
        }
      ]

    }


0

Il ruolo ARN deve essere cambiato. sarà simile a "arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role"


-2

Sto anche provando a farlo e l'ho fatto funzionare utilizzando l' Allow access to the domain from specific IP(s)opzione con l'IP elastico della mia istanza EC2 (potrebbe funzionare anche utilizzando l'IP privato dell'istanza, ma non ne sono troppo sicuro)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.