<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Alex M</title><generator>teletype.in</generator><description><![CDATA[Alex M]]></description><image><url>https://img1.teletype.in/files/8d/72/8d726e63-e6b0-4832-a1a5-15c173828d8f.png</url><title>Alex M</title><link>https://blog.hackinone.click/</link></image><link>https://blog.hackinone.click/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scboln</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/scboln?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/scboln?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 16 Jul 2026 06:04:17 GMT</pubDate><lastBuildDate>Thu, 16 Jul 2026 06:04:17 GMT</lastBuildDate><item><guid isPermaLink="true">https://blog.hackinone.click/basic-auth-must-die</guid><link>https://blog.hackinone.click/basic-auth-must-die?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scboln</link><comments>https://blog.hackinone.click/basic-auth-must-die?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scboln#comments</comments><dc:creator>scboln</dc:creator><title>Прикончить деда: переход с Basic Auth на mTLS</title><pubDate>Thu, 16 Jan 2025 00:57:10 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/fa/64/fa644286-b30e-42ef-b561-84db663f4c7a.png"></media:content><description><![CDATA[<img src="https://img1.teletype.in/files/0d/8f/0d8f47fb-5cf7-4c6f-b87b-b9aec8eaa906.png"></img>Как часто вы хотели что-то развернуть и думали, а как прикрыть это от внешнего мира? Я довольно часто.]]></description><content:encoded><![CDATA[
  <nav>
    <ul>
      <li class="m_level_1"><a href="#tU6o">Интро</a></li>
      <li class="m_level_1"><a href="#AJru">Зачем это все нужно</a></li>
      <li class="m_level_1"><a href="#hFGc">Процесс настройки</a></li>
      <li class="m_level_2"><a href="#Ksov">Серверная сторона</a></li>
      <li class="m_level_2"><a href="#NouU">Преднастройка</a></li>
      <li class="m_level_2"><a href="#6jpG">    ПО</a></li>
      <li class="m_level_2"><a href="#vXcD">    Центр Сертификатов</a></li>
      <li class="m_level_2"><a href="#Jpc7">Создание сертификатов</a></li>
      <li class="m_level_2"><a href="#lN5L">    CA cert</a></li>
      <li class="m_level_2"><a href="#cYYt">    Сертификат сервера</a></li>
      <li class="m_level_2"><a href="#omQK">    Сертификат клиента</a></li>
      <li class="m_level_2"><a href="#5IZN">    Список отозванных сертификатов (CRL) </a></li>
      <li class="m_level_2"><a href="#F4vY">    Цепочка сертификатов (Full Chain)</a></li>
      <li class="m_level_2"><a href="#lcUH">    Отзыв сертификата</a></li>
      <li class="m_level_2"><a href="#wOQJ">    Настройка nginx</a></li>
      <li class="m_level_2"><a href="#zpHH">Настройка клиента</a></li>
      <li class="m_level_2"><a href="#uwb8">    Перемещение на клиента</a></li>
      <li class="m_level_2"><a href="#Wu8P">    Установка на клиенте</a></li>
      <li class="m_level_2"><a href="#u2QX">    Firefox</a></li>
      <li class="m_level_2"><a href="#bnCY">    MacOS</a></li>
      <li class="m_level_2"><a href="#jES2">    Windows</a></li>
      <li class="m_level_2"><a href="#snn6">    Burp</a></li>
      <li class="m_level_2"><a href="#vg0O">Footer</a></li>
    </ul>
  </nav>
  <h2 id="tU6o">Интро</h2>
  <p id="Bj63">Как часто вы хотели что-то развернуть и думали, а как прикрыть это от внешнего мира? Я довольно часто.</p>
  <p id="XO5y">Есть у меня своего рода фетиш, разворачивать разные сервисы для личных нужд. Например:</p>
  <ul id="rJf6">
    <li id="lB1q">Gitea, для синхронизации Obsidian</li>
    <li id="yMtw">Сhangedetection, для мониторинга изменений на сайтах</li>
    <li id="N4wS">Hive от Hexway, для ведения файдингов на багбанти </li>
    <li id="DaRT">n8n для автоматизаций<br />и многое другое что можно найти в репозитории <a href="https://github.com/awesome-selfhosted/awesome-selfhosted" target="_blank">awesome-selfhosted</a></li>
  </ul>
  <p id="Ieqv">Если в части сервисов у меня нет важной информации, то с Hive ситуация совершенно иная и его необходимо прикрыть дополнительным слоем защиты.<br /><br />Первым на ум приходил старик Basic Auth. Но он подкидывает проблем тк подвергается бруту да и передается через заголовки преобразованных в base64.<br />В один прекрасный момент я вспомнил, что еще в далеком 2014 настраивал доступ к сервису RoundCube (Web интерфейс для работы с почтой) через mTLS. <br /><br />Кто же такой mTLS? <br />Простым языком, это проверка сертификата с двух сторон. Не только Вы проверяете, что сервер имеет нужный сертификат, но и сам сервер запрашивает ваш клиентский сертификат для проверки и предоставления доступа.</p>
  <p id="vIyN"></p>
  <h2 id="AJru">Зачем это все нужно</h2>
  <p id="onWA">Могу отметить следующие плюсы:</p>
  <ul id="Iyaw">
    <li id="KAcw">Это удобно, вам не потребуется дополнительно вводить логин и пароль от Basic Auth</li>
    <li id="9uSd">Если Вы по какой-то причине не умели в сертификаты, у вас появится https вместо http.</li>
    <li id="3uCI">Вам перестанут брутфорсить Basic Auth</li>
    <li id="ckTz">Логин и пароль проще украсть нежели сертификат, следовательно это безопаснее</li>
  </ul>
  <h2 id="hFGc">Процесс настройки</h2>
  <p id="Ktvz">Не пугайтесь, да этот процесс сложнее Basic Auth, но я опишу все под ctrl+c, ctrl+v.<br />Так же в этой статье не будет страшных слов, таких как Vault от Hashicorp, все постараюсь описать максимально просто. </p>
  <blockquote id="A7pW">Для ознакомления с механизмом, пример будет с использованием самоподписанного сертификата, где корневой центр сертификации и сервис доступный через mTLS размещены на одном сервере. </blockquote>
  <p id="iNMI"></p>
  <h3 id="Ksov">Серверная сторона</h3>
  <p id="Wwtq">Представим, что у вас есть сервер доступный через интернет с Ubuntu Linux на борту. <br /></p>
  <h3 id="NouU">Преднастройка</h3>
  <h3 id="6jpG">    ПО</h3>
  <p id="AK16">Если у вас уже установлен nginx и openssl - хорошо. Если нет, то:</p>
  <pre id="Wbh4">sudo apt install openssl nginx
sudo systemctl enable nginx
sudo service nginx start</pre>
  <blockquote id="lMxn">Конечно nginx у нас может быть в docker, но сегодня мы рассмотрим распространненную ситуацию, без глубокого погружения в сети и конфигурирования взаимодействия между docker контейнерами.</blockquote>
  <p id="vYNp">Развернем тестовое приложение docker:</p>
  <pre id="le9a">sudo docker run -d --rm -p 127.0.0.1:3000:3000 bkimminich/juice-shop</pre>
  <blockquote id="5oiG">Если docker не установлен, то вам сюда <a href="https://docs.docker.com/engine/install/ubuntu/" target="_blank">https://docs.docker.com/engine/install/ubuntu/</a><br />После выполнения команды будет запущен Juice Shop на http://127.0.0.1:3000</blockquote>
  <p id="wgnI"></p>
  <h3 id="vXcD">    Центр Сертификатов</h3>
  <p id="Xoce">Создание каталогов для работы с сертификатами:</p>
  <pre id="kRfM">sudo mkdir -p /etc/ssl/mtls/ca/{certs,crl,newcerts,private}
sudo chmod 700 /etc/ssl/mtls/ca/private
sudo touch /etc/ssl/mtls/ca/index.txt</pre>
  <p id="EWam">Создадим индекс файл для хранения информации о сертификатах:</p>
  <pre id="7awZ">sudo touch /etc/ssl/mtls/ca/index.txt</pre>
  <p id="UBiC">Создадим файлы с id от которых пойдет отсчет наших выданных и отозванных сертификатов (исторически id от 1000):</p>
  <pre id="IYdx">sudo echo 1000 &gt; /etc/ssl/mtls/ca/crlnumber
sudo echo 1000 &gt; /etc/ssl/mtls/ca/serial</pre>
  <p id="DaZI">Создадим свой файл конфигурации openssl:</p>
  <pre id="eGFy">sudo vim /etc/ssl/mtls/openssl.cnf</pre>
  <blockquote id="SHE0">(!) Обратите особое внимание на блок [ alt_names ], в примере ниже использован мой домен, его 100% необходимо заменить на ваши данные</blockquote>
  <pre id="ZfAM">[ ca ]
default_ca = CA_default

# Указываем данные о местонахождении файлов и параметры для выпуска CA
# в данном примере CA выпускается на 10 лет
[ CA_default ]
dir               = /etc/ssl/mtls/ca
certs             = $dir/certs
crl_dir           = $dir/crl
database          = $dir/index.txt
new_certs_dir     = $dir/newcerts
certificate       = $dir/cacert.pem
serial            = $dir/serial
crlnumber         = $dir/crlnumber
crl               = $dir/crl.pem
private_key       = $dir/private/cakey.pem
default_md        = sha256
default_days      = 3650
policy            = policy_match
default_crl_days  = 30

# Настройки политик проверки полей в выдаваемых сертификатах
# должны совпадать по countryName, stateOrProvinceName, organizationName
[ policy_match ]
countryName       = match
stateOrProvinceName = match
organizationName  = match
commonName        = supplied

# Настройки для запросов создания сертификатов
[ req ]
default_bits      = 4096
default_md        = sha256
distinguished_name = req_distinguished_name
x509_extensions   = v3_ca

# Описание формата DN (distinguished name) при создании сертификатов
[ req_distinguished_name ]
countryName         = Country Name (2 letter code)
countryName_default = RU
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Saint Petersburg
localityName        = Locality Name (eg, city)
localityName_default = Saint Petersburg
organizationName    = Organization Name (eg, company)
organizationName_default = Evil Corp
commonName          = Common Name (eg, YOUR name)
commonName_default  = Put new data here (CA or dns or user)

# Дополнительная конфигурация для CA сертификатов
# basicConstraints = CA:TRUE - параметр, который позволяет сертификату 
# подписывать иные сертификаты
# keyUsage - может использоваться для подписания сертификатов и CRL (Отзыв сертификатов)
# subjectKeyIdentifier - идентификатор будет хэшом
# authorityKeyIdentifier:
# keyid:always - всегда включать идентификатор CA ключа в сертификат
# issuer - Добавление в сертификат информации о DN CA сертификата
[ v3_ca ]
basicConstraints = CA:TRUE
keyUsage = keyCertSign, cRLSign
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer

# Дополнительные опции для реквеста сертификата server
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
authorityKeyIdentifier = keyid,issuer
subjectAltName = @alt_names

# Важное поле в котором перечисляются домены и IP в поле Alternative Name
# У меня wildcard сертификат, но можно перечислить имена и по одному
# Если планируется сертификат для взаимодействия по IP, то
# указать это нужно в формате IP.1 = ваш_ip следующей строкой можно 
# добавить еще адрес написав IP.2= ваш_второй_ip
[ alt_names ]
DNS.1 = *.0q.lol

# Дополнительные опции реквеста для сертификатов клиента
# Обратите внимание на параметр extendedKeyUsage, здесь он clientAuth
# это означает, что сертификаты выпущенные с этим блоком настроек 
# будут передаваться для аутентификации клиента
[ v3_client ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
authorityKeyIdentifier = keyid,issuer</pre>
  <p id="A44Y"></p>
  <h3 id="Jpc7">Создание сертификатов</h3>
  <h3 id="lN5L">    CA cert</h3>
  <p id="lgoL">Создание ключа корневого сертификата:<br />Во многих статьях показан процесс сначала генерации ключа, затем выпуска сертификата. Но я человек ленивый и делаю все в одном</p>
  <blockquote id="iOXQ">(!) Потребуется ввести пароль, это самый главный пароль который стоит хорошо спрятать и не потерять он на потребуеться довольно часто.<br />(!) Будет интерактивное меню ввода данных, часть из них можно предзаполнить в нашем openssl.cnf<br />(!) В данном случае commonName можно заполнить как угодно, например Evil Corp CA</blockquote>
  <pre id="wlxi">sudo openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 \
  -keyout /etc/ssl/mtls/ca/private/cakey.pem \
  -out /etc/ssl/mtls/ca/cacert.pem \
  -config /etc/ssl/mtls/openssl.cnf  </pre>
  <p id="OyQZ"></p>
  <h3 id="cYYt">    Сертификат сервера</h3>
  <p id="HmPQ">Сертификат сервера (server.crt) в данном случае, это сертификат который будет закреплен за IP или dns нашего сервиса.</p>
  <p id="1N5H">Ключ сервера можно сделать слабее так как он в отличии от CA будет с меньшим сроком жизни</p>
  <p id="u8LZ">Создание ключа и запроса сервера на подписание нашего сертификата, корневым сертификатом:</p>
  <pre id="6pNC">sudo openssl req -new -newkey rsa:2048 -nodes \
  -keyout /etc/ssl/mtls/server.key \
  -out /etc/ssl/mtls/server.csr \
  -config /etc/ssl/mtls/openssl.cnf</pre>
  <p id="h3O0">Теперь подпишем сертификат сервера:</p>
  <blockquote id="UhVr">(!) Будет запрос на ввод пароля, того самого который использовался для ключа корневого сертификата.<br />(!) При заполнении commonName необходимо указать <strong>ваш IP</strong> (если у вас нет домена) или <strong>dns имя</strong> которое будет в дальнейшем использоваться. В моем случае я указал *.0q.lol.<br />Обратите внимание, что используется ключ -extensions v3_req, это указывает на раздел применяемых настроек из нашего openssl.cnf</blockquote>
  <pre id="jRLX">sudo openssl ca -config /etc/ssl/mtls/openssl.cnf \
  -in /etc/ssl/mtls/server.csr \
  -out /etc/ssl/mtls/server.crt \
  -extensions v3_req -days 365   </pre>
  <p id="6YJx"></p>
  <h3 id="omQK">    Сертификат клиента</h3>
  <p id="d8ht">Создание ключа и запроса клиента на подписание нашего сертификата, корневым сертификатом:</p>
  <pre id="ti1q">sudo openssl req -new -newkey rsa:2048 -nodes -keyout /etc/ssl/mtls/client.key \
  -out /etc/ssl/mtls/client.csr \
  -days 365 \
  -config /etc/ssl/mtls/openssl.cnf</pre>
  <p id="9Vtt">Теперь подпишем сертификат клиента:</p>
  <blockquote id="uQlT">(!) Будет запрос на ввод пароля, того самого который использовался для ключа корневого сертификата.<br />(!) При заполнении commonName необходимо <strong>имя клиента</strong>, например ник.<br />Обратите внимание, что используется ключ -extensions v3_client, это указывает на раздел применяемых настроек из нашего openssl.cnf</blockquote>
  <pre id="ROGw">sudo openssl ca -config /etc/ssl/mtls/openssl.cnf \
  -in /etc/ssl/mtls/client.csr \
  -out /etc/ssl/mtls/client.crt \
  -extensions v3_client -days 365</pre>
  <p id="aRiQ">Теперь для удобства использования можно объединить ключ клиента и его сертификат:</p>
  <blockquote id="xQfp">(!) При экспорте будет запрошен пароль для шифрования наших данных внутри client.p12, он еще пригодиться при настройке клиента. <br />Вы так же наверняка заметите странный ключ legacy. Данный ключ нужен, чтобы охватить большее число клиентов, которые смогут понять этот сертификат, например MacOS.<br />Ключ name в некоторых системах позволяет визуально выделить сертификат среди других. </blockquote>
  <pre id="HDdq">sudo openssl pkcs12 -export -legacy -in /etc/ssl/mtls/client.crt \
    -inkey /etc/ssl/mtls/client.key -name ClientName \
    -out /etc/ssl/mtls/client.p12</pre>
  <p id="Bj1j">После того как у нас есть client.p12, можно удалить client.crt и client.key</p>
  <h3 id="5IZN">    Список отозванных сертификатов (CRL) </h3>
  <p id="Rd5o">Мы должны создадать специальный файл со списком отозванных сертификатов, чтобы сервер мог проверить например, не отозван ли сертификат клиента.</p>
  <pre id="gNWW">sudo openssl ca -config /etc/ssl/mtls/openssl.cnf \
  -gencrl -out /etc/ssl/mtls/ca/crl.pem  </pre>
  <h3 id="F4vY">    Цепочка сертификатов (Full Chain)</h3>
  <p id="obhj">Для доверия нашему CA нам потребуеться на машине клиента помимо клиентского сертификата, так же установить и цепоцку сертификатов server + CA</p>
  <p id="RRo5">Это делается элементарно просто</p>
  <pre id="yazx">sudo cat /etc/ssl/mtls/server.crt \
    /etc/ssl/mtls/ca/cacert.pem &gt; /etc/ssl/mtls/full_chain.pem</pre>
  <h3 id="lcUH">    Отзыв сертификата</h3>
  <p id="4J9M">Далеко не уходя, чтобы отозвать сертификат, который вам больше не нужен, можно воспользоваться командой:</p>
  <pre id="JIIB">sudo openssl ca -config /etc/ssl/mtls/openssl.cnf \
  -revoke /etc/ssl/mtls/client.crt </pre>
  <p id="EqvY">Если же у нас не сохранился сертификат на сервере, что после конечной настройки будет правильным путем, то можно отозвать по серийному номеру.</p>
  <p id="MrpP">Для этого можем посмотреть, какие сертификаты у нас есть в index&#x27;е:</p>
  <pre id="bGsW">sudo vim /etc/ssl/mtls/ca/index.txt</pre>
  <p id="1aw9">Затем отозвать подставив серийный номер:</p>
  <pre id="n9G9">sudo openssl ca -revoke -serial &lt;серийный_номер&gt; \
    -config /etc/ssl/mtls/openssl.cnf    </pre>
  <p id="9dk1">ВАЖНО! Не забудте пересоздать crl.pem и перезапустить nginx</p>
  <pre id="qoJp">sudo openssl ca -config /etc/ssl/mtls/openssl.cnf \
  -gencrl -out /etc/ssl/mtls/ca/crl.pem
sudo nginx -t &amp;&amp; sudo nginx -s reload</pre>
  <h3 id="wOQJ">    Настройка nginx</h3>
  <p id="2wKm">Теперь настроим nginx для работы с сертификатами и нашим сервисом на http://127.0.0.1:3000</p>
  <p id="M5xX">Первым делом отредактируем основной файл конфигурации nginx:</p>
  <pre id="Lrny">sudo vim /etc/nginx/nginx.conf</pre>
  <p id="nAxE">В секции http раскомментируем строчку &quot;server_tokens off;&quot;<br />Данный параметр отвечает за отключение заголовков версии nginx, мы же не хотим чтобы весь интернет знал под какую версию искать CVE =)</p>
  <p id="1YIl">Далее создадим конфигурацию для сервиса:</p>
  <pre id="ekjL">sudo vim /etc/nginx/sites-available/mtls</pre>
  <p id="rpwq">Заполним файл:</p>
  <pre id="9JKS">server {
    listen 80;
    server_name mtls.0q.lol;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;

    server_name mtls.0q.lol;
    ssl_certificate     /etc/ssl/mtls/server.crt;
    ssl_certificate_key /etc/ssl/mtls/server.key;
    ssl_client_certificate /etc/ssl/mtls/ca/cacert.pem;
    ssl_verify_client on;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_crl /etc/ssl/mtls/ca/crl.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}</pre>
  <p id="GwhT">Создадим ссылку для &quot;включения&quot; конфигурации сервера nginx</p>
  <pre id="rGEC">sudo ln -s /etc/nginx/sites-available/redirects.conf /etc/nginx/sites-enabled/redirects.conf</pre>
  <p id="triH">Теперь <s>питание компьютера можно отключить</s> можно перезапустить nginx:</p>
  <pre id="Y2Ki">sudo nginx -t &amp;&amp; sudo nginx -s reload</pre>
  <p id="O6mA"></p>
  <h3 id="zpHH">Настройка клиента</h3>
  <h3 id="uwb8">    Перемещение на клиента</h3>
  <p id="Rf5P">Для клиента нам потребуется стянуть сертификаты с сервера, сделать это можно например так:</p>
  <p id="SZUt">Копируем нужные сертификаты </p>
  <pre id="rqNy">sudo cp /etc/ssl/mtls/{client.p12,full_chain.pem} ~/
sudo cp /etc/ssl/mtls/ca/cacert.pem ~/</pre>
  <p id="poz6">Теперь для просто ты перемещения сожмем</p>
  <pre id="4jiW">sudo zip -r client.zip client.p12 full_chain.pem cacert.pem
sudo chown &lt;юзер&gt;:&lt;юзер&gt; client.zip</pre>
  <p id="3rxa">И переместим на свою машину например с помощью scp</p>
  <pre id="ke1N">scp &lt;юзер&gt;@&lt;хост&gt;:/home/&lt;юзер&gt;/client.zip /&lt;путь куда сохранить&gt;/</pre>
  <h3 id="Wu8P">    Установка на клиенте</h3>
  <p id="Vegr">На клиенте расспаковываем архив и определяем в чем же мы хотим использовать сертификат. </p>
  <p id="bZPe">О чем это я, нам предстоит импортировать сертфикаты и выставить доверие. Для этого необходимо поместить их в хранилище сертификатов, а оно у некоторого ПО свое. </p>
  <p id="9i9v">Например, firefox может не работать с системным хранилищем, в то время как chrome работает только с системным.</p>
  <p id="ZZCa">Поэтому, вынесем настройку firefox отдельно =)</p>
  <h3 id="u2QX">    Firefox</h3>
  <p id="PVxJ">Открыв настройки в firefox, воспользуйтесь поиском (так быстрее), введите серт или cert в зависимости от используемой локали. </p>
  <p id="km5L">Если у вас включен third-party root certificates, то сертификаты будут подтягиваться с системного хранилища сертификатов.</p>
  <figure id="SIoC" class="m_column">
    <img src="https://img4.teletype.in/files/30/9d/309dc0f3-d924-4fd7-9a80-d4df88417032.png" width="1568" />
  </figure>
  <p id="yYQm">Если же такой настройки нет или она по неким соображениям выключена, то открываем просмотр сертификатов<br />Далее идем во вкладку корневых центров сертификаци и импортируем наш сертификат cacert.pem:</p>
  <figure id="EjUj" class="m_column">
    <img src="https://img2.teletype.in/files/9b/57/9b5716f7-0a69-499f-8e76-cc8ef709a133.png" width="1472" />
  </figure>
  <p id="AZsP">Выставляем доверие для Web </p>
  <figure id="0Dyh" class="m_column">
    <img src="https://img1.teletype.in/files/83/74/837417e1-1893-4124-a30b-da7743c48c60.png" width="1374" />
  </figure>
  <p id="nzM2">И переходим во вкладку клиентских сертификатов, так же импортируем и вводим пароль от p12:</p>
  <figure id="VuWz" class="m_column">
    <img src="https://img3.teletype.in/files/eb/c0/ebc0c60e-0776-48ce-8237-9b3327903514.png" width="1444" />
  </figure>
  <p id="ah9Q">Все, теперь при переходе на ваш сайт, будет всплывающее окно с выбором сертификата доступа, после подтверждения вы и только вы попадете внутрь.</p>
  <h3 id="bnCY">    MacOS</h3>
  <p id="r6an">Для настройки нам потребуется запустить Keychain Access</p>
  <p id="CYkY">В нем переходим в System - Certificates, после чего в верхнем меню выбираем File - Import Item, и загружаем fullchain.pem</p>
  <figure id="oLvn" class="m_column">
    <img src="https://img3.teletype.in/files/a6/5e/a65e7a0e-5916-4cdb-9ad2-8c2e46a36103.png" width="1440" />
  </figure>
  <p id="7OJs">Далее надо установить доверие корневому сертификату, выбираем наш корневой сертификат и открываем его. Далее разворачиваем блок &quot;Trust&quot; и выставляем &quot;Always Trust&quot;.</p>
  <p id="gc2M">После этого наш второй сертификат (сервера), который так же поместился в хранилище, автоматически станет доверенным.</p>
  <figure id="7eG6" class="m_column">
    <img src="https://img1.teletype.in/files/4b/8c/4b8cf34c-4b32-4c60-a88e-01cb173c85a7.png" width="1402" />
  </figure>
  <p id="TAMg">Ровно таким же образом загружается и client.p12</p>
  <p id="gaJV">Думали на этом все? Не тут то было.</p>
  <p id="iN2Q">В MacOS если вы хотите дать доступ до сертификата приложениям и не хотите каждый раз вводить пароль необходимо проделать еще несколько шагов.</p>
  <p id="CeAH">Находим наш клиентский сертификат и раскрываем его. Далее заходим в приватный ключ и переходим в меню Access Control. Тут можно либо выбрать список приложений, которые имеют доступ к ключу и включить/выключить опцию доступа без пароля, либо разрешить всем приложениям иметь доступ к ключу.</p>
  <figure id="D7dV" class="m_column">
    <img src="https://img1.teletype.in/files/08/fc/08fcb91d-dc60-48bc-87b5-f2437eb65076.png" width="1784" />
  </figure>
  <p id="fg7A">Все, теперь браузеры такие как chrome или safari смогут использовать сертификат.</p>
  <h3 id="jES2">    Windows</h3>
  <p id="OScN">Тут даже без скриншотов =) Открываем сертификат p12 и импортируем, и импортируем cacert.pem в хранилище доверенных сертификатов.</p>
  <h3 id="snn6">    Burp</h3>
  <p id="KHcG">Переходим в настройки Burp - Network - TLS - Client TLS Certificates -Add</p>
  <p id="VRs8">Указываем домен или IP, кликаем далее и загружаем наш p12</p>
  <figure id="kKtF" class="m_column">
    <img src="https://img4.teletype.in/files/b7/58/b758fbac-8b1c-4954-9ed6-c31ad4be6a3a.png" width="2420" />
  </figure>
  <h3 id="vg0O">Footer</h3>
  <p id="HJIz">Предлагайте идеи, буду рад почитать и написать что-нибудь.</p>
  <p id="OM8V">Сделать это можно не только в комментарии тут, но и в Telegram канале <a href="https://t.me/lazysec" target="_blank">https://t.me/lazysec</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://blog.hackinone.click/burp_and_elk</guid><link>https://blog.hackinone.click/burp_and_elk?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scboln</link><comments>https://blog.hackinone.click/burp_and_elk?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=scboln#comments</comments><dc:creator>scboln</dc:creator><title>Burp + Elastic = Куча логов(багов?)</title><pubDate>Wed, 12 Jun 2024 15:11:22 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/e4/de/e4de914c-dbfe-498e-88f6-f84302c138fa.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/37/c5/37c543c8-cee0-4c9a-b8ff-d67041533979.png"></img>Периодически сталкиваюсь с тем, что мне нужны запросы из Burp которые я делал когда-то давно или необходимо посмотреть среди множества похожих запросов некоторые аномалии.]]></description><content:encoded><![CDATA[
  <nav>
    <ul>
      <li class="m_level_1"><a href="#YBJB">Интро</a></li>
      <li class="m_level_1"><a href="#Ffc7">Развертка ELK</a></li>
      <li class="m_level_2"><a href="#5u23">Что потребуется?</a></li>
      <li class="m_level_2"><a href="#h0Qg">Установка Docker (линки на оф.манулы)</a></li>
      <li class="m_level_2"><a href="#bVPb">Настройка/запуск ELK </a></li>
      <li class="m_level_1"><a href="#p8HH">Настройка Burp</a></li>
      <li class="m_level_2"><a href="#D9Oe">Плагины</a></li>
      <li class="m_level_2"><a href="#3PUC">Настройка сертификатов</a></li>
      <li class="m_level_2"><a href="#UBCO">Настройка плагина</a></li>
    </ul>
  </nav>
  <h2 id="YBJB">Интро</h2>
  <p id="FeJo">Периодически сталкиваюсь с тем, что мне нужны запросы из Burp которые я делал когда-то давно или необходимо посмотреть среди множества похожих запросов некоторые аномалии. </p>
  <p id="0hp4">Наверняка вы сразу подумали про то, что можно использовать и сохранять проекты. Но это не столь наглядно и вызывает трудности, когда необходимо посмотреть на всю &quot;картину&quot; в целом. </p>
  <p id="b76T">Немного походив вокруг задачи я решил развернуть ELK для ее решения.</p>
  <p id="Sb4X">Но что же может дать использование ELK? Зачем оно надо?</p>
  <p id="7A3t">Я заметил за собой, что часто пропускаю при анализе web-приложения такой параметр, как время ответа. И это ведет к тому, что потенциальные неочевидные уязвимые точки, например, содержащие SQLi, я могу просто не заметить. Используя ELK я могу на большом объеме посмотреть всю картину и найти аномалии по данному параметру.</p>
  <p id="sinC">Или можно представить кейс, когда появляется новая уязвимость в каком-то модуле или библиотеке. В таком случае, зная, предположим, паттерн пути, можно с легкостью найти весь ранее пройденый скоуп, который потенциально уязвим. И это не в рамках одного проекта, а всех.</p>
  <p id="OQRp"> </p>
  <h2 id="Ffc7">Развертка ELK</h2>
  <p id="7KF3">Весь процесс сводится к копипасте официальной документации. Ниже продублированы основные файлы и конфигурации на случай, если дока переедет или изменится, так же сделан <a href="https://web.archive.org/web/20240611213308/https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker-compose-file" target="_blank">снапшот страницы</a> через waybackmachineи файлов конфигурации <a href="https://web.archive.org/web/20240611215102/https://raw.githubusercontent.com/elastic/elasticsearch/8.14/docs/reference/setup/install/docker/.env" target="_blank">.env</a> и <a href="https://web.archive.org/web/20240612083601/https://raw.githubusercontent.com/elastic/elasticsearch/8.14/docs/reference/setup/install/docker/docker-compose.yml" target="_blank">docker-compose.yml</a></p>
  <p id="TLoW"></p>
  <h3 id="5u23">Что потребуется?</h3>
  <p id="Jb1O">Машинка с Docker и docker compose</p>
  <p id="NMxS">Если у вас есть только машинка - не беда. Докер поставить - задача одной минуты.</p>
  <p id="4QJp">Если нет машинки, то самое время найти такую. Себе под эксперементы я однажды взял Firebat MN56 и после небольшого тюнинга по ОЗУ и SSD, остаюсь полностью доволен по сей день.</p>
  <p id="xaLK"></p>
  <h3 id="h0Qg">Установка Docker (линки на оф.манулы)</h3>
  <p id="87rw">Официальные манулы по установке Docker Desktop (GUI) :</p>
  <ul id="hzKa">
    <li id="xFhU">Mac <a href="https://docs.docker.com/desktop/install/mac-install/" target="_blank">https://docs.docker.com/desktop/install/mac-install/</a></li>
    <li id="S9Up">Linux <a href="https://docs.docker.com/desktop/install/linux-install/" target="_blank">https://docs.docker.com/desktop/install/linux-install/</a></li>
    <li id="qHic">Windows <a href="https://docs.docker.com/desktop/install/windows-install/" target="_blank">https://docs.docker.com/desktop/install/windows-install/</a></li>
  </ul>
  <p id="K0df">Официальный манул на ubuntu (cli version) : </p>
  <ul id="WGLN">
    <li id="9rYW"><a href="https://docs.docker.com/engine/install/ubuntu/" target="_blank">https://docs.docker.com/engine/install/ubuntu/</a></li>
  </ul>
  <p id="FbET"></p>
  <h3 id="bVPb">Настройка/запуск ELK </h3>
  <p id="uDur">Развертывание в моем случае происходит на mini pc с Ubuntu 22.04 по инструкции <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker-compose-file" target="_blank">multi-node cluster</a> варианта.</p>
  <p id="WlVE">Выберете для себя каталог размещения файлов .env и docker-compose.yml. В примере я использую /srv/elk/.</p>
  <p id="Th1p">Создайте или сохраните файлы  <a href="https://raw.githubusercontent.com/elastic/elasticsearch/8.14/docs/reference/setup/install/docker/.env" target="_blank">.env</a> и <a href="https://raw.githubusercontent.com/elastic/elasticsearch/8.14/docs/reference/setup/install/docker/docker-compose.yml" target="_blank">docker-compose.yml</a>.</p>
  <p id="gXJG">Пример .env</p>
  <pre id="VWwH"># Password for the &#x27;elastic&#x27; user (at least 6 characters)
ELASTIC_PASSWORD=changeme

# Password for the &#x27;kibana_system&#x27; user (at least 6 characters)
KIBANA_PASSWORD=changeme

# Version of Elastic products
STACK_VERSION=8.14.0

# Set the cluster name
CLUSTER_NAME=docker-cluster

# Set to &#x27;basic&#x27; or &#x27;trial&#x27; to automatically start the 30-day trial
LICENSE=basic
#LICENSE=trial

# Port to expose Elasticsearch HTTP API to the host
ES_PORT=9200
#ES_PORT=127.0.0.1:9200

# Port to expose Kibana to the host
KIBANA_PORT=5601
#KIBANA_PORT=80

# Increase or decrease based on the available host memory (in bytes)
MEM_LIMIT=1073741824

# Project namespace (defaults to the current folder name if not set)
#COMPOSE_PROJECT_NAME=myproject</pre>
  <p id="FZX6"></p>
  <p id="qN17">Файл docker-compose.yml</p>
  <pre id="Uht2">services:
  setup:
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
    user: &quot;0&quot;
    command: &gt;
      bash -c &#x27;
        if [ x${ELASTIC_PASSWORD} == x ]; then
          echo &quot;Set the ELASTIC_PASSWORD environment variable in the .env file&quot;;
          exit 1;
        elif [ x${KIBANA_PASSWORD} == x ]; then
          echo &quot;Set the KIBANA_PASSWORD environment variable in the .env file&quot;;
          exit 1;
        fi;
        if [ ! -f config/certs/ca.zip ]; then
          echo &quot;Creating CA&quot;;
          bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip;
          unzip config/certs/ca.zip -d config/certs;
        fi;
        if [ ! -f config/certs/certs.zip ]; then
          echo &quot;Creating certs&quot;;
          echo -ne \
          &quot;instances:\n&quot;\
          &quot;  - name: es01\n&quot;\
          &quot;    dns:\n&quot;\
          &quot;      - es01\n&quot;\
          &quot;      - localhost\n&quot;\
          &quot;    ip:\n&quot;\
          &quot;      - 127.0.0.1\n&quot;\
          &quot;  - name: es02\n&quot;\
          &quot;    dns:\n&quot;\
          &quot;      - es02\n&quot;\
          &quot;      - localhost\n&quot;\
          &quot;    ip:\n&quot;\
          &quot;      - 127.0.0.1\n&quot;\
          &quot;  - name: es03\n&quot;\
          &quot;    dns:\n&quot;\
          &quot;      - es03\n&quot;\
          &quot;      - localhost\n&quot;\
          &quot;    ip:\n&quot;\
          &quot;      - 127.0.0.1\n&quot;\
          &gt; config/certs/instances.yml;
          bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key;
          unzip config/certs/certs.zip -d config/certs;
        fi;
        echo &quot;Setting file permissions&quot;
        chown -R root:root config/certs;
        find . -type d -exec chmod 750 \{\} \;;
        find . -type f -exec chmod 640 \{\} \;;
        echo &quot;Waiting for Elasticsearch availability&quot;;
        until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q &quot;missing authentication credentials&quot;; do sleep 30; done;
        echo &quot;Setting kibana_system password&quot;;
        until curl -s -X POST --cacert config/certs/ca/ca.crt -u &quot;elastic:${ELASTIC_PASSWORD}&quot; -H &quot;Content-Type: application/json&quot; https://es01:9200/_security/user/kibana_system/_password -d &quot;{\&quot;password\&quot;:\&quot;${KIBANA_PASSWORD}\&quot;}&quot; | grep -q &quot;^{}&quot;; do sleep 10; done;
        echo &quot;All done!&quot;;
      &#x27;
    healthcheck:
      test: [&quot;CMD-SHELL&quot;, &quot;[ -f config/certs/es01/es01.crt ]&quot;]
      interval: 1s
      timeout: 5s
      retries: 120

  es01:
    depends_on:
      setup:
        condition: service_healthy
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es02,es03
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es01/es01.key
      - xpack.security.http.ssl.certificate=certs/es01/es01.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es01/es01.key
      - xpack.security.transport.ssl.certificate=certs/es01/es01.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          &quot;CMD-SHELL&quot;,
          &quot;curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q &#x27;missing authentication credentials&#x27;&quot;,
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  es02:
    depends_on:
      - es01
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata02:/usr/share/elasticsearch/data
    environment:
      - node.name=es02
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es01,es03
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es02/es02.key
      - xpack.security.http.ssl.certificate=certs/es02/es02.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es02/es02.key
      - xpack.security.transport.ssl.certificate=certs/es02/es02.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          &quot;CMD-SHELL&quot;,
          &quot;curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q &#x27;missing authentication credentials&#x27;&quot;,
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  es03:
    depends_on:
      - es02
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata03:/usr/share/elasticsearch/data
    environment:
      - node.name=es03
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es01,es02
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es03/es03.key
      - xpack.security.http.ssl.certificate=certs/es03/es03.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es03/es03.key
      - xpack.security.transport.ssl.certificate=certs/es03/es03.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          &quot;CMD-SHELL&quot;,
          &quot;curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q &#x27;missing authentication credentials&#x27;&quot;,
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  kibana:
    depends_on:
      es01:
        condition: service_healthy
      es02:
        condition: service_healthy
      es03:
        condition: service_healthy
    image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
    volumes:
      - certs:/usr/share/kibana/config/certs
      - kibanadata:/usr/share/kibana/data
    ports:
      - ${KIBANA_PORT}:5601
    environment:
      - SERVERNAME=kibana
      - ELASTICSEARCH_HOSTS=https://es01:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
      - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
    mem_limit: ${MEM_LIMIT}
    healthcheck:
      test:
        [
          &quot;CMD-SHELL&quot;,
          &quot;curl -s -I http://localhost:5601 | grep -q &#x27;HTTP/1.1 302 Found&#x27;&quot;,
        ]
      interval: 10s
      timeout: 10s
      retries: 120

volumes:
  certs:
    driver: local
  esdata01:
    driver: local
  esdata02:
    driver: local
  esdata03:
    driver: local
  kibanadata:
    driver: local</pre>
  <p id="JwHR">Самые внимательные наверняка заметили, что в варианте описаном выше отсутствует строка <code>version: &quot;2.2&quot;</code>. Это сделано специально, т.к. в последних версиях docker compose свойство version устарело и больше не используется.</p>
  <p id="pvoT"></p>
  <p id="SNHb">Теперь для запуска остается выполнить команду </p>
  <blockquote id="kKxr">docker compose up -d </blockquote>
  <p id="aCwF">И подождать минут 5, пока первоначальный процесс установки закончится.</p>
  <p id="wYY4"></p>
  <p id="bGGe">После запуска идем в kibana </p>
  <blockquote id="Mb7W">http://ip_вашей_машины:5601/app/enterprise_search/content/search_indices</blockquote>
  <p id="5pus">Вводим логин <code>elastic</code> и пароль из переменной <code>ELASTIC_PASSWORD=</code></p>
  <p id="iVAc">Тут нам необходимо создать индекс, который будет содержать в себе данные из burp</p>
  <figure id="IQ9t" class="m_column">
    <img src="https://img4.teletype.in/files/37/c5/37c543c8-cee0-4c9a-b8ff-d67041533979.png" width="2120" />
  </figure>
  <figure id="gOmi" class="m_column">
    <img src="https://img1.teletype.in/files/cf/bc/cfbc3ae7-7818-4daa-90ca-e36e02b5de82.png" width="2120" />
  </figure>
  <p id="BgCe"></p>
  <h2 id="p8HH">Настройка Burp</h2>
  <h3 id="D9Oe">Плагины</h3>
  <p id="M6Hx">Приступаем к самому интересному.</p>
  <p id="yk3P">Как же заставить Burp отправлять логи в Elastic? Посмотрим, что предлагает BApp Store и не только:</p>
  <ol id="FEMz">
    <li id="QOf5">ElasticBurp</li>
    <li id="bM9p">Report To Elastic Search</li>
    <li id="fibY">Logger++</li>
    <li id="TbYH">ElasticBurp-NG (отсутствует в BApp Store)</li>
  </ol>
  <p id="Y2iG">Я попробовал все варианты. Какими выводами я могу с вами поделиться:</p>
  <p id="brFE">ElasticBurp, ElasticBurp-NG (Next Generation!!!11) и Report To Elastic Search - это все разные стороны одной кучи 💩</p>
  <p id="z9Uh">Эти плагины считают, что соединение к elastic должно быть по http и без аутентификации.</p>
  <p id="YBoF">Другое дело Logger++, но нужена версия с <a href="https://github.com/nccgroup/LoggerPlusPlus/releases" target="_blank">github от nccgroup, </a>т.к. в BApp Store лежит древняя.</p>
  <p id="CE8S">Итак, мы поставили плагин и уже хотим пойти в настройки. Но именно на данном этапе стоит сделать шаг в сторону.</p>
  <p id="XPXO"></p>
  <h3 id="3PUC">Настройка сертификатов</h3>
  <p id="NPoh">В используемой конфигурации elastic&#x27;а, соединение возможно только через https.  Поэтому для корректной работы необходимо добавить сертификат сервера в доверенные сертификаты той Java, которая используется Burp&#x27;ом.</p>
  <p id="tkrc">Интернет полон следующим адресом хранилища сертификатов <code>$JAVA_HOME/jre/lib/security/cacerts</code>, однако это не применимо к Burp под MacOS тк там используется поставляемый, вместе с Burp&#x27;ом, Java bundle.</p>
  <p id="YWhv">Как быть, если мы MacOS пользователи.</p>
  <p id="HVI3">Для начала сохраним наш сертификат в домашний каталог пользователя на нашей MacOS</p>
  <p id="Fqph"><code>openssl x509 -in &lt;(openssl s_client -connect адрес_вашего_сервера:9200 -prexit 2&gt;/dev/null) -out ./elk.crt</code></p>
  <p id="fZAR">Затем &quot;пропатчим&quot; хранилище сертификатов Java bundle </p>
  <p id="SyFH"><code>sudo keytool -importcert -file ~/elk.crt -alias example -keystore /Applications/Burp\ Suite\ Professional.app/Contents/Resources/jre.bundle/Contents/Home/lib/security/cacerts -storepass changeit</code></p>
  <p id="zNhi">Теперь момент о котором легко забыть - мы добавили сертификат, в котором указан Common Name: es01. В таком случае при обращении по IP мы будем получать сообщение о несоответствии сертификата к хостнейму.</p>
  <p id="LtW2">Для обхода этого необходимо добавить банальные записи в /etc/hosts </p>
  <p id="jdXX"><code>sudo vim /etc/hosts</code></p>
  <blockquote id="ZktJ">192.168.100.27	es01 # тут нужно указать ваш адрес сервера</blockquote>
  <p id="qoUQ"></p>
  <h3 id="UBCO">Настройка плагина</h3>
  <p id="B1bQ">Данный пунк весьма прост. Идем в настройки плагина и выставляем общие настройки по желанию и необходимости, а настройки соединения приводим к следующему виду</p>
  <figure id="65Gz" class="m_column">
    <img src="https://img2.teletype.in/files/d4/c2/d4c2e004-9482-4179-9dd0-491054daf0e6.png" width="1204" />
  </figure>
  <p id="r5in">Не забудьте про кнопку Configure </p>
  <figure id="JzEl" class="m_column">
    <img src="https://img1.teletype.in/files/45/6b/456b61af-6432-463f-ab12-fe76ac444050.png" width="970" />
  </figure>
  <p id="bePH">Все. Теперь вы можете наслаждаться логами в Kibana <a href="http://es01:5601/app/discover#/" target="_blank">http://es01:5601/app/discover#/</a> , смотреть, фильтровать и строить визуализации.</p>

]]></content:encoded></item></channel></rss>