Chính sách truy cập thích hợp cho Cụm tìm kiếm đàn hồi của Amazon


99

Gần đây tôi đã bắt đầu sử dụng Dịch vụ Amazon Elasticsearch mới và dường như tôi không thể tìm ra chính sách truy cập mà tôi cần để tôi chỉ có thể truy cập các dịch vụ từ các phiên bản EC2 của mình có vai trò IAM cụ thể được chỉ định cho chúng.

Dưới đây là ví dụ về chính sách truy cập mà tôi hiện đã chỉ định cho miền 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]/*"
    }
  ]
}

Nhưng như tôi đã nói, điều này không hiệu quả. Tôi đăng nhập vào phiên bản EC2 (có my_es_rolevai trò gắn liền với nó) và cố gắng chạy một lệnh gọi curl đơn giản trên điểm cuối "https: //*.es.amazonaws.com", tôi gặp lỗi sau:

{"Thông báo": "Người dùng: nặc danh không được phép thực hiện: es: ESHttp Nhận tài nguyên: arn: aws: es: us-west-1: [ACCOUNT_ID]: domain / [ES_DOMAIN] /“}

Có ai biết tôi phải thay đổi những gì trong chính sách truy cập để điều này hoạt động không?


14
Lưu ý, các thay đổi về chính sách truy cập ElasticSearch mất nhiều thời gian để áp dụng, không giống như các thay đổi IAM khác gần như là tức thời. Thật dễ dàng để chỉ cần nhấp vào "áp dụng" và tab chuyển đổi mà không nhận thấy sự "Đang xử lý ..."
Cyril Duchon-Doris

Câu trả lời:


63

Bạn có thể khóa quyền truy cập xuống chỉ IAM, nhưng bạn sẽ xem Kibana trong trình duyệt của mình như thế nào? Bạn có thể thiết lập proxy ( xem Gist và / hoặc mô-đun NPM ) hoặc kích hoạt cả truy cập dựa trên IAM và IP để xem kết quả.

Tôi đã có thể nhận được cả quyền truy cập IP bị hạn chế quyền truy cập IAM bằng Chính sách truy cập sau. Lưu ý rằng thứ tự rất quan trọng: Tôi không thể làm cho nó hoạt động với câu lệnh dựa trên IP trước câu lệnh 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"
          ]
        }
      }
    }
  ]
}

Phiên bản EC2 của tôi có một cấu hình cá thể với arn:aws:iam::aws:policy/AmazonESFullAccess chính sách. Logstash phải ký các yêu cầu bằng cách sử dụng plugin đầu ra logstash-output-amazon-es . Logstash chạy trên phiên bản EC2 của tôi bao gồm một phần đầu ra như sau:

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

Tôi có thể truy cập Kibana từ hai IP trong chính sách truy cập (192.168.1.0 và 192.168.1.1).


Xin chào, bạn chỉ cần sử dụng plugin nếu bạn đang sử dụng chính sách dựa trên IAM. Bạn có thể sử dụng plugin đàn hồi tiêu chuẩn trong Logstash nếu chính sách truy cập của bạn dựa trên địa chỉ IP. Bạn cũng không cần một hồ sơ cá thể trong trường hợp đó. Ngoài ra, dịch vụ ES không có sẵn trong VPC. Bạn phải sử dụng địa chỉ ip công cộng để kết nối. Không chắc liệu các tham chiếu của bạn đến địa chỉ 192.168 có phải là sự thay thế cho thứ gì khác hay không, nhưng có thể gây hiểu lầm.
Garreth McDaid

Trong aws:SourceIpví dụ của tôi, mục đích là IP máy trạm cá nhân của bạn để bạn có thể sử dụng Kibana. Quyền truy cập hạn chế IAM cho phép một hoặc nhiều phiên bản EC2 ghi vào Elasticsearch mà không cần lo lắng về IP nào thuộc về một phiên bản cụ thể hoặc khối CIDR.
Pete

1
Cần lưu ý rằng việc giới hạn phạm vi IP CIDR riêng tư của VPC dường như không hoạt động. ES không hoạt động trong VPC hoặc một cái gì đó.
sventechie

Cảm ơn bạn đã đưa ra một chính sách mẫu trong câu trả lời của bạn; Tôi đã không thể giúp Kibana vượt qua lỗi "Người dùng: ẩn danh" đáng sợ cho đến khi tôi chuyển aws:SourceIptừ giá trị vô hướng sang một mảng, như trong ví dụ bạn đưa ra. (Tôi là ký hiệu CIDR, nếu điều đó giúp ích cho bất kỳ ai khác.) Toàn bộ quá trình thiết lập chính sách cho AWS ES sẽ bớt bực bội hơn nếu mọi thay đổi chính sách không đặt cụm vào trạng thái "xử lý" bí ẩn trong 20 phút như chính sách được ghi cẩn thận trên bia đá, hoặc bất cứ điều gì họ đang làm.
Robert Calhoun

38

Theo tài liệu AWS và khi bạn (và tôi) vừa thử nghiệm, bạn không thể hạn chế quyền truy cập vào miền AWS ES đối với một vai trò / tài khoản / người dùng / ... và chỉ cần CURL nó!

Các ứng dụng khách tiêu chuẩn, chẳng hạn như curl, không thể thực hiện việc ký yêu cầu được yêu cầu của các chính sách truy cập dựa trên danh tính. Bạn phải sử dụng chính sách truy cập dựa trên địa chỉ IP cho phép truy cập ẩn danh để thực hiện thành công các hướng dẫn cho bước này. ( http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html )

Vì vậy, về cơ bản bạn có hai giải pháp:

Việc ký yêu cầu của bạn có lẽ là giải pháp tốt nhất nếu bạn muốn giữ nguyên chính sách truy cập của mình (linh hoạt hơn việc hạn chế IP), nhưng nó có vẻ phức tạp hơn một chút. Tôi đã không thử cho đến nay và tôi không thể tìm thấy bất kỳ tài liệu nào để giúp đỡ.


3
Tôi đã sử dụng địa chỉ IP công cộng của máy tính xách tay của mình và đã thử truy cập điểm cuối bằng curl / browser, nhưng tôi vẫn gặp lỗi Người dùng: ẩn danh.
Anant Gupta

7
tôi đang đối phó với cùng một vấn đề. và tôi nhận thấy rằng việc xử lý các thay đổi bằng awsasticsearch mất nhiều thời gian.
nemo

Đặt Chính sách truy cập với hai câu lệnh: một câu dành cho quyền truy cập IAM để viết nhật ký, câu lệnh kia có quyền truy cập hạn chế IP để xem KIbana. Xem câu trả lời của tôi để biết chi tiết
Pete

2
Tôi tự hỏi liệu "loooong" có nghĩa là phút, giờ hay ngày. Có vẻ như 10-15 phút của nó. Bạn có thể thấy điều đó khi kiểm tra trạng thái của ES của mình (màu xanh lá cây là 'hoạt động' nếu cập nhật hoàn tất, nếu không, một cái gì đó giống như màu cam 'đang chuẩn bị'.
Balmipour

Tôi đã gặp vấn đề tương tự và sau khi tìm kiếm, tôi đã tìm thấy thư viện tiện dụng này .
gmajivu

6

Đến bữa tiệc hơi muộn, nhưng tôi đã có thể giải quyết vấn đề tương tự bằng cách thêm chữ ký vào các yêu cầu của mình.

Nếu bạn sử dụng Python (như tôi làm), bạn có thể sử dụng thư viện sau để làm cho nó đặc biệt dễ triển khai: https://github.com/DavidMuller/aws-requests-auth

Nó làm việc hoàn hảo cho tôi.


1

Bạn chỉ cần điền đầy đủ tên người dùng trong chính sách tìm kiếm đàn hồi.

Trong trường hợp này, bạn có thể lấy tên người dùng đầy đủ của mình từ chính thông báo lỗi. Trong trường hợp của tôi: "arn: aws: sts :: [ACCOUNT_ID]: vai trò giả định / [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

Vai trò ARN cần được thay đổi. nó sẽ giống như "arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role"


-2

Tôi cũng đang cố gắng làm điều này và tôi đã làm cho nó hoạt động bằng cách sử dụng Allow access to the domain from specific IP(s)tùy chọn với Elastic IP của phiên bản EC2 của tôi (cũng có thể hoạt động bằng cách sử dụng IP riêng của phiên bản, nhưng tôi không quá chắc chắn)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.