2016-06-07 33 views
7

我試圖將Elasticsearch用於連接到Alexa Skills Kit的Lambda函數的數據存儲。 Lambda沒有Elasticsearch工作正常,但ES提供了非常需要的模糊匹配。從Lambda訪問ElasticSearch的權限?

我能夠從Lambda訪問它的唯一方法是通過啓用Elasticsearch全局訪問,但這是一個非常糟糕的主意。我也可以通過開放訪問策略或IP地址策略從我的計算機訪問。有沒有辦法通過Lambda進行只讀訪問並通過IP進行讀寫?

在IAM上,我授予了我的Lambda角色AmazonESReadOnlyAccess。 ES端我試過,但它只是工作的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" 
     } 
     } 
    } 
    ] 
} 

forum post問同樣的問題,但無人接聽。

回答

6

我知道這樣做的唯一方法是在您的ES域上使用基於資源的策略或基於IAM的策略。這將限制對特定IAM用戶或角色的訪問。但是,要完成這項工作,您還需要使用SigV4將您的請求籤名到ES。

有些庫會爲您簽名,例如this one擴展了流行的Python請求庫,以通過SigV4對ElasticSearch請求進行簽名。我相信其他語言也存在類似的庫。

+0

是[這](https://github.com/DavidMuller/aws-requests- auth)你說的模塊?另外我的設置看起來不錯,否則試圖做一個IAM和IP的混合? – Keith

+0

我用我指的項目的鏈接更新了答案。 – garnaat

+0

好吧,現在大多數人都在工作。我無法弄清楚如何使用Lambda角色進行身份驗證,而是使用了專用用戶。唯一的問題是我無法再從我的瀏覽器訪問Kibana,但這並不是什麼大問題。 – Keith

0

AWS Lambda在公共EC2實例上運行。因此,簡單地將IP地址白名單添加到Elasticsearch訪問策略將不起作用。一種方法是爲Lambda執行角色授予對Elasticsearch域的適當權限。確保Lambda執行角色具有對ES域的許可權,並且ES域訪問策略具有允許此Lambda角色ARN執行相應操作的語句。完成此操作後,您只需通過SigV4在訪問ES端點時簽署您的請求

希望有所幫助!

1

對於您的Elasticsearch集羣的外部(AWS外部)訪問,您希望使用基於IP的訪問策略創建集羣。喜歡的東西下面:

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

爲了您的lambda表達式,創建lambda函數將與以下政策片段承擔該角色。

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

我覺得你可以更容易凝結在上面的兩個政策聲明爲以下:

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

我設法從下列來源拼湊以上:

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

對於ElasticSearch文檔API的查詢,這不會「開箱即用」。使用您的語言的HTTP客戶端模塊進行的HTTP請求將不具有AWS V4請求籤名,並且將被視爲來自匿名用戶。您需要使用AWS簽名明確簽名您的HTTP請求才能實現預期角色。 – GrandOpener