Durante el año pasado, ha habido muchas filtraciones de bases de datos.
Inmediatamente hagamos una reserva de que en nuestra práctica utilizamos Elasticsearch para almacenar registros y analizar registros de herramientas, sistemas operativos y software de seguridad de la información en nuestra plataforma IaaS, que cumple con los requisitos de 152-FZ, Cloud-152.
Comprobamos si la base de datos "sobresale" de Internet
En los casos más conocidos de fugas (
Primero, tratemos la publicación en Internet. ¿Por qué pasó esto? El hecho es que para un funcionamiento más flexible de Elasticsearch
Si puedes entrar, corre para cerrarlo.
Protegiendo la conexión a la base de datos.
Ahora haremos que sea imposible conectarse a la base de datos sin autenticación.
Elasticsearch tiene un módulo de autenticación que limita el acceso a la base de datos, pero sólo está disponible en el conjunto de complementos X-Pack de pago (1 mes de uso gratuito).
La buena noticia es que en otoño de 2019 Amazon abrió sus desarrollos, que se superponen con X-Pack. La función de autenticación al conectarse a una base de datos está disponible bajo una licencia gratuita para la versión Elasticsearch 7.3.2, y ya se está trabajando en una nueva versión para Elasticsearch 7.4.0.
Este complemento es fácil de instalar. Vaya a la consola del servidor y conecte el repositorio:
Basado en RPM:
curl https://d3g5vo6xdbdb9a.cloudfront.net/yum/opendistroforelasticsearch-artifacts.repo -o /etc/yum.repos.d/opendistroforelasticsearch-artifacts.repo
yum update
yum install opendistro-security
Basado en DEB:
wget -qO ‐ https://d3g5vo6xdbdb9a.cloudfront.net/GPG-KEY-opendistroforelasticsearch | sudo apt-key add -
Configurar la interacción entre servidores a través de SSL
Al instalar el complemento, la configuración del puerto de conexión a la base de datos cambia. Permite el cifrado SSL. Para que los servidores del clúster sigan funcionando entre sí, debe configurar la interacción entre ellos mediante SSL.
La confianza entre hosts se puede establecer con o sin su propia autoridad de certificación. Con el primer método todo está claro: basta con ponerse en contacto con los especialistas de CA. Pasemos directamente al segundo.
- Cree una variable con el nombre de dominio completo:
export DOMAIN_CN="example.com"
- Crea una clave privada:
openssl genrsa -out root-ca-key.pem 4096
- Firme el certificado raíz. Mantenlo seguro: si se pierde o se ve comprometido, será necesario reconfigurar la confianza entre todos los hosts.
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
- Cree una clave 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
- Cree una solicitud para firmar el certificado:
openssl req -new -subj "/C=RU/ST=Moscow/O=Moscow Inc./CN=${DOMAIN_CN}/CN=admin " -key admin-key.pem -out admin.csr
- Cree un 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
- Cree certificados para el nodo 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
- Crear una solicitud de firma:
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
- Firma del certificado:
openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node.pem
- Coloque el certificado entre los nodos de Elasticsearch en la siguiente carpeta:
/etc/elasticsearch/
necesitamos los archivos:node-01-key.pem node-01.pem admin-key.pem admin.pem root-ca.pem
- Configurando /etc/elasticsearch/elasticsearch.yml – cambiar el nombre de los archivos con certificados a los generados por nosotros:
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
Cambiar contraseñas para usuarios internos
- Usando el siguiente comando, enviamos el hash de la contraseña a la consola:
sh ${OD_SEC}/tools/hash.sh -p [пароль]
- Cambie el hash del archivo por el recibido:
/usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml
Configurar un firewall en el sistema operativo
- Permita que se inicie el firewall:
systemctl enable firewalld
- Lancemoslo:
systemctl start firewalld
- Permitir la conexión a Elasticsearch:
firewall-cmd --set-default-zone work firewall-cmd --zone=work --add-port=9200/TCP --permanent
- Vuelva a cargar las reglas del firewall:
firewall-cmd --reload
- Aquí están las reglas de trabajo:
firewall-cmd --list-all
Aplicando todos nuestros cambios a Elasticsearch
- Cree una variable con la ruta completa a la carpeta con el complemento:
export OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/"
- Ejecutemos un script que actualizará las contraseñas y verificará la configuración:
${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
- Compruebe si se han aplicado los cambios:
curl -XGET https://[IP/Имя Elasticsearch]:9200/_cat/nodes?v -u admin:[пароль] --insecure
Eso es todo, estas son las configuraciones mínimas que protegen Elasticsearch de conexiones no autorizadas.
Fuente: habr.com