2016-06-07 13 views
7

Sto provando a utilizzare Elasticsearch per l'archiviazione dei dati per una funzione Lambda collegata a Alexa Skills Kit. La Lambda funziona bene senza Elasticsearch ma ES fornisce una corrispondenza fuzzy tanto necessaria.Autorizzazioni per accedere a ElasticSearch da Lambda?

L'unico modo in cui sono riuscito ad accedervi da Lambda è abilitando l'accesso globale a Elasticsearch, ma questa è una pessima idea. Sono anche stato in grado di accedere dal mio computer tramite criteri di accesso aperto o criteri di indirizzo IP. C'è un modo per fare l'accesso in sola lettura tramite Lambda e leggere e scrivere tramite IP?

Su IAM ho concesso il mio ruolo Lambda AmazonESReadOnlyAccess. Sul lato ES Ho provato questo ma ha funzionato solo per l'indirizzo IP:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": [ 
      "arn:aws:iam::NUMBER:root", 
      "arn:aws:iam::NUMBER:role/lambda_basic_execution" 
     ] 
     }, 
     "Action": "es:*", 
     "Resource": "arn:aws:es:us-east-1:NUMBER:domain/NAME/*" 
    }, 
    { 
     "Sid": "", 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": "*" 
     }, 
     "Action": "es:*", 
     "Resource": "arn:aws:es:us-east-1:NUMBER:domain/NAME/*", 
     "Condition": { 
     "IpAddress": { 
      "aws:SourceIp": "MY IP" 
     } 
     } 
    } 
    ] 
} 

Questa forum post chiede la stessa domanda, ma è rimasta senza risposta.

risposta

6

L'unico modo per farlo è utilizzare una politica basata sulle risorse o una politica basata su IAM sul dominio ES. Ciò limiterebbe l'accesso a un particolare utente o ruolo IAM. Tuttavia, per fare questo lavoro devi anche firmare le tue richieste a ES usando SigV4.

Ci sono librerie che faranno questa firma per voi, per esempio this one estende la popolare libreria di richieste Python per firmare richieste ElasticSearch via SigV4. Credo che esistano librerie simili per altre lingue.

+0

Is [questo] (https://github.com/DavidMuller/aws-requests- auth) il modulo che intendi? Inoltre, il mio setup sembra giusto altrimenti per provare a fare un ibrido di IAM e IP? – Keith

+0

Ho aggiornato la risposta con un collegamento al progetto a cui mi riferivo. – garnaat

+0

Ok le cose funzionano per lo più adesso. Non riuscivo a capire un modo per fare l'autenticazione con il ruolo Lambda, ma invece utilizzavo un utente dedicato. L'unico problema è che non riesco più ad accedere a Kibana dal mio browser, ma non è un grosso problema. – Keith

0

AWS Lambda funziona su istanze pubbliche EC2. Quindi semplicemente aggiungere una whitelist di indirizzi IP al criterio di accesso di Elasticsearch non funzionerà. Un modo per farlo sarà dare al ruolo di esecuzione di Lambda le autorizzazioni appropriate per il dominio Elasticsearch. Assicurarsi che il ruolo di esecuzione di Lambda disponga delle autorizzazioni per il dominio ES e che il criterio di accesso al dominio ES abbia un'istruzione che consenta a questo ruolo Lambda ARN di eseguire le azioni appropriate. Una volta fatto tutto ciò che dovresti fare è firmare la tua richiesta tramite SigV4 mentre accedi all'endpoint ES

Speranza che aiuti!

1

Per l'accesso esterno (esterno AWS) al cluster Elasticsearch, si desidera creare il cluster con un criterio di accesso basato su IP. Qualcosa come il qui sotto:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Sid": "", 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": "*" 
     }, 
     "Action": "es:*", 
     "Condition": { 
     "IpAddress": { 
      "aws:SourceIp": [ 
      "<<IP/CIDR>>" 
      ] 
     } 
     }, 
     "Resource": "arn:aws:es:<<REGION>>:<<ACCOUNTID>>:domain/<<DOMAIN_NAME>>/*" 
    } 
    ] 
} 

Per la vostra funzione lambda, creare il ruolo che la funzione lambda assumerà con lo snippet politica di seguito.

{ 
    "Sid": "", 
    "Effect": "Allow", 
    "Action": [ 
    "es:DescribeElasticsearchDomain", 
    "es:DescribeElasticsearchDomains", 
    "es:DescribeElasticsearchDomainConfig", 
    "es:ESHttpPost", 
    "es:ESHttpPut" 
    ], 
    "Resource": [ 
    "arn:aws:es:<<REGION>>:<<ACCOUNTID>>:domain/<<DOMAIN_NAME>>", 
    "arn:aws:es:<<REGION>>:<<ACCOUNTID>>:domain/<<DOMAIN_NAME>>/*" 
    ] 
}, 
{ 
    "Sid": "", 
    "Effect": "Allow", 
    "Action": [ 
    "es:ESHttpGet" 
    ], 
    "Resource": [ 
    "arn:aws:es:<<REGION>>:<<ACCOUNTID>>:domain/<<DOMAIN_NAME>>/_all/_settings", 
    "arn:aws:es:<<REGION>>:<<ACCOUNTID>>:domain/<<DOMAIN_NAME>>/_cluster/stats", 
    "arn:aws:es:<<REGION>>:<<ACCOUNTID>>:domain/<<DOMAIN_NAME>>/<<INDEX>>*/_mapping/<<TYPE>>", 
    "arn:aws:es:<<REGION>>:<<ACCOUNTID>>:domain/<<DOMAIN_NAME>>/_nodes", 
    "arn:aws:es:<<REGION>>:<<ACCOUNTID>>:domain/<<DOMAIN_NAME>>/_nodes/stats", 
    "arn:aws:es:<<REGION>>:<<ACCOUNTID>>:domain/<<DOMAIN_NAME>>/_nodes/*/stats", 
    "arn:aws:es:<<REGION>>:<<ACCOUNTID>>:domain/<<DOMAIN_NAME>>/_stats", 
    "arn:aws:es:<<REGION>>:<<ACCOUNTID>>:domain/<<DOMAIN_NAME>>/<<INDEX>>*/_stats" 
    ] 
} 

Penso che si potrebbe più facilmente condensare queste due dichiarazioni politiche nelle seguenti:

{ 
    "Sid": "", 
    "Effect": "Allow", 
    "Action": [ 
    "es:DescribeElasticsearchDomain", 
    "es:DescribeElasticsearchDomains", 
    "es:DescribeElasticsearchDomainConfig", 
    "es:ESHttpPost", 
    "es:ESHttpGet", 
    "es:ESHttpPut" 
    ], 
    "Resource": [ 
    "arn:aws:es:<<REGION>>:<<ACCOUNTID>>:domain/<<DOMAIN_NAME>>", 
    "arn:aws:es:<<REGION>>:<<ACCOUNTID>>:domain/<<DOMAIN_NAME>>/*" 
    ] 
} 

sono riuscito a mettere sopra insieme dalle seguenti fonti:

https://aws.amazon.com/blogs/security/how-to-control-access-to-your-amazon-elasticsearch-service-domain/

How to access Kibana from Amazon elasticsearch service?

https://forums.aws.amazon.com/thread.jspa?threadID=217149

2
+0

Per le query sull'API del documento ElasticSearch, questo non funzionerà "immediatamente". Le richieste HTTP eseguite con il modulo client HTTP della tua lingua non avranno la firma della richiesta AWS V4 e verranno considerate come provenienti da un utente anonimo. È necessario firmare in modo esplicito le richieste HTTP con una firma AWS per portare a termine il ruolo previsto. – GrandOpener