นโยบายการเข้าถึงที่เหมาะสมสำหรับ Amazon Elastic Search Cluster


99

ฉันเพิ่งเริ่มใช้บริการ Amazon Elasticsearch ใหม่และดูเหมือนว่าฉันไม่สามารถเข้าใจนโยบายการเข้าถึงที่ต้องการได้เพื่อให้ฉันสามารถเข้าถึงบริการจากอินสแตนซ์ EC2 ของฉันที่มีบทบาท IAM เฉพาะที่กำหนดให้เท่านั้น

นี่คือตัวอย่างของนโยบายการเข้าถึงที่ฉันกำหนดให้กับโดเมน 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]/*"
    }
  ]
}

แต่อย่างที่บอกไม่ได้ผล ฉันลงชื่อเข้าใช้อินสแตนซ์ EC2 (ซึ่งมีmy_es_roleบทบาทที่แนบมา) และพยายามเรียกใช้การเรียก curl แบบง่ายที่จุดสิ้นสุด "https: //*.es.amazonaws.com" ฉันได้รับข้อผิดพลาดต่อไปนี้:

{"ข้อความ": "ผู้ใช้: anonymous ไม่ได้รับอนุญาตให้ดำเนินการ: es: ESHttpGet on resource: arn: aws: es: us-east-1: [ACCOUNT_ID]: domain / [ES_DOMAIN] /“}

มีใครทราบบ้างไหมว่าฉันต้องเปลี่ยนแปลงนโยบายการเข้าถึงเพื่อให้สิ่งนี้ใช้งานได้


14
ระวังการเปลี่ยนแปลงนโยบายการเข้าถึง ElasticSearch ใช้เวลานานในการใช้ซึ่งแตกต่างจากการเปลี่ยนแปลง IAM อื่น ๆ ที่แทบจะเกิดขึ้นทันที ทำได้ง่ายๆเพียงคลิก "ใช้" และสลับแท็บโดยไม่สังเกตเห็น "กำลังประมวลผล ... "
Cyril Duchon-Doris

คำตอบ:


63

คุณสามารถล็อกการเข้าถึงเฉพาะ IAM ได้ แต่คุณจะดู Kibana ในเบราว์เซอร์ของคุณอย่างไร คุณสามารถตั้งค่าพร็อกซีได้ ( ดูโมดูลGistและ / หรือNPM ) หรือเปิดใช้ทั้งการเข้าถึงแบบ IAM และ IP เพื่อดูผลลัพธ์

ฉันสามารถรับทั้งการเข้าถึงแบบ จำกัด IP ในการเข้าถึง IAM ด้วยนโยบายการเข้าถึงต่อไปนี้ หมายเหตุคำสั่งมีความสำคัญ: ฉันไม่สามารถทำให้มันทำงานกับคำสั่งตาม IP ก่อนคำสั่ง 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"
          ]
        }
      }
    }
  ]
}

อินสแตนซ์ EC2 ของฉันมีโปรไฟล์อินสแตนซ์พร้อม arn:aws:iam::aws:policy/AmazonESFullAccess นโยบาย Logstash ควรลงชื่อร้องขอใช้logstash ผลผลิต-Amazon-ES ปลั๊กอินเอาท์พุท Logstash ที่ทำงานบนอินสแตนซ์ EC2 ของฉันมีส่วนเอาต์พุตดังนี้:

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

ฉันสามารถเข้าถึง Kibana ได้จากสอง IP ในนโยบายการเข้าถึง (192.168.1.0 และ 192.168.1.1)


สวัสดีคุณจะต้องใช้ปลั๊กอินก็ต่อเมื่อคุณใช้นโยบายที่ใช้ IAM คุณสามารถใช้ปลั๊กอิน elasticsearch มาตรฐานใน Logstash ได้หากนโยบายการเข้าถึงของคุณอิงตามที่อยู่ IP คุณไม่จำเป็นต้องมีโปรไฟล์อินสแตนซ์ในกรณีนั้นเช่นกัน นอกจากนี้บริการ ES ยังไม่มีให้บริการใน VPC คุณต้องใช้ที่อยู่ IP สาธารณะเพื่อเชื่อมต่อ ไม่แน่ใจว่าการอ้างอิงถึงที่อยู่ 192.168 เป็นการแทนที่ด้วยสิ่งอื่นหรือไม่ แต่อาจทำให้เข้าใจผิด
Garreth McDaid

aws:SourceIp'ในตัวอย่างของฉันมีความตั้งใจที่จะเป็น IP เวิร์กสเตชันส่วนบุคคลของคุณเพื่อให้คุณสามารถใช้ Kibana การเข้าถึงแบบ จำกัด IAM ทำให้อินสแตนซ์ EC2 อย่างน้อยหนึ่งรายการสามารถเขียนไปยัง Elasticsearch ได้โดยไม่ต้องกังวลว่า IP ใดที่เป็นของอินสแตนซ์หรือบล็อก CIDR
พีท

1
เป็นที่น่าสังเกตว่าการ จำกัด เฉพาะช่วงIP CIDR ส่วนตัวของ VPC ของคุณดูเหมือนจะไม่ได้ผล ES ไม่ทำงานภายใน VPC หรือบางอย่าง
sventechie

ขอขอบคุณที่ให้ตัวอย่างนโยบายในคำตอบของคุณ ฉันไม่สามารถทำให้ Kibana ผ่านข้อผิดพลาด "User: anonymous" ที่น่ากลัวได้จนกว่าฉันจะเปลี่ยนaws:SourceIpจากค่าสเกลาร์เป็นอาร์เรย์ดังในตัวอย่างที่คุณให้มา (ฉันใช้สัญกรณ์ CIDR ถ้านั่นช่วยคนอื่นได้) กระบวนการทั้งหมดในการกำหนดนโยบายสำหรับ AWS ES จะน่าผิดหวังน้อยกว่าหากการเปลี่ยนแปลงนโยบายทุกครั้งไม่ได้ทำให้คลัสเตอร์เข้าสู่สถานะ "การประมวลผล" ที่ลึกลับเป็นเวลา 20 นาที นโยบายนี้ถูกจารึกไว้อย่างระมัดระวังบนแผ่นศิลาหรือสิ่งที่พวกเขากำลังทำอยู่
Robert Calhoun

38

ตามเอกสารของ AWS และในขณะที่คุณ (และฉัน) เพิ่งทดสอบคุณไม่สามารถ จำกัด การเข้าถึงโดเมน AWS ES ไว้ที่บทบาท / บัญชี / ผู้ใช้ / ... และเพียงแค่ยกเลิก!

ไคลเอ็นต์มาตรฐานเช่น curl ไม่สามารถดำเนินการลงนามการร้องขอที่จำเป็นสำหรับนโยบายการเข้าถึงตามข้อมูลประจำตัว คุณต้องใช้นโยบายการเข้าถึงตามที่อยู่ IP ที่อนุญาตให้เข้าถึงโดยไม่ระบุชื่อเพื่อดำเนินการตามคำแนะนำสำหรับขั้นตอนนี้ได้สำเร็จ ( http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html )

โดยพื้นฐานแล้วคุณมีสองวิธี:

การลงนามในคำขอของคุณน่าจะเป็นทางออกที่ดีที่สุดหากคุณต้องการคงนโยบายการเข้าถึงไว้ตามที่เป็นอยู่ (ซึ่งยืดหยุ่นกว่าการ จำกัด เฉพาะ IP) แต่ดูเหมือนว่าจะซับซ้อนกว่าเล็กน้อย ฉันยังไม่ได้ลองและไม่พบเอกสารใด ๆ ที่จะช่วยได้


3
ฉันใช้ที่อยู่ IP สาธารณะของแล็ปท็อปและพยายามเข้าถึงปลายทางด้วย curl / browser แต่ฉันยังคงได้รับ User: anonymous error
Anant Gupta

7
ฉันกำลังเผชิญกับปัญหาเดียวกัน และฉันสังเกตเห็นว่าการประมวลผลการเปลี่ยนแปลงโดย aws elasticsearch ใช้เวลานาน
nemo

ตั้งค่านโยบายการเข้าถึงด้วยสองคำสั่ง: หนึ่งสำหรับการเข้าถึง IAM เพื่อเขียนบันทึกอีกรายการหนึ่งมีการเข้าถึงแบบ จำกัด IP เพื่อดู KIbana ดูคำตอบของฉันสำหรับรายละเอียด
Pete

2
ฉันสงสัยว่า "loooong" หมายถึงนาทีชั่วโมงหรือวัน ดูเหมือนว่า 10-15 นาที คุณจะเห็นได้ว่าเมื่อตรวจสอบสถานะ ES ของคุณ (สีเขียว 'ใช้งานอยู่' หากการอัปเดตเสร็จสมบูรณ์มิฉะนั้นจะมีคำว่า 'กำลังเตรียม' สีส้ม
Balmipour

ฉันมีปัญหาเดียวกันและหลังจากค้นหาฉันก็พบห้องสมุดที่มีประโยชน์นี้
gmajivu

6

ไปงานปาร์ตี้ช้าไปหน่อย แต่ฉันสามารถจัดการกับปัญหาเดียวกันได้โดยเพิ่มลายเซ็นในคำขอของฉัน

หากคุณใช้ Python (เหมือนที่ฉันทำ) คุณสามารถใช้ไลบรารีต่อไปนี้เพื่อทำให้ง่ายต่อการใช้งาน: https://github.com/DavidMuller/aws-requests-auth

มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน


1

คุณต้องระบุชื่อผู้ใช้แบบเต็มในนโยบายการค้นหาแบบยืดหยุ่น

ในกรณีนี้คุณจะได้รับชื่อผู้ใช้แบบเต็มจากข้อความแสดงข้อผิดพลาดนั้นเอง ในกรณีของฉัน: "arn: aws: sts :: [ACCOUNT_ID]: สันนิษฐาน - บทบาท / [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

คุณอาจใช้นโยบายตามทรัพยากรหรือนโยบายตามข้อมูลประจำตัวแทนที่จะใช้นโยบายตาม IP ซึ่งเหมือนกับการเข้ารหัสที่อยู่ IP อย่างหนัก

แต่คุณต้องใช้ลายเซ็นเวอร์ชัน 4 เพื่อลงนามในคำขอ

สำหรับการใช้งาน Java โปรดดูที่http://mytechbites.blogspot.in/2017/04/secure-amazon-elastic-search-service.html


0

ต้องเปลี่ยนบทบาท ARN จะมีลักษณะดังนี้ "arn: aws: iam :: [ACCOUNT_ID]: role / service-role / my_es_role"


-2

ฉันกำลังพยายามทำสิ่งนี้ด้วยและฉันทำให้มันใช้งานได้โดยใช้Allow access to the domain from specific IP(s)ตัวเลือกกับ Elastic IP ของอินสแตนซ์ EC2 ของฉัน (สามารถใช้งานได้โดยใช้ IP ส่วนตัวของอินสแตนซ์ แต่ฉันไม่แน่ใจเกินไป)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.