No último ano, surgiram muitas vazamentos de dados. (, e ). 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.

Verificamos se a base não está exposta na internet.
Na maioria dos casos conhecidos de vazamentos (, ), 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 é 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.
- Criamos uma variável com o nome completo do domínio:
export DOMAIN_CN="example.com" - Criamos uma chave privada:
openssl genrsa -out root-ca-key.pem 4096 - 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 - 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 - 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 - 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 - 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 - 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 - Assinamos o certificado:
openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node.pem - 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 - 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
- Usando o comando abaixo, exibimos o hash da senha no console:
sh ${OD_SEC}/tools/hash.sh -p [senha] - Trocamos o hash no arquivo pelo obtido:
/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml
Configuramos o firewall no sistema operacional
- Permitimos a execução do firewall:
systemctl enable firewalld - Iniciamos ele:
systemctl start firewalld - Permitimos a conexão ao Elasticsearch:
firewall-cmd --set-default-zone work firewall-cmd --zone=work --add-port=9200/TCP --permanent - Recarregamos as regras do firewall:
firewall-cmd --reload - Exibindo regras ativas:
firewall-cmd --list-all
Aplicamos todas as nossas alterações ao Elasticsearch
- Criamos uma variável com o caminho completo para a pasta do plugin:
export OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/" - 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 - 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
