
Executa filtros personalizados no Elasticsearch e alerta sobre correspondências
O Reactor começou como um fork do projeto de código aberto ElastAlert. O mantenedor deste projeto deve acompanhar de perto as alterações no ElastAlert (excluindo seus alertadores adicionais) e garantir que quaisquer correções de bugs relevantes sejam aplicadas e qualquer recurso útil seja portado.
O Reactor é um mecanismo de alerta que recebe um conjunto de regras com filtros personalizados e alerta sobre correspondências. O Reactor atualiza automaticamente alertas silenciados com informações de alertas repetidos.
| Data de acesso | Commit | Notas |
|---|---|---|
| 2019-10-16 | 325f1dfe7a45f3ca2a2cc00127ab71fcd4f9cead | Voltou até antes de o Reactor ser criado pela primeira vez. |
| 2020-01-09 | ec5d03b95708ea0aa3d29c065f9794fdd95a82a1 | Não usamos cobertura. |
Atualmente, o Reactor suporta ElasticSearch 5.x.x, 6.x.x e 7.x.x. Conforme novas versões do elasticsearch forem disponibilizadas, o Reactor será atualizado para dar suporte a elas. Não há intenção de adicionar suporte a versões mais antigas do ElasticSearch. Atualmente, não há uma data para remover o suporte a versões mais antigas do ElasticSearch. Se a biblioteca Python do ElasticSearch remover o suporte, provavelmente faremos o mesmo.
Conforme as diretrizes da biblioteca Python do ElasticSearch, é recomendado instalar a versão da biblioteca com a mesma versão principal do cluster.
Para Elasticsearch 7.0 e versões posteriores, use a versão principal 7 (elasticsearch<8.0.0,>=7.0.0).
Para Elasticsearch 6.0 e versões posteriores, use a versão principal 6 (elasticsearch<7.0.0,>=6.0.0).
Para Elasticsearch 5.0 e versões posteriores, use a versão principal 5 (elasticsearch<6.0.0,>=5.0.0).
Observe que há um bug conhecido introduzido na versão 6.4.0 da biblioteca ElasticSearch, corrigido na 7.0.4, mas não na versão principal 6. O bug coloca o scroll_id no parâmetro de consulta, o que pode fazer o Elasticsearch retornar códigos de status 400 para IDs de scroll válidos.
Você pode iniciar uma instância do elasticsearch dentro do docker para desenvolvimento local usando o seguinte comando:
$ docker run -d -p 9200:9200/tcp --name elasticsearch docker.elastic.co/elasticsearch/elasticsearch:<version>
E a seguinte configuração em config.yaml:
writeback_index: reactor
alert_alias: reactor_alerts
elasticsearch: &elasticsearch
host: localhost
port: 9200
# Global settings to be applied to every run
rule:
elasticsearch: *elasticsearch
Este projeto fornece hooks do git para evitar erros do usuário. Execute os seguintes comandos:
$ cp .git-hooks-pre-push .git/hooks/pre-push
O Reactor é coberto por dois tipos de teste: unitário e de integração. O teste unitário garante que funções individuais e fluxos lógicos funcionem corretamente; o teste de integração garante que todo o sistema funcione em conjunto.
Os testes unitários são escritos usando PyTest. Para executar todos os testes, execute o seguinte comando:
$ py.test
Os testes unitários são executados no docker e exigem um arquivo .env no diretório raiz do projeto. Os testes exigem o seguinte conteúdo dentro do arquivo .env:
# The ElasticSearch version to be tested, reactor supports >= 5.x.x
ES_VERSION=6.3.2
# Basic configuration information so that reactor can query ElasticSearch
ES_HOST=elasticsearch
ES_USER=elastic
ES_PASSWORD=changeme
O arquivo Docker Compose de integração test.docker-compose.yml possui 3 variáveis de ambiente obrigatórias para >= v7.x.x, que quebrarão versões mais antigas:
node.name=elasticsearch
discovery.seed_hosts=elasticsearch
cluster.initial_master_nodes=elasticsearch
Para executar os testes de integração, execute o seguinte comando:
$ docker-compose -f docker-compose-test.yml up --abort-on-container-exit --build reactor elasticsearch
O seguinte conjunto de comandos (executado em ./certs/) criará um conjunto com um certificado CA e um certificado de dispositivo para executar o cluster simulado em localhost:
# Only do once: generate the root CA key:
$ openssl genrsa -out transport-ca.key 4096
# Generate the root CA certificate:
## Country Name (2 letter code) []:GB
## State or Province Name (full name) []:.
## Locality Name (eg, city) []:.
## Organization Name (eg, company) []:.
## Organizational Unit Name (eg, section) []:.
## Common Name (eg, fully qualified host name) []:PyRaftLog
## Email Address []:.
$ openssl req -x509 -new -nodes -key transport-ca.key -sha256 -days 1024 -out transport-ca.pem
# Generate device certificates
# Only do once: generate device key:
$ openssl genrsa -out transport-consensus.key 4096
# Generate device certificate signing request:
## Country Name (2 letter code) []:GB
## State or Province Name (full name) []:.
## Locality Name (eg, city) []:.
## Organization Name (eg, company) []:.
## Organizational Unit Name (eg, section) []:.
## Common Name (eg, fully qualified host name) []:localhost
## Email Address []:.
$ openssl req -new -key transport-consensus.key -out transport-consensus.csr
# Generate a signed device certificate:
$ openssl x509 -req -in transport-consensus.csr -CA transport-ca.pem -CAkey transport-ca.key -CAcreateserial -out transport-consensus.crt -days 500 -sha256
Para construir a documentação:
$ pip install -r requirements-docs.txt
$ cd docs
$ sphinx-build -b html -d build/doctrees -W source build/html
pip install --upgrade setuptools wheelpip install --upgrade twinepython3 setup.py sdist bdist_wheeltwine check dist/*twine upload --skip-existing dist/* --verbose