Como configurar o Elasticsearch para que não haja vazamentos

No ano passado, houve muitos vazamentos nos bancos de dados do Elasticsearch ( aqui , aqui e ali ). Em muitos casos, os dados pessoais foram armazenados no banco de dados. Esses vazamentos poderiam ser evitados se, após a implantação do banco de dados, os administradores tivessem problemas para verificar algumas configurações simples. Hoje vamos falar sobre eles.

Faremos imediatamente uma reserva de que, em nossa prática, usamos o Elasticsearch para armazenar logs e analisar logs de ferramentas de proteção de informações, SO e software em nossa plataforma IaaS que atenda aos requisitos do 152-, Cloud-152. 



Verifique se o banco de dados está "aderindo"


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

Primeiro, trataremos da publicação na Internet. Porque isto é assim? O fato é que, para uma operação mais flexível do Elasticsearch, é recomendável criar um cluster de três servidores. Para que os bancos de dados se comuniquem, é necessário abrir as portas. Como resultado, os administradores não restringem o acesso ao banco de dados e você pode se conectar ao banco de dados de qualquer lugar. É fácil verificar se há acesso externo ao banco de dados. Basta digitar http: // [Nome do IP / Elasticsearch]: 9200 / _cat / nodes? No navegador ? V

Se você conseguir fazer login, execute-o para fechar.

Protegemos a conexão com o banco de dados


Agora, tornaremos impossível a conexão com o banco de dados sem autenticação.

O Elasticsearch possui um módulo de autenticação que restringe o acesso ao banco de dados, mas é apenas no conjunto pago de plug-ins do X-Pack (1 mês de uso gratuito).

A boa notícia é que, no outono de 2019, a Amazon abriu suas bases que cruzam com o X-Pack. A função de autenticação ao conectar-se ao banco de dados ficou disponível sob uma licença gratuita para a versão Elasticsearch 7.3.2., E uma nova versão do Elasticsearch 7.4.0 já está em operação.

A instalação deste plugin é fácil. Entramos no console do servidor e conectamos 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 -

Configuramos a interação entre servidores via SSL


Ao instalar o plug-in, a configuração da porta de conexão com o banco de dados é alterada. Inclui criptografia SSL. Para que os servidores de cluster continuem trabalhando 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: você só precisa entrar em contato com um especialista na CA. Prosseguimos imediatamente 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. Assinamos o certificado raiz. Mantenha-o como o olho do seu olho: se ele 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 um 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. Assinamos o certificado:

    openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial \
    -sha256 -out node.pem
  10. Decompomos o certificado entre os nós do Elasticsearch na pasta:

    /etc/elasticsearch/

    precisamos dos arquivos:

            node-01-key.pem
    	node-01.pem
    	admin-key.pem
    	admin.pem
    	root-ca.pem
  11. Configure /etc/elasticsearch/elasticsearch.yml - altere o nome dos arquivos de certificado 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

Alteramos senhas de usuários internos


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

    sh ${OD_SEC}/tools/hash.sh -p []
  2. Mude o hash no arquivo para o recebido:

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

Configure o firewall no SO


  1. Permita o lançamento do firewall:

    systemctl enable firewalld
  2. Executá-lo:

    systemctl start firewalld
  3. Permitimos a conexão com o Elasticsearch:

    firewall-cmd --set-default-zone work
    firewall-cmd --zone=work --add-port=9200/TCP --permanent
  4. Reiniciando regras de firewall:

    firewall-cmd --reload
  5. Derivamos as regras de trabalho:

    firewall-cmd --list-all

Aplique 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. Execute um script que atualize as senhas e verifique 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

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

Source: https://habr.com/ru/post/undefined/


All Articles