
Elastic Stack — uma ferramenta reconhecida no mercado de sistemas SIEM (na verdade, não apenas para isso). Ele pode coletar uma grande variedade de dados, tanto sensíveis quanto não sensíveis. Não é totalmente correto deixar os elementos do Elastic Stack sem proteção. Por padrão, todos os componentes padrão do Elastic (Elasticsearch, Logstash, Kibana e os coletores Beats) operam através de protocolos abertos. E na própria Kibana, a autenticação está desativada. Todos esses interações podem ser seguras e neste artigo vamos mostrar como fazer isso. Para facilitar, dividimos a narrativa em 3 blocos temáticos:
- Modelo de acesso baseado em função
- Segurança de dados dentro do cluster Elasticsearch
- Segurança de dados fora do cluster Elasticsearch
Detalhes abaixo.
Modelo de acesso baseado em função
Se instalar o Elasticsearch sem nenhuma configuração adicional, o acesso a todos os índices estará aberto para qualquer um que deseje. Bem, ou para aqueles que podem usar curl. Para evitar isso, o Elasticsearch possui um modelo de acesso baseado em função, disponível a partir do nível de assinatura Basic (que é gratuito). Visualmente, parece algo assim:

O que está na imagem
- Usuários — são todos que podem se autenticar usando credenciais.
- Função — é um conjunto de permissões.
- Permissões — são um conjunto de privilégios.
- Privilégios — são permissões para gravação, leitura, exclusão, etc. ()
- Recursos — são índices, documentos, campos, usuários e outros objetos de armazenamento (o modelo de função para alguns recursos está disponível apenas em assinaturas pagas).
No Elasticsearch, por padrão existem , associados a . Após ativar as configurações de segurança, eles podem ser imediatamente utilizados.
Para ativar a segurança nas configurações do Elasticsearch, é necessário adicionar no arquivo de configuração (por padrão, é elasticsearch/config/elasticsearch.yml) uma nova linha:
xpack.security.enabled: trueApós alterar o arquivo de configuração, inicie ou reinicie o Elasticsearch para que as alterações tenham efeito. O próximo passo é atribuir senhas aos usuários padrão. Vamos fazer isso interativamente com o comando abaixo:
[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-setup-passwords interactive
Iniciando a configuração de senhas para usuários reservados elastic, apm_system, kibana, logstash_system, beats_system, remote_monitoring_user.
Você será solicitado a inserir senhas conforme o processo avança.
Por favor, confirme que você deseja continuar [y\/N]y
Digite a senha para [elastic]:
Reinsira a senha para [elastic]:
Digite a senha para [apm_system]:
Reinsira a senha para [apm_system]:
Digite a senha para [kibana]:
Reinsira a senha para [kibana]:
Digite a senha para [logstash_system]:
Reinsira a senha para [logstash_system]:
Digite a senha para [beats_system]:
Reinsira a senha para [beats_system]:
Digite a senha para [remote_monitoring_user]:
Reinsira a senha para [remote_monitoring_user]:
Senha alterada para o usuário [apm_system]
Senha alterada para o usuário [kibana]
Senha alterada para o usuário [logstash_system]
Senha alterada para o usuário [beats_system]
Senha alterada para o usuário [remote_monitoring_user]
Senha alterada para o usuário [elastic]
Verificamos:
[elastic@node1 ~]$ curl -u elastic 'node1:9200\/_cat\/_nodes?pretty'
Digite a senha do host para o usuário 'elastic':
192.168.0.2 23 46 14 0.28 0.32 0.18 dim * node1
Pode dar uma palmada nas costas — as configurações do lado do Elasticsearch foram concluídas. Agora é hora de configurar o Kibana. Se você iniciá-lo agora, aparecerão erros, por isso é importante criar um repositório de chaves. Isso pode ser feito em dois comandos (usuário kibana e a senha inserida na etapa de criação de senhas no Elasticsearch):
[elastic@node1 ~]$ .\/kibana\/bin\/kibana-keystore add elasticsearch.username
[elastic@node1 ~]$ .\/kibana\/bin\/kibana-keystore add elasticsearch.passwordSe tudo estiver correto — Kibana começará a solicitar login e senha. No plano nível Basic, está disponível um modelo de função baseado em usuários internos. A partir do nível Gold, é possível conectar sistemas de autenticação externos — LDAP, PKI, Active Directory e sistemas de Single sign-on.

Os direitos de acesso a objetos dentro do Elasticsearch também podem ser restritos. No entanto, para fazer o mesmo para documentos ou campos, será necessária uma assinatura paga (esse luxo começa a partir do nível Platinum). Essas configurações estão disponíveis na interface do Kibana ou através do . Você pode verificar através do menu Dev Tools já familiar:
Criação de função
PUT \/_security\/_role\/ruslan_i_ludmila_role
{
"cluster": [],
"indices": [
{
"names": [ "ruslan_i_ludmila" ],
"privileges": ["read", "view_index_metadata"]
}
]
}Criando usuário
POST \/_security\/_user\/pushkin
{
"password" : "nataliaonelove",
"roles" : [ "ruslan_i_ludmila_role", "kibana_user" ],
"full_name" : "Alexander Pushkin",
"email" : "pushkin@lyceum.edu",
"metadata" : {
"hometown" : "Saint-Petersburg"
}
}Segurança de dados dentro do cluster Elasticsearch
Quando o Elasticsearch opera em um cluster (o que é comum), as configurações de segurança dentro do cluster se tornam importantes. Para uma interação segura entre os nós, o Elasticsearch utiliza o protocolo TLS. Para configurar a interação segura entre eles, um certificado é necessário. Geramos um certificado e uma chave privada no formato PEM:
[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-certutil ca --pemApós executar o comando acima, no diretório /../elasticsearch um arquivo compactado aparecerá elastic-stack-ca.zip. Dentro dele, estarão o certificado e a chave privada com as extensões crt e key respectivamente. É recomendável hospedá-los em um recurso compartilhado, ao qual todas as nodos do cluster devem ter acesso.
Para cada nodo, são necessários seus próprios certificados e chaves privadas com base nos que estão no diretório compartilhado. Ao executar o comando, será solicitado definir uma senha. Você pode adicionar opções adicionais —ip e —dns para uma verificação completa das nodos interagentes.
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil cert --ca-cert /shared_folder/ca/ca.crt --ca-key /shared_folder/ca/ca.keyAo final da execução do comando, obteremos um certificado e uma chave privada no formato PKCS#12, protegidos por senha. Resta mover o arquivo gerado p12 para o diretório de configuração:
[elastic@node1 ~]$ mv elasticsearch/elastic-certificates.p12 elasticsearch/configAdicionaremos a senha ao certificado no formato p12 no keystore e truststore em cada nodo:
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_passwordNo já conhecido elasticsearch.yml resta adicionar as linhas com os dados do certificado:
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12Iniciamos todos os nós do Elasticsearch e executamos curl. Se tudo foi feito corretamente, a resposta retornará com vários nós:
[elastic@node1 ~]$ curl node1:9200/_cat/nodes -u elastic:password
172.18.0.3 43 75 4 0.00 0.05 0.05 dim * node2
172.18.0.4 21 75 3 0.00 0.05 0.05 dim - node3
172.18.0.2 39 75 4 0.00 0.05 0.05 dim - node1Há mais uma opção de segurança — filtragem de endereços IP (disponível em assinaturas a partir do nível Gold). Permite criar listas de permissões de endereços IP que podem acessar os nós.
Segurança de dados fora do cluster Elasticsearch
Fora do cluster significa conectar ferramentas externas: Kibana, Logstash, Beats ou outros clientes externos.

Para configurar o suporte a https (em vez de http), adicionaremos novas linhas no elasticsearch.yml:
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: elastic-certificates.p12
xpack.security.http.ssl.truststore.path: elastic-certificates.p12Como o certificado é protegido por senha, adicionaremos isso ao keystore e truststore em cada nodo:
[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_passwordApós adicionar as chaves, os nós do Elasticsearch estão prontos para conexão via https. Agora eles podem ser iniciados.
O próximo passo é criar uma chave para a conexão do Kibana e adicioná-la à configuração. Com base no certificado que já está no diretório compartilhado, geraremos um certificado no formato PEM (PKCS#12, o Kibana, Logstash e Beats ainda não suportam):
[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-certutil cert --ca-cert \/shared_folder\/ca\/ca.crt --ca-key \/shared_folder\/ca\/ca.key --pemAgora, precisamos descompactar as chaves criadas na pasta de configuração do Kibana:
[elastic@node1 ~]$ unzip elasticsearch\/certificate-bundle.zip -d kibana\/configAs chaves estão criadas, então precisamos mudar a configuração do Kibana para que ele comece a usá-las. No arquivo de configuração kibana.yml, alteramos http para https e adicionamos as linhas com as configurações de conexão SSL. As últimas três linhas configuram a interação segura entre o navegador do usuário e o Kibana.
elasticsearch.hosts: ["https:\/${HOSTNAME}:9200"]
elasticsearch.ssl.certificateAuthorities: \/shared_folder\/ca\/ca.crt
elasticsearch.ssl.verificationMode: certificate
server.ssl.enabled: true
server.ssl.key: \/..\/kibana\/config\/instance\/instance.key
server.ssl.certificate: \/..\/kibana\/config\/instance\/instance.crtDessa forma, as configurações estão completas e o acesso aos dados no cluster do Elasticsearch está criptografado.
Se você tiver perguntas sobre as capacidades do Elastic Stack em assinaturas gratuitas ou pagas, ou tarefas relacionadas à monitoramento ou criação de uma solução SIEM, deixe sua solicitação em em nosso site.
Além disso, nossos artigos sobre Elastic Stack no Habr:
Fonte: habr.com
