Como configurar o Elasticsearch para evitar vazamentos

No último ano, surgiram muitas vazamentos de dados. Elasticsearch (aqui, aqui e aqui). Em muitos casos, dados pessoais estavam armazenados na base. Esses vazamentos poderiam ter sido evitados se, após a implantação da base, os administradores tivessem se dado ao trabalho de verificar algumas configurações simples. Hoje, discutiremos sobre isso.

Primeiro, vamos esclarecer que, em nossa prática, usamos Elasticsearch para armazenar logs e analisar registros de sistemas de proteção da informação, sistemas operacionais e software em nossa plataforma IaaS, em conformidade com os requisitos da Lei 152-FZ, Cloud-152. 

Como configurar o Elasticsearch para evitar vazamentos

Verificamos se a base não está exposta na internet.

Na maioria dos casos conhecidos de vazamentos (aqui, aqui), os hackers acessaram os dados de forma simples e despretensiosa: a base foi publicada na internet e podia ser acessada sem autenticação.  

Primeiro, vamos entender a publicação na internet. Como isso acontece? O fato é que para um funcionamento mais flexível do Elasticsearch recomenda-se é necessário criar um cluster de três servidores. Para que os bancos de dados se comuniquem entre si, é preciso abrir portas. Como resultado, os administradores não limitam o acesso à base e a base de dados pode ser acessada de qualquer lugar. Verificar se há acesso externo à base é fácil. Basta inserir no navegador http://[IP/Nome do Elasticsearch]:9200/_cat/nodes?v

Se você conseguir acessar, é melhor fechá-la rapidamente.

Protegendo a conexão com o banco de dados.

Agora, vamos garantir que a base não possa ser acessada sem autenticação.

O Elasticsearch possui um módulo de autenticação que limita o acesso ao banco, mas ele está disponível apenas no pacote pago de plugins X-Pack (1 mês de uso gratuito).

A boa notícia é que, no outono de 2019, a Amazon abriu seus desenvolvimentos que se sobrepõem ao X-Pack. A função de autenticação ao conectar ao banco se tornou disponível sob uma licença livre para a versão Elasticsearch 7.3.2, e já está em desenvolvimento um novo lançamento para a versão 7.4.0.

A instalação deste plugin é simples. Acesse o console do servidor e conecte o repositório:

Baseada em RPM:

curl https://d3g5vo6xdbdb9a.cloudfront.net/yum/opendistroforelasticsearch-artifacts.repo -o /etc/yum.repos.d/opendistroforelasticsearch-artifacts.repo

yum update

yum install opendistro-security


Baseada em DEB:

wget -qO ‐ https://d3g5vo6xdbdb9a.cloudfront.net/GPG-KEY-opendistroforelasticsearch | sudo apt-key add -

Configurando a interação entre servidores via SSL.

Ao instalar o plugin, a configuração da porta de conexão ao banco de dados é alterada. A criptografia SSL é ativada. Para que os servidores do cluster continuem funcionando juntos, é necessário configurar a interação entre eles usando SSL.

A confiança entre os hosts pode ser estabelecida usando uma autoridade certificadora própria ou não. Com o primeiro método, é simples: basta consultar especialistas em CA. Vamos diretamente para o segundo.

  1. Criamos uma variável com o nome completo do domínio:

    export DOMAIN_CN="example.com"

  2. Criamos uma chave privada:

    openssl genrsa -out root-ca-key.pem 4096

  3. Assinamos o certificado raiz. Guarde-o a sete chaves: em caso de perda ou comprometimento, a confiança entre todos os hosts precisará ser reconfigurada.

    openssl req -new -x509 -sha256 -subj "\/C=RU\/ST=Moscow\/O=Moscow, Inc.\/CN=${DOMAIN_CN}" 
    -key root-ca-key.pem -out root-ca.pem

  4. Criamos a chave do administrador:

    openssl genrsa -out admin-key-temp.pem 4096
    openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt 
    -v1 PBE-SHA1-3DES -out admin-key.pem

  5. Criamos uma solicitação para assinatura do certificado:

    openssl req -new -subj "\/C=RU\/ST=Moscow\/O=Moscow Inc.\/CN=${DOMAIN_CN}\/CN=admin " 
    -key admin-key.pem -out admin.csr

  6. Criamos o certificado do administrador:

    openssl x509 -req -extensions usr_cert -in admin.csr -CA root-ca.pem 
    -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem

  7. Criamos certificados para o nó Elasticsearch:

    export NODENAME="node-01"
    openssl genrsa -out ${NODENAME}-key-temp.pem 4096
    openssl pkcs8 -inform PEM -outform PEM -in ${NODENAME}-key-temp.pem -topk8 -nocrypt 
    -v1 PBE-SHA1-3DES -out ${NODENAME}-key.pem

  8. Criamos uma solicitação de assinatura:

    openssl req -new -subj "\/C=RU\/ST=Moscow\/O=Moscow Inc.\/CN=${NODENAME}.${DOMAIN_CN}"  
    -addext"subjectAltName=DNS:${NODENAME}.${DOMAIN_CN},DNS:www.${NODENAME}.${DOMAIN_CN}" 
    -key ${NODENAME}-key.pem -out ${NODENAME}.csr

  9. Assinamos o certificado:

    openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial 
    -sha256 -out node.pem

  10. Distribuímos o certificado entre os nós Elasticsearch na pasta:

    /etc/elasticsearch/


    vamos precisar dos arquivos:

            node-01-key.pem
    	node-01.pem
    	admin-key.pem
    	admin.pem
    	root-ca.pem

  11. Configurando /etc/elasticsearch/elasticsearch.yml – alteramos o nome dos arquivos de certificado para os que geramos:

    opendistro_security.ssl.transport.pemcert_filepath: node-01.pem
    	opendistro_security.ssl.transport.pemkey_filepath: node-01-key.pem
    	opendistro_security.ssl.transport.pemtrustedcas_filepath: root-ca.pem
    	opendistro_security.ssl.transport.enforce_hostname_verification: false
    	opendistro_security.ssl.http.enabled: true
    	opendistro_security.ssl.http.pemcert_filepath: node-01.pem
    	opendistro_security.ssl.http.pemkey_filepath: node-01-key.pem
    	opendistro_security.ssl.http.pemtrustedcas_filepath: root-ca.pem
    	opendistro_security.allow_unsafe_democertificates: false
    	opendistro_security.allow_default_init_securityindex: true
    	opendistro_security.authcz.admin_dn:
    	  − CN=admin,CN=example.com,O=Moscow Inc.,ST=Moscow,C=RU
    	opendistro_security.nodes_dn:
    	  − CN=node-01.example.com,O=Moscow Inc.,ST=Moscow,C=RU

Alteramos as senhas dos usuários internos

  1. Usando o comando abaixo, exibimos o hash da senha no console:

    sh ${OD_SEC}/tools/hash.sh -p [senha]

  2. Trocamos o hash no arquivo pelo obtido:

    /usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml

Configuramos o firewall no sistema operacional

  1. Permitimos a execução do firewall:

    systemctl enable firewalld

  2. Iniciamos ele:

    systemctl start firewalld

  3. Permitimos a conexão ao Elasticsearch:

    firewall-cmd --set-default-zone work
    firewall-cmd --zone=work --add-port=9200/TCP --permanent

  4. Recarregamos as regras do firewall:

    firewall-cmd --reload

  5. Exibindo regras ativas:

    firewall-cmd --list-all

Aplicamos todas as nossas alterações ao Elasticsearch

  1. Criamos uma variável com o caminho completo para a pasta do plugin:

    export  OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/"

  2. Executamos o script que atualizará as senhas e verificará as configurações:

    ${OD_SEC}/tools/securityadmin.sh -cd ${OD_SEC}/securityconfig/ 
    -icl -nhnv -cacert /etc/elasticsearch/root-ca.pem 
    -cert /etc/elasticsearch/admin.pem  
    -key /etc/elasticsearch/admin-key.pem

  3. Verificamos se as alterações foram aplicadas:

    curl -XGET https://[IP/Nome Elasticsearch]:9200/_cat/nodes?v -u admin:[senha] --insecure

Isso é tudo, estas são as configurações mínimas que bloqueiam o Elasticsearch de conexões não autorizadas.

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