Instalando Elasticsearch EDR
Durante a minha pesquisa de Bypass de EDR e criação da técnica HookChain eu me deparei com uma dificuldade para achar um tutorial passo-a-passo que realmente incluisse todos os passos para a instalação e configuração do Elastic EDR, sendo assim decidi escreve-lo.
Segue um passo a passo para instalação do Elasticsearch EDR no Ubuntu 22.04.
Preparando Ambiente
Primeiro passo é realizar a instalação dos pacotes necessários:
1
2
apt update
apt install python3 python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools python3-venv unzip jq curl apt-transport-https
Instalando o ELK
Adicione o repositório do ELK e atualize a listagem de pacotes:
1
2
3
curl -s https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-8.x.list
apt update
E por fim, instale o ELK:
1
apt install elasticsearch kibana
Gerando certificados digitais
Para este ambiente será necessário a criação e utilização de certificados digitais para as comunicações TLS.
Crie um arquivo /usr/share/elasticsearch/instances.yml
com o seguinte conteúdo
1
2
3
4
5
6
7
8
9
10
instances:
- name: "elasticsearch"
ip:
- "172.31.255.30"
- name: "kibana"
ip:
- "172.31.255.30"
- name: "zeek"
ip:
- "172.31.255.30"
Altere o endereço IP
172.31.255.30
do arquivo de configuração acima para o endereço IP e/ou nome DNS utilizado em seu ambiente. O IP acima é o endereço do servidor ELK
O
ELK
pode ser configurado para utilizar nome DNS ou IP, para este artigo e em meu ambiente de testes, estarei utilizando IP. Desta forma lembre-se de alterar no arquivo de configuração acima para o endereço IP e/ou nome DNS utilizado em seu ambiente. O IP acima é o endereço do servidor ELK
1
2
3
4
5
cd /usr/share/elasticsearch/
/usr/share/elasticsearch/bin/elasticsearch-certutil ca --silent --keysize 2048 --pass "" --pem --out ca.zip
unzip ca.zip -d .
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --silent --in instances.yml --keysize 2048 --pem --out certs.zip --ca-cert ./ca/ca.crt --ca-key ./ca/ca.key --ca-pass ""
unzip certs.zip -d .
Adicione o certificado da CA Root gerada como confiávem no próprio Linux. Este procesimento é necessário pois futiramente utilizaremos este mesmo servidor como o agente de um dos componentes do EDR (Fleet Server).
1
2
cp /usr/share/elasticsearch/ca/ca.crt /usr/local/share/ca-certificates/
update-ca-certificates
Agora crie e copie os certificados para as estruturas de diretórios do Elasticsearch e Kibana
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir /etc/elasticsearch/certs/ca -p
mkdir /etc/kibana/certs/ca -p
cd /usr/share/elasticsearch/
cp ca/ca.crt /etc/elasticsearch/certs/ca
cp elasticsearch/elasticsearch.crt /etc/elasticsearch/certs
cp elasticsearch/elasticsearch.key /etc/elasticsearch/certs
chown -R elasticsearch: /etc/elasticsearch/certs
chmod -R 770 /etc/elasticsearch/certs
cp ca/ca.crt /etc/kibana/certs/ca
cp kibana/kibana.crt /etc/kibana/certs
cp kibana/kibana.key /etc/kibana/certs
chown -R kibana: /etc/kibana/certs
chmod -R 770 /etc/kibana/certs
Configurando o Elasticsearch
Edite o arquivo de configuração /etc/elasticsearch/elasticsearch.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# ================ Elasticsearch Configuration ================
# Source: https://www.helviojunior.com.br/security/edr/instalando-elasticsearch-edr/
# Author: Helvio Junior (M4v3r1ck)
#
http.host: 0.0.0.0
network.host: "172.31.255.30"
http.port: 9200
node.name: "node-1"
cluster.initial_master_nodes: ["node-1"]
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
xpack.security.enrollment.enabled: true
xpack.security.enabled: true
# Transport layer
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.key: /etc/elasticsearch/certs/elasticsearch.key
xpack.security.transport.ssl.certificate: /etc/elasticsearch/certs/elasticsearch.crt
xpack.security.transport.ssl.certificate_authorities: [ "/etc/elasticsearch/certs/ca/ca.crt" ]
# HTTP layer
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.verification_mode: certificate
xpack.security.http.ssl.key: /etc/elasticsearch/certs/elasticsearch.key
xpack.security.http.ssl.certificate: /etc/elasticsearch/certs/elasticsearch.crt
xpack.security.http.ssl.certificate_authorities: [ "/etc/elasticsearch/certs/ca/ca.crt" ]
Habilite e inicie o serviço
1
2
3
systemctl enable elasticsearch
systemctl start elasticsearch
systemctl status elasticsearch
Se tudo ocorreu conforme o esperado, teremos um resultado conforme a imagem abaixo
Podemos verificar a conexão através do comando abaixo
1
curl -s -k -X GET "https://localhost:9200" | jq
Com o comando acima recebemos um erro de autenticação
missing authentication credentials for REST request
, porém não se preocupe isso é normal, pois ja configuramos o nosso Elasticsearch para exigir autenticação em sua interações, inclusive na API REST.
Agora vamos resetar as credenciais do sistema
1
for u in "elastic" "apm_system" "kibana_system" "kibana" "logstash_system" "remote_monitoring_user"; do echo; /usr/share/elasticsearch/bin/elasticsearch-reset-password -b -u $u; done
Armazene essas credenciais em local seguro. Utilizaremos o usuário
elastic
para login no kibana via HTTPS
Como estamos executando nossos comandos como usuário root, vamos nos certificar que os usuários e grupos estão corretos.
1
2
chown -R elasticsearch:elasticsearch /etc/elasticsearch*
chown elasticsearch:elasticsearch /etc/elasticsearch/service_tokens
Reinicie o serviço do elasticsearch
1
systemctl restart elasticsearch
Configurando o Kibana
Gere as chaves de criptografia
1
/usr/share/kibana/bin/kibana-encryption-keys generate --force
Edite o arquivo de configuração /etc/kibana/kibana.yml
conforme abaixo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# =================== Kibana Configuration ====================
# Source: https://www.helviojunior.com.br/security/edr/instalando-elasticsearch-edr/
# Author: Helvio Junior (M4v3r1ck)
#
# =================== System: Kibana Server ===================
# Kibana is served by a back end server. This setting specifies the port to use.
server.port: 443
server.host: "0.0.0.0"
server.publicBaseUrl: "https://172.31.255.30"
# =================== System: Logging ===================
# Set the value of this setting to off to suppress all logging output, or to debug to log everything. Defaults to 'info'
#logging.root.level: debug
# Enables you to specify a file where Kibana stores log output.
logging:
appenders:
file:
type: file
fileName: /var/log/kibana/kibana.log
layout:
type: json
root:
appenders:
- default
- file
# Specifies the path where Kibana creates the process ID file.
pid.file: /run/kibana/kibana.pid
# The URLs of the Elasticsearch instances to use for all your queries.
elasticsearch.hosts: ["https://172.31.255.30:9200"]
elasticsearch.ssl.certificateAuthorities: ["/etc/kibana/certs/ca/ca.crt"]
elasticsearch.ssl.certificate: "/etc/kibana/certs/kibana.crt"
elasticsearch.ssl.key: "/etc/kibana/certs/kibana.key"
# These settings enable SSL for outgoing requests from the Kibana server to the browser.
server.ssl.enabled: true
server.ssl.certificate: "/etc/kibana/certs/kibana.crt"
server.ssl.key: "/etc/kibana/certs/kibana.key"
# Elastic Credentials
elasticsearch.username: "kibana_system" # Not use elastic or kibana user
elasticsearch.password: "Your_Elastic_Pass_Here"
xpack.security.encryptionKey: "myKey"
xpack.encryptedSavedObjects.encryptionKey: "myEncKey"
xpack.reporting.encryptionKey: "my2EncKey"
Lembre-se de alterar os valores das chaves de criptografia
xpack.security.encryptionKey
,xpack.encryptedSavedObjects.encryptionKey
expack.reporting.encryptionKey
, a senha do usuáriokibana_system
bem como o endereço IP presente no parâmetroserver.publicBaseUrl
.
Por rasões internas da ELK não é possível utilizar os usuários
kibana
eelastic
como parâmetroelasticsearch.username
, sendo assim se certifique de utilizar o usuáriokibana_system
Como configuramos o Kibana para realizar o bind diretamente na port 443 (HTTPS) será necessário permitir que os binários do kibana tenham este acesso. Realiza isso com os comandos abaixo:
1
2
3
4
setcap cap_net_bind_service=+epi /usr/share/kibana/bin/kibana
setcap cap_net_bind_service=+epi /usr/share/kibana/bin/kibana-plugin
setcap cap_net_bind_service=+epi /usr/share/kibana/bin/kibana-keystore
setcap cap_net_bind_service=+epi /usr/share/kibana/node/bin/node
Por fim habilite e inicie o serviço do Kibana
1
2
3
systemctl enable kibana
systemctl start kibana
systemctl status kibana
Acesso ao Kibana
Caso tudo tenha ocorrido corretamente, ao acessar a URL do kibana (em nosso ambiente https://172.31.255.30
) veremos a tela de login, conforme a imagem abaixo.
Para o acesso utilize o usuário elastic
e a senha gerada anteriormente.
Em nosso primeiro login veremos a imagem abaixo
Neste momento podemos pressionar no botão Explore on my own
para seguir para a console principal do Kibana.
ELK Fleet
Fleet, mas o que é isso?
Em meu primeiro contato com o ELK EDR, confesso que me bati um monte para conseguir entender (pelo menos acho que entendi) de forma básica o funcionamento.
Primeiramente necessitamos criar um servidor chamado Fleet Server
que será o componente responsável pela centralização e gerenciamento de agentes que coletam e enviam dados para o Elasticsearch, posteriormente iremos instalar os Agentes Fleet
que serão efetivamente os nossos EDRs.
Para este processo utilizaremos uma integração do ELK chamada Elastic Defend
.
Instalação e configuração do Fleet Server
Acesse o painel de configuração do Fleet
Clique em Add Fleet Server
, e configure conforme a imagem abaixo
E clique em Generate Fleet Server policy
e aguarde a geração, este processo pode demorar alguns segundos. Ao finalizar teremos a seguinte informação.
Copie o comando fornecido, mas não o execute ainda pois precisaremos ajustar alguns parâmetros.
Realize o download e extração do pacote fornecido
1
2
3
4
cd /tmp
curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.14.1-linux-x86_64.tar.gz
tar xzvf elastic-agent-8.14.1-linux-x86_64.tar.gz
cd elastic-agent-8.14.1-linux-x86_64
1
2
3
4
5
6
7
8
9
sudo ./elastic-agent install --url=https://172.31.255.30:8220 \
--fleet-server-es=https://172.31.255.30:9200 \
--fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE3MTk4MzUyODkzODI6WDhFYWx0RGZSNHVlYmhhZkxzeUFsQQ \
--fleet-server-policy=fleet-server-policy \
--fleet-server-port=8220 \
--certificate-authorities=/etc/elasticsearch/certs/ca/ca.crt \
--fleet-server-es-ca=/etc/elasticsearch/certs/ca/ca.crt \
--fleet-server-cert=/etc/elasticsearch/certs/elasticsearch.crt \
--fleet-server-cert-key=/etc/elasticsearch/certs/elasticsearch.key
Note que precisamos inserir os parâmetros
--url
,--certificate-authorities
,--fleet-server-es-ca
,--fleet-server-cert
e--fleet-server-cert-key
. Bem como precisamos alterar o parâmetro--fleet-server-es
para ao invés de usarhttp
elocalhost
utilizarhttps
com o endereço IP do nosso servidor ELK.
Caso nenhum erro ocorra, receberemos um resultado conforma abaixo:
E na interface web conforme abaixo:
Caso encontre algum erro neste processo basta desinstalar o agente com o comando /usr/bin/elastic-agent uninstall
, ajustar o problema e realizar a instalação novamente.
Na interface gráfica basta fechar a janela de confiruração.
NÃO
sendo necessário clicar emContinue enrolling Elastic Agent
.
Após fechar o painel lateral de configuração a seguinte tela será exibida, indicando que a configuração ocorreu com sucesso.
Edite as configurações do Fleet para que os hosts possam integrar corretamente através do IP/Nome do servidor.
Habilite o Agente
1
systemctl enable elastic-agent
Integração EDR
Para o correto monitoramento e encaminhamento de logs e alertas vamos configurar a integração com o o Elastic Defend para o Fleet Server
Elastic Defend
Agent policy
Primeiro passo necessário para a configuração de um agente do EDR, é a criação de uma política.
Digite o nome desejado, em meu caso utilizei EDR Policy
e clique em Create agent policy
Clique na política criada
E adicione uma integração com o Elastic Defend
E configure a integração conforme desejado.
Conheça um pouco maais sobre os modos de proteção na documentação da Elastic em https://www.elastic.co/guide/en/security/current/configure-endpoint-integration-policy.html.
Depois de adicionar a integração basta clicar em Add Elastic Agent later
e retornaremos a página das políticas.
Ajustando a política do EDR
Agora que temos a nossa política criada podemos ajustar os seus devidos parâmetros.
Clique no nome da política.
E seremos, então direcionado para as configurações do Elastic Defender
Ajuste as configurações conforme desejado e por fim defina para que o Endpoint seja registrado como o provedor oficial de proteção da máquina windows.
Agent Windows
Neste momento podemos realizar a instalação do agente em nossos Endpoint Windows
Certificado TLS
Antes de realizar a instalação do Agente no windows será necessário cadastrar a CA do Elastic como CA Root confiável.
Copie o arquivo /usr/share/elasticsearch/ca/ca.crt
para o windows e instale-o como CA Root Confiável
em Local Machine
.
Instalando agente
Ainda na console do Kibana clique em Add Agent
Inicie um powershell com permissões administrativas e execute os comandos obtidos.
1
2
3
4
5
6
7
8
9
cd c:\windows\temp
$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest -Uri https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.14.1-windows-x86_64.zip -OutFile elastic-agent-8.14.1-windows-x86_64.zip
Expand-Archive .\elastic-agent-8.14.1-windows-x86_64.zip -DestinationPath .
cd elastic-agent-8.14.1-windows-x86_64
.\elastic-agent.exe install --url=https://172.31.255.30:8220 --enrollment-token=...
Observe que eu executer os comandos dentro do diretório
c:\windows\temp
.
Neste momento na console web veremos que o agente foi instalado corretamente.
Para a visualização do(s) provedores de proteção da máquina basta executar o comando powershell Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntivirusProduct
Testes de identificação
Vamos colocar o EDR a prova de fogo? Para isso realizei a copia e tentativa de execução do Mimikatz.
Quase que instantaneamente foi bloqueado e o arquivo removido.
Licenciamento
O objetivo deste post não é falar sobre as funcionalidades e custos do Elastic EDR, desta forma apenas para conhecimento, do ponto de vista de monitoramento do EDR, foram observados 4 módulos que são desabilitados na versão gratuita do Elastic, exigindo o licenciamento Platinum
, conforme ilustra a imagem abaixo.
Todos os procedimentos e testes presentes neste post foram realizados com a licença gratuita.
Conclusão
Este foi o processo de instalação e configuração inicial, mas certamente tem bem mais ajustes finos a serem realizados.
Querem saber um pouco mais como ele se comportou nos testes de Bypass? Nos acompanha nas redes sociais em nosso Github que tem novidades!