Установка Elastic Enterprise Search

Thank you for reading this post, don't forget to subscribe!

Пред­ва­ри­тель­но уже дол­жен быть уста­нов­лен ELK стек

То есть име­ем базо­вую систе­му, гото­вую к при­ня­тию логов. Авто­ри­за­ция не настро­е­на, TLS на самих сер­ви­сах Elasticsearch и Kibana не настро­ен. Пря­мой доступ для всех и ото­всю­ду. Я подоб­ные кон­фи­гу­ра­ции обыч­но защи­щаю на уровне firewall или спис­ков allow, deny в nginx, кото­рый высту­па­ет в каче­стве proxy.

Настройка базовой безопасности в Elasticsearch

Нач­нём настрой­ку с того, что выпол­ним базо­вые реко­мен­да­ции по без­опас­но­сти в кла­сте­ре elasticsearch. Для это­го акти­ви­ру­ем настрой­ку xpack.security. Добав­ля­ем в кон­фиг elasticsearch:

После это­го пере­за­пу­сти­те служ­бу elasticsearch:

Теперь сге­не­ри­ру­ем паро­ли к встро­ен­ным учёт­ным запи­сям (built-in users) elastic. Для это­го запус­ка­ем ути­ли­ту elasticsearch-setup-passwords. По умол­ча­нию она нахо­дит­ся в пап­ке /usr/share/elasticsearch/bin.

# /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto

Сохра­ни­те где-то эти учет­ные дан­ные. Они нам пона­до­бят­ся далее, а боль­ше вы их нигде не уви­ди­те. Более подроб­но о рабо­те этой ути­ли­ты читай­те в доку­мен­та­ции - elasticsearch-setup-passwords.

В насто­я­щий момент Kibana не будет иметь доступ к кла­сте­ру. Что­бы это испра­вить, добавь­те в её кон­фи­гу­ра­ци­он­ный файл параметры:

Пере­за­пу­сти­те Kibana:

Доступ через web интер­фейс сно­ва будет досту­пен, толь­ко теперь необ­хо­ди­мо прой­ти встро­ен­ную в Kibana авто­ри­за­цию. Для это­го исполь­зуй­те создан­ный ранее пароль для учёт­ной запи­си elastic.

Если исполь­зу­е­те Logstash, то для него тоже необ­хо­дим доступ с исполь­зо­ва­ни­ем учет­ной запи­си, кото­рую надо создать. Как это сде­лать, подроб­но опи­са­но в инструк­ции - Configuring Security in Logstash. Необ­хо­ди­мо в Kibana перей­ти в раз­дел Stack Management -> Roles и доба­вить роль logstash_writer. Пра­ва сде­лать следующие:

  • cluster - manage_index_templates и monitor
  • indices - выбрать индек­сы, кото­рые созда­ет logstash и назна­чить им пра­ва all.

Затем пере­хо­ди­те в раз­дел Users, добав­ля­е­те поль­зо­ва­те­ля logstash_writer, ука­зы­ва­е­те пароль и назна­ча­е­те ему ранее добав­лен­ную роль. После это­го в кон­фи­гу­ра­ции logstash, отве­ча­ю­щей за пра­ви­ла output, добавь­те инфор­ма­цию об этой учет­ной записи:

Пере­за­пу­сти­те logstash:

Если всё в поряд­ке, то пере­хо­ди­те к сле­ду­ю­ще­му раз­де­лу. Если что-то не рабо­та­ет, то раз­би­рай­тесь для нача­ла с этой настройкой.

Настройка TLS в Elasticsearch

Далее нам нуж­но настро­ить воз­мож­ность соеди­не­ния с elasticsearch по tls. Без это­го не зара­бо­та­ет авто­ри­за­ция через api_key, кото­рую будет исполь­зо­вать служ­ба Enterprise Search. Для это­го сге­не­ри­ру­ем само­под­пи­сан­ные сер­ти­фи­ка­ты, исполь­зуя ути­ли­ту elasticsearch-certutil. Сге­не­ри­ру­ем с её помо­щью CA сер­ти­фи­кат, кото­рым будем под­пи­сы­вать все остальные.

Создан­ный сер­ти­фи­кат будет поло­жен в дирек­то­рию /usr/share/elasticsearch. Теперь сге­не­ри­ру­ем кли­ент­ский сер­ти­фи­кат с исполь­зо­ва­ни­ем CA, выпу­щен­но­го ранее.

На выхо­де полу­чим файл elastic-certificates.p12, кото­рый вклю­ча­ет в себя сам сер­ти­фи­кат, при­ват­ный ключ и CA. В общем, пол­ный набор, кото­рый нам необ­хо­дим. Копи­ру­ем оба сер­ти­фи­ка­та в /etc/elasticsearch. И обя­за­тель­но назначь­те пра­ва досту­па к этим сер­ти­фи­ка­там поль­зо­ва­те­лю elasticsearch.

Редак­ти­ру­ем кон­фи­гу­ра­ци­он­ный файл elasticsearch, добав­ляя туда сле­ду­ю­щие параметры:

Пере­за­пу­сти­те elasticsearch и про­верь­те, что всё в поряд­ке. Этих мини­маль­ных настро­ек будет доста­точ­но для рабо­ты Elastic Enterprise Search. При жела­нии, мож­но и все http запро­сы к кла­сте­ру настро­ить на https, но у меня не полу­чи­лось это сде­лать с само­под­пи­сан­ным сер­ти­фи­ка­том, толь­ко с насто­я­щим. В Kibana мож­но было настро­ить дове­рие к само­под­пи­сан­но­му сер­ти­фи­ка­ту, а в Elastic Enterprise Search не полу­чи­лось. Я не стал силь­но раз­би­рать­ся и про­сто взял валид­ный сертификат.

Если вы хоти­те все, что­бы все запро­сы к кла­сте­ру были по https, то добавь­те допол­ни­тель­но сле­ду­ю­щие параметры:

В дан­ном слу­чае исполь­зу­ет­ся дей­ству­ю­щий сер­ти­фи­кат, куп­лен­ный на год. Мож­но исполь­зо­вать и бес­плат­ные сер­ти­фи­ка­ты от Let's Encrypt, но при­дёт­ся рас­смот­реть отдель­но вопрос пере­за­пус­ка всех служб, кото­рые будут зави­сеть от этих сер­ти­фи­ка­тов. Так­же во всех служ­бах, кото­рые будут обра­щать­ся к elasticsearch, надо не забы­вать ука­зы­вать под­клю­че­ние через https, а не http и обя­за­тель­но по име­ни доме­на, на кото­рый выпу­щен этот сер­ти­фи­кат. Так что не забудь­те с dns отдель­но разо­брать­ся, что­бы все запро­сы были толь­ко по домен­но­му име­ни, ина­че служ­бы будут ругать­ся на несо­от­вет­ствие адре­са и запи­си доме­на в сер­ти­фи­ка­те. Ну и сами сер­ти­фи­ка­ты надо будет ука­зать (key, crt, bundle), по ана­ло­гии с настрой­ка­ми elasticsearch.

Установка Elastic Enterprise Search

Перед уста­нов­кой EES надо уста­но­вить вер­сию Java 8 или 11. На этом момен­те я силь­но завис, когда пер­вый раз настра­и­вал Elastic Enterprise Search. Дело в том, что в ком­плек­те с elasticsearch уже идёт jdk. Она нахо­дит­ся в дирек­то­рии - /usr/share/elasticsearch/jdk. Я пытал­ся её под­су­нуть EES, что­бы не ста­вить еще раз java. Делал этот через объ­яв­ле­ние PATH с нуж­ным путём в юни­те systemd - /usr/lib/systemd/system/enterprise-search.service. Добав­лял туда:

Если не добав­лять вруч­ную путь к java, то Enterprise Search руга­ет­ся во вре­мя запуска:

После добав­ле­ния PATH служ­ба запус­ка­лась и даже начи­на­ла рабо­тать, но сыпа­ла раз­лич­ные ошиб­ки и по фак­ту не рабо­та­ла, толь­ко дела­ла вид. В логе было пре­ду­пре­жде­ние на несо­от­вет­ствие вер­сии java, но я изна­чаль­но не при­да­вал ему зна­че­ния, думая, что это фор­маль­ность. И толь­ко когда уста­но­вил 8 или 11 вер­сию, все заработало.

Так что ста­вим openjdk 11 в систему:

После уста­нов­ки java сама про­пи­шет себя в /usr/bin/java, так что отдель­но настра­и­вать PATH для enterprise-search не придётся.

Теперь идём на стра­ни­цу загруз­ки, ска­чи­ва­ем пакет под свою систе­му. В слу­чае с rpm это будет сле­ду­ю­щая после­до­ва­тель­ность действий:

Перед этим про­бо­вал уста­но­вить из стан­дарт­но­го репо­зи­то­рия elastic, но отту­да поче­му-то пред­ла­га­ет­ся к уста­нов­ке пакет непод­хо­дя­щей архитектуры.

Так что при­шлось уста­нав­ли­вать вруч­ную. После уста­нов­ки, нам надо отре­дак­ти­ро­вать кон­фи­гу­ра­ци­он­ный файл /usr/share/enterprise-search/config/enterprise-search.yml. Добав­ля­ем туда:

Учё­тет­ную запись elastic мы настро­и­ли в самом нача­ле. Это она же, встро­ен­ная (built-in). И не забудь­те ip для web интер­фей­са kibana поме­нять на свой. Если настро­и­ли https, то доступ дол­жен быть по домен­но­му име­ни. Запус­кай­те и добав­ляй­те сра­зу в авто­за­груз­ку службу.

Смот­рим лог /var/log/enterprise-search/app-server.log. Там будет ошибка:

Сохра­ни­те нуж­ную настрой­ку и добавь­те её в в кон­фиг enterprise-search.yml:

secret_management.encryption_keys: [f37a2e899b47e4749cc6c1ba01e8cfc27da9f367f0795caaed0c98e52f9dff83]

Сно­ва запус­кай­те enterprise-search:

Теперь оши­бок быть не долж­но. Про­верь­те систем­ный лог /var/log/messages. Там будет инфор­ма­ция о встро­ен­ной учет­ной запи­си enterprise_search. Её надо сохра­нить. При­го­дит­ся, если буде­те напря­мую захо­дить в веб интер­фейс enterprise-search, минуя Kibana.

Дожди­тесь, когда Elastic Enterprise Search закон­чит созда­ние всех необ­хо­ди­мых сущ­но­стей в кластере:

Про­верь­те, что служ­ба запу­ще­на и слу­ша­ет свой порт:

Всё в поряд­ке. Оста­лось толь­ко доба­вить в кон­фиг Kibana инфор­ма­цию о службе:

Пере­за­пу­сти­те Kibana и отправ­ляй­тесь в веб интер­фейс, в раз­дел Enterprise Search.

На этом уста­нов­ка Elastic Enterprise Search закон­че­на, мож­но начи­нать исполь­зо­вать. Напом­ню, что для Self-hosted реше­ния ELK этот функ­ци­о­нал бесплатен.