Aparentemente, eu tenho esse karma: não importa como eu implemente a implementação de algum serviço em código aberto, definitivamente encontrarei vários manuais, cada um dos quais individualmente em meu caso particular não funcionará, a solução pronta não será iniciada ou gostará, o que mais acontecerá -Nunca digestibilidade, e no final você tem que avançar para o resultado sozinho.
Desta vez, todos os manuais estavam no ELK5 ou até mais antigo, mas eu realmente não queria instalar o software das versões anteriores. Eu queria levar o software com os períodos de suporte mais promissores: de preferência o mais recente do estável.
Como resultado, para poder repetir a façanha perfeita sem repetir todo o tormento no futuro, você deve escrever folhas de dicas passo a passo que eu compartilho com você.
Então hoje Mikrotik (RouterOS), Suricata 4.1, Elasticsearch + Filebeat + Kibana 6.5.
Em vez de se juntar
Termos:
- Mikrotik no i386 em uma máquina virtual no host A. Todas as interfaces no Mikrotik estão espalhadas pelas VLANs, o host possui uma interface de rede física.
- Recursos livres para IDS / IPS / NMS no host B com uma única interface de rede física.
- Saída de canal de 20 megabytes.
- O desejo de receber análises sobre o tráfego que passa pela interface externa do Mikrotik.
- O orçamento em rublos de rábano silvestre e kopecks da FIG.
- Uma certa quantidade de tempo livre de aborrecimentos.
Não falarei aqui sobre o que é IDS / IPS / NMS, por que é necessário e o que acontece. Todo mundo sabe disso sem mim, e quem não conhece vai pesquisar no google.
Além disso, não justificarei minha escolha entre Snort e Suricata em favor deste último. Isso é uma questão de gosto.
Mas explique superficialmente como funciona:
Suricata de alguma forma recebe tráfego. Existem três opções: a) passe por você mesmo no modo inline, b) receba uma cópia do tráfego da porta do switch ec) analise os despejos com o tráfego. Suricata analisa o tráfego recebido e, com base na análise, fornece dados sobre o que foi encontrado nesse tráfego.
Suricata pode emitir dados em JSON. Consequentemente, tendo dados estruturados, eles podem ser fornecidos a algum sistema para processamento, sistematização, análise e visualização.
Para a análise e visualização de dados, pelo que entendi, sem ser um especialista nesse campo, a pilha ELK é perfeita. A pilha do ELK consistia originalmente em Elasticsearch, Logstash, Kibana. Agora, o Beat foi adicionado a ele (uma família de programas de interface que atua como intermediário entre a fonte de dados e o Logstash ou Elasticsearch). Olhando para o futuro, direi que não houve Logstash, já que o Beat alimenta perfeitamente os dados diretamente no Elasticsearch, e o Elasticsearch os consome perfeitamente. O Elasticsearch transfere os dados picados para o Kibana, a interface da Web para toda a pilha ELK. Kibana, usando os modelos passados a ele pelo Filebeat, fornece ao usuário a visualização de dados, os chamados Dashboards. Considerando que Elasticsearch, Logstash, Beat e Kibana são o fruto do trabalho de um fabricante, todo esse farm está bem conectado entre si e o processo de vinculação está bem documentado (é claro para os padrões de código aberto).
Assim, com base no exposto, a tarefa pode ser descrita da seguinte forma: obter uma cópia do tráfego da porta do roteador, transferi-lo para Suricata, receber dados no formato JSON da Suricata, transferi-los para o Filebeat, para que, por sua vez, os transfira para Elasticsearch e ajudou o Kibana a criar sua exibição visual.
Mikrotik RouterOS
Se eu tivesse um hardware de roteador Mikrotik, a questão do espelhamento de porta (espelhamento de porta) não seria de todo. Tudo seria decidido ao permitir o espelhamento do tráfego que passa pela interface externa para qualquer porta livre do próprio Mikrotik. Se não houvesse uma porta livre no Mikrotik, você poderia ativar o espelhamento de porta no switch. Mas no meu caso, o Mikrotik não tinha portas físicas, e a porta do switch recebeu tráfego de todo o host, no qual, além do Mikrotik, havia várias outras máquinas virtuais.
E então eu mais uma vez disse mentalmente: “Obrigado Mikrotik!”. Obrigado pelo sniffer embutido no RouterOS. Por tradição, fazemos sem capturas de tela, apenas comandos do console.
Abra o terminal no WinBox e ligue o sniffer:
/tool sniffer set filter-interface=if-out filter-stream=yes streaming-enabled=yes streaming-server=192.168.1.253
/tool sniffer start
Indique em vez de
se o nome da interface da qual você planeja interceptar o tráfego e em vez de
192.168.1.253 - o endereço IP da máquina para a qual o tráfego interceptado será enviado via
TZSP .
Com Mikrotik'om tudo.
Suricata
Em geral, eu não sou muito orientado para Linux, então, acima de tudo, gosto de distribuições pop. Bem, talvez eu goste do Debian mais ascético. Então eu comecei com isso. Bem, e é claro, devido à capacidade não-linux, eu também queria instalar binários do repositório. A montagem é sempre preguiçosa para mim. Portanto, se for possível escolher o Debian, -
não escolha . Não me lembro agora em que lugar tive a mordaça em instalar o farm inteiro no Debian, mas ele estava. E toda a história subsequente sobre a instalação de tudo no Ubunta.
Uma máquina virtual de 4 núcleos com 4 GB de RAM foi criada, o
Ubuntu Server 18.04.1 LTS (x64) foi baixado e instalado nela
Contrato : todas as ações adicionais são executadas em nome do superusuário, portanto, efetue login como root ou adicione sudo a cada comando.
Como em cada estágio eu fiz instantâneos e depois voltei repetidamente para eles, no final, acendi muitas falhas com um tempo fora de sincronia em uma máquina virtual em tempo real.
Portanto, definimos imediatamente o fuso horário correto e a sincronização NTP:
systemctl start systemd-timesyncd
systemctl status systemd-timesyncd
dpkg-reconfigure tzdata
Para garantir que não haja problemas de dependência ao instalar o Suricata, adicione os repositórios do
universo em
/etc/apt/sources.list :
nano /etc/apt/sources.list
...
deb archive.ubuntu.com/ubuntu bionic main universe
deb archive.ubuntu.com/ubuntu bionic-security main universe
deb archive.ubuntu.com/ubuntu bionic-updates principal universo
Também adicionamos o repositório, onde obteremos o Suricata:
add-apt-repository ppa:oisf/suricata-stable
Atualizando o banco de dados do pacote:
apt-get update
Instale Suricata:
apt-get install -y suricata
O próximo passo é definir as regras para Suricata e sua atualização:
apt-get install -y python-pip
pip install pyyaml
pip install https://github.com/OISF/suricata-update/archive/master.zip
Iniciamos a atualização do
suricata-update :
pip install --pre --upgrade suricata-update
A execução sem configuração adicional nos dará o conjunto de regras Emerging Threats Open:
suricata-update
Para ver a lista de fontes, faça:
suricata-update list-sources
Atualizando fontes de regra:
suricata-update update-sources
Vamos ver o que foi atualizado lá nas fontes, execute novamente:
suricata-update list-sources
Incluímos todas as fontes gratuitas:
suricata-update enable-source ptresearch/attackdetection
suricata-update enable-source oisf/trafficid
suricata-update enable-source sslbl/ssl-fp-blacklist
E, novamente, atualizamos as regras:
suricata-update
Suricata está instalado.
Agora você precisa obter tráfego.
Trafr
Trafr é um aplicativo escrito por Mikrotik para converter tráfego TZSP em pcap. O aplicativo é de 32 bits, portanto, para iniciá-lo, será necessário ativar o suporte para aplicativos de 32 bits no Ubunta de 64 bits:
dpkg --add-architecture i386
apt-get update && apt-get install -y libc6:i386
Faça o download e descompacte o
trafr :
wget http://www.mikrotik.com/download/trafr.tgz
tar xzf trafr.tgz
Verifique se o tráfego está sendo capturado:
./trafr -s
Após esse lançamento, a saída simbólica no modo gráfico quebrou no console da máquina virtual, tive que reiniciar. Não houve problemas ao conectar remotamente via ssh ao PuTTY.
Se você vê oscilações irregulares na tela, o tráfego chega e o tráfego
é capturado.
Nesse caso, transfira o
tráfego para a residência permanente e execute-o com a transmissão do tráfego capturado pelo gasoduto imediatamente para Suricata:
mv trafr /usr/local/bin/
/usr/local/bin/trafr -s | suricata -c /etc/suricata/suricata.yaml -r /dev/stdin
Agora verificamos se o tráfego chega a Suricata, para isso, fazemos o seguinte no terminal vizinho:
tail -f /var/log/suricata/fast.log
Você deve ver uma rolagem inteligente de um texto significativo - um registro de recebimento de tráfego de suricatos.
Também não será errado garantir que o tráfego da Suricata não apenas receba, mas também analise:
tail -f /var/log/suricata/eve.json
Essa é exatamente a saída dos eventos da Suricata no formato JSON que iremos alimentar no Filebeat.
Elasticsearch + Filebeat + Kibana 6.5
Instalamos a chave PGP necessária para usar o repositório Elastic e instalamos as dependências necessárias:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
apt-get update && apt-get install -y openjdk-8-jre apt-transport-https wget nginx
Observe que Java é a versão 8. Qualquer coisa acima de 8 não é suportada. Portanto, se você conseguiu instalar um Java mais recente anteriormente, faça uma demolição e coloque 8.
Garantimos que o Java esteja instalado como deveria:
java -version
Temos aproximadamente a seguinte conclusão:
versão java "1.8.0_191"
Java (TM) SE Runtime Environment (compilação 1.8.0_191-b12)
VM do servidor Java HotSpot (TM) de 64 bits (compilação 25.191-b12, modo misto)
Crie um usuário e senha para acessar o Kibana. Em vez de
administrador, escolha algo que você prefere:
echo "admin:`openssl passwd -apr1`" | sudo tee -a /etc/nginx/htpasswd.users
Como o ELK girará no localhost, configure o proxy reverso no nginx:
nano /etc/nginx/sites-available/kibana
servidor {
ouça 80;
server_name suricata.server;
auth_basic "Acesso Restrito";
auth_basic_user_file /etc/nginx/htpasswd.users;
local / {
proxy_pass localhost : 5601;
proxy_http_version 1.1;
proxy_set_header Atualize $ http_upgrade;
proxy_set_header Conexão 'atualização';
proxy_set_header Host $ host;
proxy_cache_bypass $ http_upgrade;
}
}
rm /etc/nginx/sites-enabled/default
ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/kibana
Reinicie o nginx:
systemctl restart nginx
Colocamos Elasticsearch:
apt-get install -y elasticsearch
Ative a execução automática ao carregar o sistema operacional:
systemctl daemon-reload
systemctl enable elasticsearch.service
Lançamos:
systemctl start elasticsearch.service
Verifique se aumentou:
curl -X GET "localhost:9200/"
Dependendo do desempenho do seu hardware, iniciar o ES pode levar algum tempo. Se a
conexão for recusada , basta repetir a solicitação e aguardar até obter algo como:
{
"Nome": "lcZuxxm",
"Cluster_name": "elasticsearch",
"Cluster_uuid": "kmJHqJnlQe2Rk7F-CRi4EA",
"Versão": {
"Number": "6.5.1",
"Build_flavor": "padrão",
"Build_type": "deb",
"Build_hash": "8c58350",
"Build_date": "2018-11-16T02: 22: 42.182257Z",
"Build_snapshot": false,
"Lucene_version": "7.5.0",
"Minimum_wire_compatibility_version": "5.6.0",
"Minimum_index_compatibility_version": "5.0.0"
}
Tagline: Você sabe, para pesquisa
}
Colocamos Kibana:
apt-get install -y kibana
Ative a execução automática ao carregar o sistema operacional:
systemctl daemon-reload
systemctl enable kibana.service
Lançamos:
systemctl start kibana.service
Agora você pode ir para
192.168.1.253 (é claro, o endereço IP é aquele atribuído à sua máquina com um meerkat). A página de rosto do Kibana deve abrir.
Colocamos o Filebeat:
apt-get install -y filebeat
Ative a execução automática ao carregar o sistema operacional:
systemctl daemon-reload
systemctl enable filebeat
Ativamos o módulo Suricata, que faz parte do conjunto de módulos Filebeat:
filebeat modules enable suricata
Instale plugins para Suricata no Elasticsearch:
/usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-geoip
/usr/share/elasticsearch/bin/elasticsearch-plugin install ingest-user-agent
Ver UPD 22 de maio de 2019.Reiniciando o Elasticsearch:
systemctl restart elasticsearch.service
Realizamos a configuração inicial do Filebeat, ao mesmo tempo carregando modelos no Kibana:
filebeat setup -e
Verificamos que o Filebeat encontrou
/var/log/suricata/eve.json e está processando-o.Para fazer isso, execute o Filebeat no modo de saída de dados com o marcador de
publicação :
filebeat -e -d "publish"
A saída formatada em json do Filebeat será a primeira, depois uma simples saída de texto de seus logs e somente após algum tempo a saída da Suricata, então aguarde e verifique se tudo funciona. Depois disso, aborte o Filebeat e volte ao bash.
Ative a execução automática ao carregar o sistema operacional:
systemctl daemon-reload
systemctl enable filebeat.service
Executar filebeat:
systemctl start filebeat.service
Vá para Kibana, selecione Painel no menu à esquerda, selecione
filebeat- * index. Selecione Painel novamente, selecione
Visão geral do
alerta [Suricata] na lista e deve obter algo como isto:

Opcional
Não se esqueça de fazer o logrotate e, por mais amplo que seja o disco rígido, o Suricata o pontuará muito rapidamente:
nano /etc/logrotate.d/suricata
/var/log/suricata/*.log /var/log/suricata/*.json
{
semanalmente
rodar 3
missingok
nocompress
criar
sharedscripts
postrotado
/ bin / kill -HUP `cat /var/run/suricata.pid 2> / dev / null` 2> / dev / null || verdade
final
}
Além disso, havia rumores de que alguém farejava regularmente no Mikrotik com o status de
execução deixa de fornecer tráfego. Em seguida, escrevemos um script para reiniciar o sniffer e executá-lo de acordo com o cronograma:
/tool sniffer stop
:delay 30s
/tool sniffer start
Conclusão
Francamente, não estou muito satisfeito com a estabilidade do pacote acima. A saber: vale a pena reiniciar, e os milagres começam. Uma vez, tudo, exceto alguns, parou de processar minhas regras. Eu tive que reinstalar tudo. Na segunda vez, o Elasticsearch geralmente parou de receber dados do Filebeat e teve que reverter para o instantâneo do estado antes de reiniciar.
Ainda não resolvi esses problemas.
Além disso, há planos de implementar o IPS com base nos endereços IP dos vilões identificados por Suricata transferidos para o Mikrotik.
UPD : Acusações de instabilidade são descartadas. Minha conclusão sobre o término do processamento de regras foi incorreta. De fato, o motivo do vazio no painel após a reinicialização se deve ao fato de o Filebeat e o Elasticsearch precisarem de um tempo muito perceptível para analisar um arquivo json de vários gigabytes do meerkat. Se você abrir o Painel com eventos por um período que inclua a data em que o arquivo
eve.json foi
criado , poderá ver como as colunas do gráfico crescem à medida que o arquivo é processado. Juntamente com os eventos processados, os alertas aparecem no painel correspondente. Além disso, o sniffer no RouterOS no x86 nunca parou.
UPD 22 de maio de 2019 : A partir da versão Elasticsearch 6.7, os plugins ingest-geoip e ingest-user-agent foram convertidos em módulos. Consequentemente, o item com sua instalação é ignorado.
Além disso, ao atualizar, você recebe um erro de inicialização do Elasticsearch. Você verá um erro nos logs:
banco de dados esperado [GeoLite2-ASN.mmdb] não existe em [/ etc / elasticsearch / ingest-geoip]
Para restaurar o desempenho, realizamos:
/usr/share/elasticsearch/bin/elasticsearch-plugin remove --purge ingest-geoip