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 ? VSe 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.- Crie uma variável com o nome de domínio completo:
export DOMAIN_CN="example.com"
- Crie uma chave privada:
openssl genrsa -out root-ca-key.pem 4096
- 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
- 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
- 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
- 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
- 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
- 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
- Assinamos o certificado:
openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial \
-sha256 -out node.pem
- 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
- 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
- Usando o comando abaixo, exibimos o hash da senha no console:
sh ${OD_SEC}/tools/hash.sh -p []
- Mude o hash no arquivo para o recebido:
/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml
Configure o firewall no SO
- Permita o lançamento do firewall:
systemctl enable firewalld
- Executá-lo:
systemctl start firewalld
- Permitimos a conexão com o Elasticsearch:
firewall-cmd --set-default-zone work
firewall-cmd --zone=work --add-port=9200/TCP --permanent
- Reiniciando regras de firewall:
firewall-cmd --reload
- Derivamos as regras de trabalho:
firewall-cmd --list-all
Aplique todas as nossas alterações ao Elasticsearch
- Crie uma variável com o caminho completo para a pasta com o plugin:
export OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/"
- 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
- 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.