No ano passado, houve muitos vazamentos de bancos de dados
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.
Verificamos se o banco de dados “se destaca” na Internet
Na maioria dos casos conhecidos de vazamentos (
Primeiro, vamos tratar da publicação na Internet. Por que isso acontece? O fato é que para uma operação mais flexível do Elasticsearch
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.
- 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
- 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
- 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 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
- 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
- Assinando o certificado:
openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node.pem
- 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
- 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
- Usando o comando abaixo, enviamos o hash da senha para o console:
sh ${OD_SEC}/tools/hash.sh -p [пароль]
- Altere o hash do arquivo para o recebido:
/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml
Configurando um firewall no sistema operacional
- Permita que o firewall seja iniciado:
systemctl enable firewalld
- Vamos lançá-lo:
systemctl start firewalld
- Permitir conexão com Elasticsearch:
firewall-cmd --set-default-zone work firewall-cmd --zone=work --add-port=9200/TCP --permanent
- Recarregue as regras de firewall:
firewall-cmd --reload
- Aqui estão as regras de trabalho:
firewall-cmd --list-all
Aplicando 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/"
- 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
- 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