Elastic sob proteção: habilitando opções de segurança no cluster Elasticsearch para acesso interno e externo

Elastic sob proteção: habilitando opções de segurança no cluster Elasticsearch para acesso interno e externo

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:

Elastic sob proteção: habilitando opções de segurança no cluster Elasticsearch para acesso interno e externo

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. (Lista completa de privilégios)
  • 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 usuários padrão, associados a funções padrão. 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: true

Apó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.password

Se 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.

Elastic sob proteção: habilitando opções de segurança no cluster Elasticsearch para acesso interno e externo

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 Security API. 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 --pem

Apó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.key

Ao 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/config

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

No 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.p12

Iniciamos 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 - node1

Há 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.

Elastic sob proteção: habilitando opções de segurança no cluster Elasticsearch para acesso interno e externo

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.p12

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

Apó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 --pem

Agora, precisamos descompactar as chaves criadas na pasta de configuração do Kibana:

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

As 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.crt

Dessa 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 formulário de feedback em nosso site.

Além disso, nossos artigos sobre Elastic Stack no Habr:

Compreendendo o Machine Learning no Elastic Stack (também conhecido como Elasticsearch, também conhecido como ELK)

Dimensionamento do Elasticsearch

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster