Elastic sob bloqueio e chave: habilitando opções de segurança de cluster do Elasticsearch para acesso interno e externo

Elastic sob bloqueio e chave: habilitando opções de segurança de cluster do Elasticsearch para acesso interno e externo

Elastic Stack é uma ferramenta bastante conhecida no mercado de sistemas SIEM (na verdade, não só eles). Ele pode coletar muitos dados de tamanhos diferentes, tanto sensíveis quanto não muito sensíveis. Não é totalmente correto se o acesso aos próprios elementos do Elastic Stack não estiver protegido. Por padrão, todos os elementos prontos para uso do Elastic (coletores Elasticsearch, Logstash, Kibana e Beats) são executados em protocolos abertos. E no próprio Kibana a autenticação está desabilitada. Todas essas interações podem ser protegidas e neste artigo explicaremos como fazer isso. Por conveniência, dividimos a narrativa em 3 blocos semânticos:

  • Modelo de acesso a dados baseado em funções
  • Segurança de dados em um cluster Elasticsearch
  • Protegendo dados fora de um cluster Elasticsearch

Detalhes sob o corte.

Modelo de acesso a dados baseado em funções

Se você instalar o Elasticsearch e não ajustá-lo de forma alguma, o acesso a todos os índices estará aberto a todos. Bem, ou aqueles que podem usar curl. Para evitar isso, o Elasticsearch possui um modelo que está disponível a partir de uma assinatura Básica (que é gratuita). Esquematicamente é algo assim:

Elastic sob bloqueio e chave: habilitando opções de segurança de cluster do Elasticsearch para acesso interno e externo

O que está na foto

  • Usuários são todos que podem fazer login usando suas credenciais.
  • Um papel é um conjunto de direitos.
  • Os direitos são um conjunto de privilégios.
  • Privilégios são permissões para escrever, ler, excluir, etc. (Lista completa de privilégios)
  • Os recursos são índices, documentos, campos, usuários e outras entidades de armazenamento (o modelo de função para alguns recursos só está disponível com assinaturas pagas).

Por padrão, o Elasticsearch tem usuários de caixa, ao qual estão anexados papéis de caixa. Depois de ativar as configurações de segurança, você poderá começar a usá-las imediatamente.

Para ativar a segurança nas configurações do Elasticsearch, você precisa adicioná-lo ao arquivo de configuração (por padrão, é elasticsearch/config/elasticsearch.yml) nova linha:

xpack.security.enabled: true

Após alterar o arquivo de configuração, inicie ou reinicie o Elasticsearch para que as alterações tenham efeito. A próxima etapa é atribuir senhas aos usuários do box. Vamos fazer isso de forma interativa usando o comando abaixo:

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y


Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana]:
Reenter password for [kibana]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

Verificamos:

[elastic@node1 ~]$ curl -u elastic 'node1:9200/_cat/nodes?pretty'
Enter host password for user 'elastic':
192.168.0.2 23 46 14 0.28 0.32 0.18 dim * node1

Você pode dar um tapinha nas costas - as configurações do lado do Elasticsearch estão concluídas. Agora é hora de configurar o Kibana. Se você executá-lo agora, erros aparecerão, por isso é importante criar um armazenamento de chaves. Isso é feito em dois comandos (user quibana e a senha inserida na etapa de criação de senha no Elasticsearch):

[elastic@node1 ~]$ ./kibana/bin/kibana-keystore add elasticsearch.username
[elastic@node1 ~]$ ./kibana/bin/kibana-keystore add elasticsearch.password

Se tudo estiver correto, o Kibana começará a pedir login e senha. A assinatura Básica inclui um modelo baseado em usuários internos. Começando com Gold, você pode conectar sistemas de autenticação externa - LDAP, PKI, Active Directory e sistemas de logon único.

Elastic sob bloqueio e chave: habilitando opções de segurança de cluster do Elasticsearch para acesso interno e externo

Os direitos de acesso a objetos dentro do Elasticsearch também podem ser limitados. Porém, para fazer o mesmo com documentos ou campos, você precisará de uma assinatura paga (esse luxo começa com o nível Platinum). Essas configurações estão disponíveis na interface do Kibana ou via API de segurança. Você pode verificar através do já familiar menu Dev Tools:

Criando uma função

PUT /_security/role/ruslan_i_ludmila_role
{
  "cluster": [],
  "indices": [
    {
      "names": [ "ruslan_i_ludmila" ],
      "privileges": ["read", "view_index_metadata"]
    }
  ]
}

Criando um usuário

POST /_security/user/pushkin
{
  "password" : "nataliaonelove",
  "roles" : [ "ruslan_i_ludmila_role", "kibana_user" ],
  "full_name" : "Alexander Pushkin",
  "email" : "[email protected]",
  "metadata" : {
    "hometown" : "Saint-Petersburg"
  }
}

Segurança de dados em um cluster Elasticsearch

Quando o Elasticsearch é executado em um cluster (o que é comum), as configurações de segurança dentro do cluster tornam-se importantes. Para comunicação segura entre nós, o Elasticsearch usa o protocolo TLS. Para configurar uma interação segura entre eles, você precisa de um certificado. Geramos um certificado e uma chave privada no formato PEM:

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil ca --pem

Após executar o comando acima, no diretório /../elasticsearch arquivo aparecerá pilha elástica-ca.zip. Dentro dele você encontrará um certificado e uma chave privada com extensões crt и chave respectivamente. É aconselhável colocá-los em um recurso compartilhado, que deve ser acessível a partir de todos os nós do cluster.

Cada nó agora precisa de seus próprios certificados e chaves privadas com base naqueles do diretório compartilhado. Ao executar o comando, você será solicitado a definir uma senha. Você pode adicionar opções adicionais -ip e -dns para verificação completa de nós em interação.

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil cert --ca-cert /shared_folder/ca/ca.crt --ca-key /shared_folder/ca/ca.key

Como resultado da execução do comando, receberemos um certificado e uma chave privada no formato PKCS#12, protegidos por senha. Só falta mover o arquivo gerado p12 para o diretório de configuração:

[elastic@node1 ~]$ mv elasticsearch/elastic-certificates.p12 elasticsearch/config

Adicione uma senha ao certificado no formato p12 no keystore e no truststore em cada nó:

[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_password

Já sabia elasticsearch.yml Resta apenas adicionar linhas com 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.p12

Lançamos todos os nós do Elasticsearch e executamos enrolar. Se tudo foi feito corretamente, será retornada uma resposta 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 - node1

Existe outra opção de segurança - filtragem de endereço IP (disponível em assinaturas do nível Gold). Permite criar listas brancas de endereços IP a partir dos quais você tem permissão para acessar nós.

Protegendo dados fora de um cluster Elasticsearch

Fora do cluster significa conectar ferramentas externas: Kibana, Logstash, Beats ou outros clientes externos.

Elastic sob bloqueio e chave: habilitando opções de segurança de cluster do Elasticsearch para acesso interno e externo

Para configurar o suporte para https (em vez de http), adicione novas linhas ao 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.p12

Porque O certificado é protegido por senha, adicione-o ao keystore e ao armazenamento confiável em cada nó:

[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_password

Depois de adicionar as chaves, os nós do Elasticsearch estão prontos para se conectar via https. Agora eles podem ser lançados.

A próxima etapa é criar uma chave para conectar o Kibana e adicioná-la à configuração. Com base no certificado que já está localizado no diretório compartilhado, geraremos um certificado no formato PEM (PKCS#12 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 --pem

Resta descompactar as chaves criadas na pasta com a configuração do Kibana:

[elastic@node1 ~]$ unzip elasticsearch/certificate-bundle.zip -d kibana/config

As chaves estão aí, então só falta alterar a configuração do Kibana para que ele comece a utilizá-las. No arquivo de configuração kibana.yml, altere http para https e adicione linhas com configurações de conexão SSL. As últimas três linhas configuram a comunicaçã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.crt

Assim, as configurações são concluídas e o acesso aos dados do cluster Elasticsearch é criptografado.

Se você tiver dúvidas sobre os recursos do Elastic Stack em assinaturas gratuitas ou pagas, monitoramento de tarefas ou criação de um sistema SIEM, deixe uma solicitação para formulário de feedback no nosso site.

Mais de nossos artigos sobre Elastic Stack em Habré:

Compreendendo o aprendizado de máquina no Elastic Stack (também conhecido como Elasticsearch, também conhecido como ELK)

Dimensionamento do Elasticsearch

Fonte: habr.com

Adicionar um comentário