<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Alex M</title><author><name>Alex M</name></author><id>https://teletype.in/atom/scboln</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/scboln?offset=0"></link><link rel="alternate" type="text/html" href="https://blog.hackinone.click/?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=scboln"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/scboln?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-07-16T06:00:29.189Z</updated><entry><id>scboln:basic-auth-must-die</id><link rel="alternate" type="text/html" href="https://blog.hackinone.click/basic-auth-must-die?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=scboln"></link><title>Прикончить деда: переход с Basic Auth на mTLS</title><published>2025-01-16T00:57:10.208Z</published><updated>2025-02-13T23:00:00.421Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/fa/64/fa644286-b30e-42ef-b561-84db663f4c7a.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/0d/8f/0d8f47fb-5cf7-4c6f-b87b-b9aec8eaa906.png&quot;&gt;Как часто вы хотели что-то развернуть и думали, а как прикрыть это от внешнего мира? Я довольно часто.</summary><content type="html">
  &lt;nav&gt;
    &lt;ul&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#tU6o&quot;&gt;Интро&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#AJru&quot;&gt;Зачем это все нужно&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_1&quot;&gt;&lt;a href=&quot;#hFGc&quot;&gt;Процесс настройки&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#Ksov&quot;&gt;Серверная сторона&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#NouU&quot;&gt;Преднастройка&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#6jpG&quot;&gt;    ПО&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#vXcD&quot;&gt;    Центр Сертификатов&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#Jpc7&quot;&gt;Создание сертификатов&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#lN5L&quot;&gt;    CA cert&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#cYYt&quot;&gt;    Сертификат сервера&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#omQK&quot;&gt;    Сертификат клиента&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#5IZN&quot;&gt;    Список отозванных сертификатов (CRL) &lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#F4vY&quot;&gt;    Цепочка сертификатов (Full Chain)&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#lcUH&quot;&gt;    Отзыв сертификата&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#wOQJ&quot;&gt;    Настройка nginx&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#zpHH&quot;&gt;Настройка клиента&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#uwb8&quot;&gt;    Перемещение на клиента&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#Wu8P&quot;&gt;    Установка на клиенте&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#u2QX&quot;&gt;    Firefox&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#bnCY&quot;&gt;    MacOS&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#jES2&quot;&gt;    Windows&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#snn6&quot;&gt;    Burp&lt;/a&gt;&lt;/li&gt;
      &lt;li class=&quot;m_level_2&quot;&gt;&lt;a href=&quot;#vg0O&quot;&gt;Footer&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/nav&gt;
  &lt;h2 id=&quot;tU6o&quot;&gt;Интро&lt;/h2&gt;
  &lt;p id=&quot;Bj63&quot;&gt;Как часто вы хотели что-то развернуть и думали, а как прикрыть это от внешнего мира? Я довольно часто.&lt;/p&gt;
  &lt;p id=&quot;XO5y&quot;&gt;Есть у меня своего рода фетиш, разворачивать разные сервисы для личных нужд. Например:&lt;/p&gt;
  &lt;ul id=&quot;rJf6&quot;&gt;
    &lt;li id=&quot;lB1q&quot;&gt;Gitea, для синхронизации Obsidian&lt;/li&gt;
    &lt;li id=&quot;yMtw&quot;&gt;Сhangedetection, для мониторинга изменений на сайтах&lt;/li&gt;
    &lt;li id=&quot;N4wS&quot;&gt;Hive от Hexway, для ведения файдингов на багбанти &lt;/li&gt;
    &lt;li id=&quot;DaRT&quot;&gt;n8n для автоматизаций&lt;br /&gt;и многое другое что можно найти в репозитории &lt;a href=&quot;https://github.com/awesome-selfhosted/awesome-selfhosted&quot; target=&quot;_blank&quot;&gt;awesome-selfhosted&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Ieqv&quot;&gt;Если в части сервисов у меня нет важной информации, то с Hive ситуация совершенно иная и его необходимо прикрыть дополнительным слоем защиты.&lt;br /&gt;&lt;br /&gt;Первым на ум приходил старик Basic Auth. Но он подкидывает проблем тк подвергается бруту да и передается через заголовки преобразованных в base64.&lt;br /&gt;В один прекрасный момент я вспомнил, что еще в далеком 2014 настраивал доступ к сервису RoundCube (Web интерфейс для работы с почтой) через mTLS. &lt;br /&gt;&lt;br /&gt;Кто же такой mTLS? &lt;br /&gt;Простым языком, это проверка сертификата с двух сторон. Не только Вы проверяете, что сервер имеет нужный сертификат, но и сам сервер запрашивает ваш клиентский сертификат для проверки и предоставления доступа.&lt;/p&gt;
  &lt;p id=&quot;vIyN&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;AJru&quot;&gt;Зачем это все нужно&lt;/h2&gt;
  &lt;p id=&quot;onWA&quot;&gt;Могу отметить следующие плюсы:&lt;/p&gt;
  &lt;ul id=&quot;Iyaw&quot;&gt;
    &lt;li id=&quot;KAcw&quot;&gt;Это удобно, вам не потребуется дополнительно вводить логин и пароль от Basic Auth&lt;/li&gt;
    &lt;li id=&quot;9uSd&quot;&gt;Если Вы по какой-то причине не умели в сертификаты, у вас появится https вместо http.&lt;/li&gt;
    &lt;li id=&quot;3uCI&quot;&gt;Вам перестанут брутфорсить Basic Auth&lt;/li&gt;
    &lt;li id=&quot;ckTz&quot;&gt;Логин и пароль проще украсть нежели сертификат, следовательно это безопаснее&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;hFGc&quot;&gt;Процесс настройки&lt;/h2&gt;
  &lt;p id=&quot;Ktvz&quot;&gt;Не пугайтесь, да этот процесс сложнее Basic Auth, но я опишу все под ctrl+c, ctrl+v.&lt;br /&gt;Так же в этой статье не будет страшных слов, таких как Vault от Hashicorp, все постараюсь описать максимально просто. &lt;/p&gt;
  &lt;blockquote id=&quot;A7pW&quot;&gt;Для ознакомления с механизмом, пример будет с использованием самоподписанного сертификата, где корневой центр сертификации и сервис доступный через mTLS размещены на одном сервере. &lt;/blockquote&gt;
  &lt;p id=&quot;iNMI&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Ksov&quot;&gt;Серверная сторона&lt;/h3&gt;
  &lt;p id=&quot;Wwtq&quot;&gt;Представим, что у вас есть сервер доступный через интернет с Ubuntu Linux на борту. &lt;br /&gt;&lt;/p&gt;
  &lt;h3 id=&quot;NouU&quot;&gt;Преднастройка&lt;/h3&gt;
  &lt;h3 id=&quot;6jpG&quot;&gt;    ПО&lt;/h3&gt;
  &lt;p id=&quot;AK16&quot;&gt;Если у вас уже установлен nginx и openssl - хорошо. Если нет, то:&lt;/p&gt;
  &lt;pre id=&quot;Wbh4&quot;&gt;sudo apt install openssl nginx
sudo systemctl enable nginx
sudo service nginx start&lt;/pre&gt;
  &lt;blockquote id=&quot;lMxn&quot;&gt;Конечно nginx у нас может быть в docker, но сегодня мы рассмотрим распространненную ситуацию, без глубокого погружения в сети и конфигурирования взаимодействия между docker контейнерами.&lt;/blockquote&gt;
  &lt;p id=&quot;vYNp&quot;&gt;Развернем тестовое приложение docker:&lt;/p&gt;
  &lt;pre id=&quot;le9a&quot;&gt;sudo docker run -d --rm -p 127.0.0.1:3000:3000 bkimminich/juice-shop&lt;/pre&gt;
  &lt;blockquote id=&quot;5oiG&quot;&gt;Если docker не установлен, то вам сюда &lt;a href=&quot;https://docs.docker.com/engine/install/ubuntu/&quot; target=&quot;_blank&quot;&gt;https://docs.docker.com/engine/install/ubuntu/&lt;/a&gt;&lt;br /&gt;После выполнения команды будет запущен Juice Shop на http://127.0.0.1:3000&lt;/blockquote&gt;
  &lt;p id=&quot;wgnI&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;vXcD&quot;&gt;    Центр Сертификатов&lt;/h3&gt;
  &lt;p id=&quot;Xoce&quot;&gt;Создание каталогов для работы с сертификатами:&lt;/p&gt;
  &lt;pre id=&quot;kRfM&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;EWam&quot;&gt;Создадим индекс файл для хранения информации о сертификатах:&lt;/p&gt;
  &lt;pre id=&quot;7awZ&quot;&gt;sudo touch /etc/ssl/mtls/ca/index.txt&lt;/pre&gt;
  &lt;p id=&quot;UBiC&quot;&gt;Создадим файлы с id от которых пойдет отсчет наших выданных и отозванных сертификатов (исторически id от 1000):&lt;/p&gt;
  &lt;pre id=&quot;IYdx&quot;&gt;sudo echo 1000 &amp;gt; /etc/ssl/mtls/ca/crlnumber
sudo echo 1000 &amp;gt; /etc/ssl/mtls/ca/serial&lt;/pre&gt;
  &lt;p id=&quot;DaZI&quot;&gt;Создадим свой файл конфигурации openssl:&lt;/p&gt;
  &lt;pre id=&quot;eGFy&quot;&gt;sudo vim /etc/ssl/mtls/openssl.cnf&lt;/pre&gt;
  &lt;blockquote id=&quot;SHE0&quot;&gt;(!) Обратите особое внимание на блок [ alt_names ], в примере ниже использован мой домен, его 100% необходимо заменить на ваши данные&lt;/blockquote&gt;
  &lt;pre id=&quot;ZfAM&quot;&gt;[ 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&lt;/pre&gt;
  &lt;p id=&quot;A44Y&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;Jpc7&quot;&gt;Создание сертификатов&lt;/h3&gt;
  &lt;h3 id=&quot;lN5L&quot;&gt;    CA cert&lt;/h3&gt;
  &lt;p id=&quot;lgoL&quot;&gt;Создание ключа корневого сертификата:&lt;br /&gt;Во многих статьях показан процесс сначала генерации ключа, затем выпуска сертификата. Но я человек ленивый и делаю все в одном&lt;/p&gt;
  &lt;blockquote id=&quot;iOXQ&quot;&gt;(!) Потребуется ввести пароль, это самый главный пароль который стоит хорошо спрятать и не потерять он на потребуеться довольно часто.&lt;br /&gt;(!) Будет интерактивное меню ввода данных, часть из них можно предзаполнить в нашем openssl.cnf&lt;br /&gt;(!) В данном случае commonName можно заполнить как угодно, например Evil Corp CA&lt;/blockquote&gt;
  &lt;pre id=&quot;wlxi&quot;&gt;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  &lt;/pre&gt;
  &lt;p id=&quot;OyQZ&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;cYYt&quot;&gt;    Сертификат сервера&lt;/h3&gt;
  &lt;p id=&quot;HmPQ&quot;&gt;Сертификат сервера (server.crt) в данном случае, это сертификат который будет закреплен за IP или dns нашего сервиса.&lt;/p&gt;
  &lt;p id=&quot;1N5H&quot;&gt;Ключ сервера можно сделать слабее так как он в отличии от CA будет с меньшим сроком жизни&lt;/p&gt;
  &lt;p id=&quot;u8LZ&quot;&gt;Создание ключа и запроса сервера на подписание нашего сертификата, корневым сертификатом:&lt;/p&gt;
  &lt;pre id=&quot;6pNC&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;h3O0&quot;&gt;Теперь подпишем сертификат сервера:&lt;/p&gt;
  &lt;blockquote id=&quot;UhVr&quot;&gt;(!) Будет запрос на ввод пароля, того самого который использовался для ключа корневого сертификата.&lt;br /&gt;(!) При заполнении commonName необходимо указать &lt;strong&gt;ваш IP&lt;/strong&gt; (если у вас нет домена) или &lt;strong&gt;dns имя&lt;/strong&gt; которое будет в дальнейшем использоваться. В моем случае я указал *.0q.lol.&lt;br /&gt;Обратите внимание, что используется ключ -extensions v3_req, это указывает на раздел применяемых настроек из нашего openssl.cnf&lt;/blockquote&gt;
  &lt;pre id=&quot;jRLX&quot;&gt;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   &lt;/pre&gt;
  &lt;p id=&quot;6YJx&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;omQK&quot;&gt;    Сертификат клиента&lt;/h3&gt;
  &lt;p id=&quot;d8ht&quot;&gt;Создание ключа и запроса клиента на подписание нашего сертификата, корневым сертификатом:&lt;/p&gt;
  &lt;pre id=&quot;ti1q&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;9Vtt&quot;&gt;Теперь подпишем сертификат клиента:&lt;/p&gt;
  &lt;blockquote id=&quot;uQlT&quot;&gt;(!) Будет запрос на ввод пароля, того самого который использовался для ключа корневого сертификата.&lt;br /&gt;(!) При заполнении commonName необходимо &lt;strong&gt;имя клиента&lt;/strong&gt;, например ник.&lt;br /&gt;Обратите внимание, что используется ключ -extensions v3_client, это указывает на раздел применяемых настроек из нашего openssl.cnf&lt;/blockquote&gt;
  &lt;pre id=&quot;ROGw&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;aRiQ&quot;&gt;Теперь для удобства использования можно объединить ключ клиента и его сертификат:&lt;/p&gt;
  &lt;blockquote id=&quot;xQfp&quot;&gt;(!) При экспорте будет запрошен пароль для шифрования наших данных внутри client.p12, он еще пригодиться при настройке клиента. &lt;br /&gt;Вы так же наверняка заметите странный ключ legacy. Данный ключ нужен, чтобы охватить большее число клиентов, которые смогут понять этот сертификат, например MacOS.&lt;br /&gt;Ключ name в некоторых системах позволяет визуально выделить сертификат среди других. &lt;/blockquote&gt;
  &lt;pre id=&quot;HDdq&quot;&gt;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&lt;/pre&gt;
  &lt;p id=&quot;Bj1j&quot;&gt;После того как у нас есть client.p12, можно удалить client.crt и client.key&lt;/p&gt;
  &lt;h3 id=&quot;5IZN&quot;&gt;    Список отозванных сертификатов (CRL) &lt;/h3&gt;
  &lt;p id=&quot;Rd5o&quot;&gt;Мы должны создадать специальный файл со списком отозванных сертификатов, чтобы сервер мог проверить например, не отозван ли сертификат клиента.&lt;/p&gt;
  &lt;pre id=&quot;gNWW&quot;&gt;sudo openssl ca -config /etc/ssl/mtls/openssl.cnf \
  -gencrl -out /etc/ssl/mtls/ca/crl.pem  &lt;/pre&gt;
  &lt;h3 id=&quot;F4vY&quot;&gt;    Цепочка сертификатов (Full Chain)&lt;/h3&gt;
  &lt;p id=&quot;obhj&quot;&gt;Для доверия нашему CA нам потребуеться на машине клиента помимо клиентского сертификата, так же установить и цепоцку сертификатов server + CA&lt;/p&gt;
  &lt;p id=&quot;RRo5&quot;&gt;Это делается элементарно просто&lt;/p&gt;
  &lt;pre id=&quot;yazx&quot;&gt;sudo cat /etc/ssl/mtls/server.crt \
    /etc/ssl/mtls/ca/cacert.pem &amp;gt; /etc/ssl/mtls/full_chain.pem&lt;/pre&gt;
  &lt;h3 id=&quot;lcUH&quot;&gt;    Отзыв сертификата&lt;/h3&gt;
  &lt;p id=&quot;4J9M&quot;&gt;Далеко не уходя, чтобы отозвать сертификат, который вам больше не нужен, можно воспользоваться командой:&lt;/p&gt;
  &lt;pre id=&quot;JIIB&quot;&gt;sudo openssl ca -config /etc/ssl/mtls/openssl.cnf \
  -revoke /etc/ssl/mtls/client.crt &lt;/pre&gt;
  &lt;p id=&quot;EqvY&quot;&gt;Если же у нас не сохранился сертификат на сервере, что после конечной настройки будет правильным путем, то можно отозвать по серийному номеру.&lt;/p&gt;
  &lt;p id=&quot;MrpP&quot;&gt;Для этого можем посмотреть, какие сертификаты у нас есть в index&amp;#x27;е:&lt;/p&gt;
  &lt;pre id=&quot;bGsW&quot;&gt;sudo vim /etc/ssl/mtls/ca/index.txt&lt;/pre&gt;
  &lt;p id=&quot;1aw9&quot;&gt;Затем отозвать подставив серийный номер:&lt;/p&gt;
  &lt;pre id=&quot;n9G9&quot;&gt;sudo openssl ca -revoke -serial &amp;lt;серийный_номер&amp;gt; \
    -config /etc/ssl/mtls/openssl.cnf    &lt;/pre&gt;
  &lt;p id=&quot;9dk1&quot;&gt;ВАЖНО! Не забудте пересоздать crl.pem и перезапустить nginx&lt;/p&gt;
  &lt;pre id=&quot;qoJp&quot;&gt;sudo openssl ca -config /etc/ssl/mtls/openssl.cnf \
  -gencrl -out /etc/ssl/mtls/ca/crl.pem
sudo nginx -t &amp;amp;&amp;amp; sudo nginx -s reload&lt;/pre&gt;
  &lt;h3 id=&quot;wOQJ&quot;&gt;    Настройка nginx&lt;/h3&gt;
  &lt;p id=&quot;2wKm&quot;&gt;Теперь настроим nginx для работы с сертификатами и нашим сервисом на http://127.0.0.1:3000&lt;/p&gt;
  &lt;p id=&quot;M5xX&quot;&gt;Первым делом отредактируем основной файл конфигурации nginx:&lt;/p&gt;
  &lt;pre id=&quot;Lrny&quot;&gt;sudo vim /etc/nginx/nginx.conf&lt;/pre&gt;
  &lt;p id=&quot;nAxE&quot;&gt;В секции http раскомментируем строчку &amp;quot;server_tokens off;&amp;quot;&lt;br /&gt;Данный параметр отвечает за отключение заголовков версии nginx, мы же не хотим чтобы весь интернет знал под какую версию искать CVE =)&lt;/p&gt;
  &lt;p id=&quot;1YIl&quot;&gt;Далее создадим конфигурацию для сервиса:&lt;/p&gt;
  &lt;pre id=&quot;ekjL&quot;&gt;sudo vim /etc/nginx/sites-available/mtls&lt;/pre&gt;
  &lt;p id=&quot;rpwq&quot;&gt;Заполним файл:&lt;/p&gt;
  &lt;pre id=&quot;9JKS&quot;&gt;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;
    }
}&lt;/pre&gt;
  &lt;p id=&quot;GwhT&quot;&gt;Создадим ссылку для &amp;quot;включения&amp;quot; конфигурации сервера nginx&lt;/p&gt;
  &lt;pre id=&quot;rGEC&quot;&gt;sudo ln -s /etc/nginx/sites-available/redirects.conf /etc/nginx/sites-enabled/redirects.conf&lt;/pre&gt;
  &lt;p id=&quot;triH&quot;&gt;Теперь &lt;s&gt;питание компьютера можно отключить&lt;/s&gt; можно перезапустить nginx:&lt;/p&gt;
  &lt;pre id=&quot;Y2Ki&quot;&gt;sudo nginx -t &amp;amp;&amp;amp; sudo nginx -s reload&lt;/pre&gt;
  &lt;p id=&quot;O6mA&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;zpHH&quot;&gt;Настройка клиента&lt;/h3&gt;
  &lt;h3 id=&quot;uwb8&quot;&gt;    Перемещение на клиента&lt;/h3&gt;
  &lt;p id=&quot;Rf5P&quot;&gt;Для клиента нам потребуется стянуть сертификаты с сервера, сделать это можно например так:&lt;/p&gt;
  &lt;p id=&quot;SZUt&quot;&gt;Копируем нужные сертификаты &lt;/p&gt;
  &lt;pre id=&quot;rqNy&quot;&gt;sudo cp /etc/ssl/mtls/{client.p12,full_chain.pem} ~/
sudo cp /etc/ssl/mtls/ca/cacert.pem ~/&lt;/pre&gt;
  &lt;p id=&quot;poz6&quot;&gt;Теперь для просто ты перемещения сожмем&lt;/p&gt;
  &lt;pre id=&quot;4jiW&quot;&gt;sudo zip -r client.zip client.p12 full_chain.pem cacert.pem
sudo chown &amp;lt;юзер&amp;gt;:&amp;lt;юзер&amp;gt; client.zip&lt;/pre&gt;
  &lt;p id=&quot;3rxa&quot;&gt;И переместим на свою машину например с помощью scp&lt;/p&gt;
  &lt;pre id=&quot;ke1N&quot;&gt;scp &amp;lt;юзер&amp;gt;@&amp;lt;хост&amp;gt;:/home/&amp;lt;юзер&amp;gt;/client.zip /&amp;lt;путь куда сохранить&amp;gt;/&lt;/pre&gt;
  &lt;h3 id=&quot;Wu8P&quot;&gt;    Установка на клиенте&lt;/h3&gt;
  &lt;p id=&quot;Vegr&quot;&gt;На клиенте расспаковываем архив и определяем в чем же мы хотим использовать сертификат. &lt;/p&gt;
  &lt;p id=&quot;bZPe&quot;&gt;О чем это я, нам предстоит импортировать сертфикаты и выставить доверие. Для этого необходимо поместить их в хранилище сертификатов, а оно у некоторого ПО свое. &lt;/p&gt;
  &lt;p id=&quot;9i9v&quot;&gt;Например, firefox может не работать с системным хранилищем, в то время как chrome работает только с системным.&lt;/p&gt;
  &lt;p id=&quot;ZZCa&quot;&gt;Поэтому, вынесем настройку firefox отдельно =)&lt;/p&gt;
  &lt;h3 id=&quot;u2QX&quot;&gt;    Firefox&lt;/h3&gt;
  &lt;p id=&quot;PVxJ&quot;&gt;Открыв настройки в firefox, воспользуйтесь поиском (так быстрее), введите серт или cert в зависимости от используемой локали. &lt;/p&gt;
  &lt;p id=&quot;km5L&quot;&gt;Если у вас включен third-party root certificates, то сертификаты будут подтягиваться с системного хранилища сертификатов.&lt;/p&gt;
  &lt;figure id=&quot;SIoC&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/30/9d/309dc0f3-d924-4fd7-9a80-d4df88417032.png&quot; width=&quot;1568&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;yYQm&quot;&gt;Если же такой настройки нет или она по неким соображениям выключена, то открываем просмотр сертификатов&lt;br /&gt;Далее идем во вкладку корневых центров сертификаци и импортируем наш сертификат cacert.pem:&lt;/p&gt;
  &lt;figure id=&quot;EjUj&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/9b/57/9b5716f7-0a69-499f-8e76-cc8ef709a133.png&quot; width=&quot;1472&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;AZsP&quot;&gt;Выставляем доверие для Web &lt;/p&gt;
  &lt;figure id=&quot;0Dyh&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/83/74/837417e1-1893-4124-a30b-da7743c48c60.png&quot; width=&quot;1374&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;nzM2&quot;&gt;И переходим во вкладку клиентских сертификатов, так же импортируем и вводим пароль от p12:&lt;/p&gt;
  &lt;figure id=&quot;VuWz&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/eb/c0/ebc0c60e-0776-48ce-8237-9b3327903514.png&quot; width=&quot;1444&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;ah9Q&quot;&gt;Все, теперь при переходе на ваш сайт, будет всплывающее окно с выбором сертификата доступа, после подтверждения вы и только вы попадете внутрь.&lt;/p&gt;
  &lt;h3 id=&quot;bnCY&quot;&gt;    MacOS&lt;/h3&gt;
  &lt;p id=&quot;r6an&quot;&gt;Для настройки нам потребуется запустить Keychain Access&lt;/p&gt;
  &lt;p id=&quot;CYkY&quot;&gt;В нем переходим в System - Certificates, после чего в верхнем меню выбираем File - Import Item, и загружаем fullchain.pem&lt;/p&gt;
  &lt;figure id=&quot;oLvn&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/a6/5e/a65e7a0e-5916-4cdb-9ad2-8c2e46a36103.png&quot; width=&quot;1440&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7OJs&quot;&gt;Далее надо установить доверие корневому сертификату, выбираем наш корневой сертификат и открываем его. Далее разворачиваем блок &amp;quot;Trust&amp;quot; и выставляем &amp;quot;Always Trust&amp;quot;.&lt;/p&gt;
  &lt;p id=&quot;gc2M&quot;&gt;После этого наш второй сертификат (сервера), который так же поместился в хранилище, автоматически станет доверенным.&lt;/p&gt;
  &lt;figure id=&quot;7eG6&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/4b/8c/4b8cf34c-4b32-4c60-a88e-01cb173c85a7.png&quot; width=&quot;1402&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;TAMg&quot;&gt;Ровно таким же образом загружается и client.p12&lt;/p&gt;
  &lt;p id=&quot;gaJV&quot;&gt;Думали на этом все? Не тут то было.&lt;/p&gt;
  &lt;p id=&quot;iN2Q&quot;&gt;В MacOS если вы хотите дать доступ до сертификата приложениям и не хотите каждый раз вводить пароль необходимо проделать еще несколько шагов.&lt;/p&gt;
  &lt;p id=&quot;CeAH&quot;&gt;Находим наш клиентский сертификат и раскрываем его. Далее заходим в приватный ключ и переходим в меню Access Control. Тут можно либо выбрать список приложений, которые имеют доступ к ключу и включить/выключить опцию доступа без пароля, либо разрешить всем приложениям иметь доступ к ключу.&lt;/p&gt;
  &lt;figure id=&quot;D7dV&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/08/fc/08fcb91d-dc60-48bc-87b5-f2437eb65076.png&quot; width=&quot;1784&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;fg7A&quot;&gt;Все, теперь браузеры такие как chrome или safari смогут использовать сертификат.&lt;/p&gt;
  &lt;h3 id=&quot;jES2&quot;&gt;    Windows&lt;/h3&gt;
  &lt;p id=&quot;OScN&quot;&gt;Тут даже без скриншотов =) Открываем сертификат p12 и импортируем, и импортируем cacert.pem в хранилище доверенных сертификатов.&lt;/p&gt;
  &lt;h3 id=&quot;snn6&quot;&gt;    Burp&lt;/h3&gt;
  &lt;p id=&quot;KHcG&quot;&gt;Переходим в настройки Burp - Network - TLS - Client TLS Certificates -Add&lt;/p&gt;
  &lt;p id=&quot;VRs8&quot;&gt;Указываем домен или IP, кликаем далее и загружаем наш p12&lt;/p&gt;
  &lt;figure id=&quot;kKtF&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/b7/58/b758fbac-8b1c-4954-9ed6-c31ad4be6a3a.png&quot; width=&quot;2420&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;vg0O&quot;&gt;Footer&lt;/h3&gt;
  &lt;p id=&quot;HJIz&quot;&gt;Предлагайте идеи, буду рад почитать и написать что-нибудь.&lt;/p&gt;
  &lt;p id=&quot;OM8V&quot;&gt;Сделать это можно не только в комментарии тут, но и в Telegram канале &lt;a href=&quot;https://t.me/lazysec&quot; target=&quot;_blank&quot;&gt;https://t.me/lazysec&lt;/a&gt;&lt;/p&gt;

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

# Password for the &amp;#x27;kibana_system&amp;#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 &amp;#x27;basic&amp;#x27; or &amp;#x27;trial&amp;#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&lt;/pre&gt;
  &lt;p id=&quot;FZX6&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;qN17&quot;&gt;Файл docker-compose.yml&lt;/p&gt;
  &lt;pre id=&quot;Uht2&quot;&gt;services:
  setup:
    image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
    user: &amp;quot;0&amp;quot;
    command: &amp;gt;
      bash -c &amp;#x27;
        if [ x${ELASTIC_PASSWORD} == x ]; then
          echo &amp;quot;Set the ELASTIC_PASSWORD environment variable in the .env file&amp;quot;;
          exit 1;
        elif [ x${KIBANA_PASSWORD} == x ]; then
          echo &amp;quot;Set the KIBANA_PASSWORD environment variable in the .env file&amp;quot;;
          exit 1;
        fi;
        if [ ! -f config/certs/ca.zip ]; then
          echo &amp;quot;Creating CA&amp;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 &amp;quot;Creating certs&amp;quot;;
          echo -ne \
          &amp;quot;instances:\n&amp;quot;\
          &amp;quot;  - name: es01\n&amp;quot;\
          &amp;quot;    dns:\n&amp;quot;\
          &amp;quot;      - es01\n&amp;quot;\
          &amp;quot;      - localhost\n&amp;quot;\
          &amp;quot;    ip:\n&amp;quot;\
          &amp;quot;      - 127.0.0.1\n&amp;quot;\
          &amp;quot;  - name: es02\n&amp;quot;\
          &amp;quot;    dns:\n&amp;quot;\
          &amp;quot;      - es02\n&amp;quot;\
          &amp;quot;      - localhost\n&amp;quot;\
          &amp;quot;    ip:\n&amp;quot;\
          &amp;quot;      - 127.0.0.1\n&amp;quot;\
          &amp;quot;  - name: es03\n&amp;quot;\
          &amp;quot;    dns:\n&amp;quot;\
          &amp;quot;      - es03\n&amp;quot;\
          &amp;quot;      - localhost\n&amp;quot;\
          &amp;quot;    ip:\n&amp;quot;\
          &amp;quot;      - 127.0.0.1\n&amp;quot;\
          &amp;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 &amp;quot;Setting file permissions&amp;quot;
        chown -R root:root config/certs;
        find . -type d -exec chmod 750 \{\} \;;
        find . -type f -exec chmod 640 \{\} \;;
        echo &amp;quot;Waiting for Elasticsearch availability&amp;quot;;
        until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q &amp;quot;missing authentication credentials&amp;quot;; do sleep 30; done;
        echo &amp;quot;Setting kibana_system password&amp;quot;;
        until curl -s -X POST --cacert config/certs/ca/ca.crt -u &amp;quot;elastic:${ELASTIC_PASSWORD}&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; https://es01:9200/_security/user/kibana_system/_password -d &amp;quot;{\&amp;quot;password\&amp;quot;:\&amp;quot;${KIBANA_PASSWORD}\&amp;quot;}&amp;quot; | grep -q &amp;quot;^{}&amp;quot;; do sleep 10; done;
        echo &amp;quot;All done!&amp;quot;;
      &amp;#x27;
    healthcheck:
      test: [&amp;quot;CMD-SHELL&amp;quot;, &amp;quot;[ -f config/certs/es01/es01.crt ]&amp;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:
        [
          &amp;quot;CMD-SHELL&amp;quot;,
          &amp;quot;curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q &amp;#x27;missing authentication credentials&amp;#x27;&amp;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:
        [
          &amp;quot;CMD-SHELL&amp;quot;,
          &amp;quot;curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q &amp;#x27;missing authentication credentials&amp;#x27;&amp;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:
        [
          &amp;quot;CMD-SHELL&amp;quot;,
          &amp;quot;curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q &amp;#x27;missing authentication credentials&amp;#x27;&amp;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:
        [
          &amp;quot;CMD-SHELL&amp;quot;,
          &amp;quot;curl -s -I http://localhost:5601 | grep -q &amp;#x27;HTTP/1.1 302 Found&amp;#x27;&amp;quot;,
        ]
      interval: 10s
      timeout: 10s
      retries: 120

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

</content></entry></feed>