Правильна політика доступу для кластеру пошуку Amazo Elastic Search


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", я отримую таку помилку:

{"Повідомлення": "Користувач: анонім не має права виконувати: es: ESHttpGet на ресурсі: arn: aws: es: us-east-1: [ACCOUNT_ID]: domain / [ES_DOMAIN] /“}

Хтось знає, що я повинен змінити в політиці доступу, щоб це працювало?


14
Обережно, зміни політики доступу до ElasticSearch потребують багато часу, на відміну від інших змін IAM, які майже миттєві. Легко просто натиснути "застосувати" та переключити вкладку, не помічаючи "Обробку ..."
Кирило Дюшон-Доріс

Відповіді:


63

Ви можете заблокувати доступ лише до IAM, але як ви переглянете Kibana у своєму браузері? Ви можете встановити проксі ( див. Модуль Gist та / або NPM ) або дозволити доступ до IAM та IP-доступу для перегляду результатів.

Мені вдалося отримати доступ до IAM з обмеженим доступом до 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-output-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. Ви можете використовувати стандартний плагін для пошуку в Logstash, якщо ваша політика доступу базується на IP-адресах. У цьому випадку вам також не потрібен профіль екземпляра. Також послуга ES не доступна у VPC. Вам потрібно використовувати загальнодоступні IP-адреси для підключення. Не впевнені, чи ваші посилання на 192.168 адреси є заміною чогось іншого, але можуть ввести в оману.
Гаррет Макдейд

У aws:SourceIp«s в моєму прикладі призначені для вашої особистої робочої станції IP , так що ви можете використовувати Kibana. Доступ, обмежений IAM, дозволяє одному або більше екземплярів EC2 записувати в Elasticsearch, не переживаючи, які IP-адреси належать певному екземпляру або блоку CIDR.
Піт

1
Варто зазначити, що обмеження на приватний діапазон IP CIDR вашого VPC, здається, не працює. ES не працює в VPC або щось подібне.
sventechie

Дякуємо, що надали зразок політики у своїй відповіді; Мені не вдалося пройти Кібану через жахливу помилку "Користувач: анонімний", поки я не перейшов aws:SourceIpзі скалярного значення в масив, як у прикладі, який ви подали. (Я нотація CIDR, якщо це допомагає комусь іншому.) Весь процес встановлення політики для AWS ES був би менш розчарувальним, якби кожна зміна політики не ставила кластер в загадковий стан "обробки" на 20 хвилин поліс ретельно вписаний на кам'яні таблички, або все, що вони роблять.
Роберт Калхун

38

Згідно з документом AWS, і як ви (і я) щойно перевірені, ви не можете обмежувати доступ до домену AWS ES роллю / акаунту / користувачеві / ... і просто CURL!

Стандартні клієнти, такі як curl, не можуть виконувати підписання запиту, що вимагається в основі політики доступу на основі ідентичності. Потрібно використовувати політику доступу на основі IP-адреси, яка дозволяє анонімному доступу успішно виконувати інструкції для цього кроку. ( http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-gsg-search.html )

Отже, у вас є два рішення:

Підписання запиту - це, мабуть, найкраще рішення, якщо ви хочете зберегти свою політику доступу такою, якою є (яка є більш гнучкою, ніж обмеження IP-адреси), але це здається трохи складнішим. Я до цього часу не пробував і не можу знайти жодного документа, який би допомог.


3
Я використовував загальнодоступну IP-адресу свого ноутбука і намагався отримати доступ до кінцевої точки за допомогою curl / browser, але я все одно отримую користувач: анонімна помилка.
Анант Гупта

7
Я маю справу з тією ж проблемою. і я помітив, що обробка змін еластичним пошуком займає довгий час.
немо

Встановіть політику доступу з двома заявами: один для доступу IAM для запису журналів, інший з обмеженим IP-доступом для перегляду KIbana. Детальніше дивіться у моїй відповіді
Піт

2
Мені було цікаво, чи означає "loooong" хвилини, години чи дні. Виглядає, що його 10-15 хвилин. Ви можете бачити, що під час перевірки стану вашої ЕС (зелений "активний", якщо оновлення завершено, інше, щось на зразок помаранчевого "готується".
Балміпур

У мене була така ж проблема, і після пошуку я знайшов цю зручну бібліотеку .
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)опції з Еластичним IP свого екземпляра EC2 (також може працювати з використанням приватного IP-адреси примірника, але я не надто впевнений)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.