Como configurar o Elasticsearch para evitar vazamentos

No ano passado, houve muitos vazamentos de bancos de dados ElasticSearch (aqui, aqui и aqui). Em muitos casos, os dados pessoais foram armazenados na base de dados. Esses vazamentos poderiam ter sido evitados se, após a implantação do banco de dados, os administradores tivessem se preocupado em verificar algumas configurações simples. Hoje falaremos sobre eles.

Imediatamente façamos uma reserva que em nossa prática usamos Elasticsearch para armazenar logs e analisar logs de ferramentas de segurança da informação, SO e software em nossa plataforma IaaS, que atende aos requisitos de 152-FZ, Cloud-152. 

Como configurar o Elasticsearch para evitar vazamentos

Verificamos se o banco de dados “se destaca” na Internet

Na maioria dos casos conhecidos de vazamentos (aqui, aqui) o invasor obteve acesso aos dados de forma simples e despretensiosa: o banco de dados foi publicado na Internet e foi possível conectar-se a ele sem autenticação.  

Primeiro, vamos tratar da publicação na Internet. Por que isso acontece? O fato é que para uma operação mais flexível do Elasticsearch recomendado crie um cluster de três servidores. Para que os bancos de dados se comuniquem entre si, é necessário abrir portas. Como resultado, os administradores não restringem o acesso ao banco de dados de forma alguma e você pode conectar-se ao banco de dados de qualquer lugar. É fácil verificar se o banco de dados é acessível externamente. Basta entrar no navegador http://[IP/Имя Elasticsearch]:9200/_cat/nodes?v

Se você conseguir entrar, corra para fechá-lo.

Protegendo a conexão com o banco de dados

Agora faremos com que seja impossível conectar-se ao banco de dados sem autenticação.

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

A boa notícia é que no outono de 2019 a Amazon inaugurou seus empreendimentos, que se sobrepõem ao X-Pack. A função de autenticação ao conectar-se a um banco de dados foi disponibilizada sob uma licença gratuita para a versão Elasticsearch 7.3.2, e uma nova versão para Elasticsearch 7.4.0 já está em desenvolvimento.

Este plugin é fácil de instalar. Vá para o console do servidor e conecte o repositório:

Baseado 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


Baseado 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 muda. Ele permite a criptografia SSL. Para que os servidores do cluster continuem a trabalhar entre si, é necessário configurar a interação entre eles usando SSL.

A confiança entre hosts pode ser estabelecida com ou sem sua própria autoridade de certificação. Com o primeiro método tudo fica claro: basta entrar em contato com especialistas da CA. Vamos direto para o segundo.

  1. Crie uma variável com o nome de domínio completo:

    export DOMAIN_CN="example.com"

  2. Crie uma chave privada:

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

  3. Assine o certificado raiz. Mantenha-o seguro: se for perdido ou comprometido, 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. Crie uma chave de 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. Crie uma solicitação para assinar o 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. Crie um certificado de 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. Crie 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. Crie 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. Assinando o certificado:

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

  10. Coloque o certificado entre os nós do Elasticsearch na seguinte pasta:

    /etc/elasticsearch/


    precisamos dos arquivos:

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

  11. Configurando /etc/elasticsearch/elasticsearch.yml – alterar o nome dos arquivos com certificados para aqueles gerados por nós:

    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

Alteração de senhas para usuários internos

  1. Usando o comando abaixo, enviamos o hash da senha para o console:

    sh ${OD_SEC}/tools/hash.sh -p [пароль]

  2. Altere o hash do arquivo para o recebido:

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

Configurando um firewall no sistema operacional

  1. Permita que o firewall seja iniciado:

    systemctl enable firewalld

  2. Vamos lançá-lo:

    systemctl start firewalld

  3. Permitir conexão com Elasticsearch:

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

  4. Recarregue as regras de firewall:

    firewall-cmd --reload

  5. Aqui estão as regras de trabalho:

    firewall-cmd --list-all

Aplicando todas as nossas alterações ao Elasticsearch

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

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

  2. Vamos executar um 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. Verifique se as alterações foram aplicadas:

    curl -XGET https://[IP/Имя Elasticsearch]:9200/_cat/nodes?v -u admin:[пароль] --insecure

Só isso, essas são as configurações mínimas que protegem o Elasticsearch de conexões não autorizadas.

Fonte: habr.com

Adicionar um comentário