2016-06-07 19 views
7

Tôi đang cố gắng sử dụng Elasticsearch để lưu trữ dữ liệu cho một hàm Lambda được kết nối với Bộ kỹ năng Alexa. Lambda hoạt động hoàn toàn không có Elasticsearch nhưng ES cung cấp kết hợp mờ rất cần thiết.Quyền truy cập ElasticSearch từ Lambda?

Cách duy nhất tôi có thể truy cập từ Lambda là bật truy cập toàn cầu của Elasticsearch nhưng đó thực sự là một ý tưởng tồi. Tôi cũng có thể truy cập từ máy tính của mình thông qua chính sách truy cập mở hoặc chính sách địa chỉ IP. Có cách nào để truy cập chỉ đọc thông qua Lambda và đọc-ghi qua IP?

Vào IAM, tôi đã cấp vai trò Lambda của mình AmazonESReadOnlyAccess. Về phía ES tôi đã thử điều này nhưng nó chỉ làm việc cho địa chỉ 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 này hỏi cùng một câu hỏi nhưng không được trả lời.

Trả lời

6

Cách duy nhất tôi biết để làm điều này là sử dụng chính sách dựa trên tài nguyên hoặc chính sách dựa trên IAM trên miền ES của bạn. Điều này sẽ hạn chế quyền truy cập vào một người dùng hoặc vai trò IAM cụ thể. Tuy nhiên, để thực hiện công việc này, bạn cũng cần phải ký các yêu cầu của bạn với ES bằng cách sử dụng SigV4.

Có thư viện sẽ thực hiện việc ký này cho bạn, ví dụ: this one mở rộng thư viện yêu cầu Python phổ biến để ký yêu cầu tìm kiếm ElasticSearch thông qua SigV4. Tôi tin rằng các thư viện tương tự tồn tại cho các ngôn ngữ khác.

+0

là [này] (https://github.com/DavidMuller/aws-requests- auth) mô-đun bạn ngụ ý? Ngoài ra không thiết lập của tôi nhìn bên phải nếu không cố gắng để làm một lai của IAM và IP? – Keith

+0

Tôi đã cập nhật câu trả lời bằng một liên kết đến dự án mà tôi đang đề cập đến. – garnaat

+0

Ok có những thứ chủ yếu hoạt động ngay bây giờ. Tôi không thể tìm ra cách để làm auth với vai trò Lambda nhưng thay vì sử dụng một người dùng chuyên dụng. Vấn đề duy nhất là tôi không thể truy cập Kibana từ trình duyệt của tôi nữa nhưng đó không phải là một vấn đề lớn. – Keith

0

AWS Lambda chạy trên các phiên bản EC2 công cộng. Vì vậy, việc thêm một danh sách trắng các địa chỉ IP vào chính sách truy cập Elasticsearch sẽ không hoạt động. Một cách để thực hiện điều này là cung cấp cho vai trò thực thi Lambda quyền thích hợp đối với miền Elasticsearch. Đảm bảo rằng vai trò Thực thi Lambda có quyền đối với miền ES và chính sách truy cập miền ES có một tuyên bố cho phép Vai trò Lambda ARN này thực hiện các hành động thích hợp. Một khi điều này được thực hiện tất cả những gì bạn phải làm là ký yêu cầu của bạn thông qua SigV4 trong khi truy cập vào điểm cuối ES

Hy vọng điều đó sẽ hữu ích!

1

Để truy cập từ bên ngoài (bên ngoài AWS) vào cụm Elasticsearch của bạn, bạn muốn tạo cụm với chính sách truy cập dựa trên IP. Một cái gì đó như bên dưới:

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

Đối với hàm Lambda của bạn, hãy tạo vai trò mà hàm Lambda sẽ giả định với đoạn mã chính sách dưới đây.

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

Tôi nghĩ bạn có thể dễ dàng hơn ngưng tụ hai tuyên bố chính sách trên vào như sau:

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

tôi quản lý để mảnh ở trên với nhau từ các nguồn sau đây:

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

Bạn cần phải đi đến các chính sách truy cập của Lambda và cung cấp AWS ARN để kết nối

http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-aws-integrations.html#es-aws-integrations-s3-lambda-es-authorizations

+0

Đối với các truy vấn đối với API tài liệu ElasticSearch, điều này sẽ không hoạt động "ngoài hộp". Yêu cầu HTTP được thực hiện với mô-đun HTTP client của ngôn ngữ của bạn sẽ không có chữ ký yêu cầu AWS V4 và sẽ được coi là đến từ một người dùng ẩn danh. Bạn cần ký một cách rõ ràng các yêu cầu HTTP của bạn với chữ ký AWS để có vai trò chủ định thực hiện. – GrandOpener

Các vấn đề liên quan