Site is under maintenance mode. Please wait few min!
Saltar al contenido

Cómo proteger su servidor contra la vulnerabilidad de COW Linux.

marzo 4, 2020

 

Introducción

En este tutorial, vamos a mostrar cómo utilizar Ansible, una herramienta de gestión de la configuración, la instalación de un clúster de producción Elasticsearch en Ubuntu 14.04 o CentOS 7 en un entorno de servidor de la nube. Vamos a construir sobre cómo utilizar el Ansible y Tinc VPN para asegurar su infraestructura tutorial Server para asegurarse de que sus nodos Elasticsearch estarán a salvo de equipos fuera de su propia red.

Elasticsearch es un servidor de búsqueda de código abierto popular que se utiliza para la búsqueda distribuida en tiempo real y análisis de datos. Cuando se usa para otra cosa que el desarrollo de cualquier cosa, Elasticsearch deben desplegarse en varios servidores como un grupo, para el mejor rendimiento, estabilidad y escalabilidad.

Requisitos previos

debe tener al menos tres Ubuntu 14.04 o CentOS 7 servidores, la red privada, para completar este tutorial, ya que un grupo de Elasticsearch debe tener un mínimo de 3 nodos maestros elegibles. Si usted quiere tener dedicados maestros y de los nodos, necesitará al menos 3 servidores de nodos maestros más servidores adicionales para los nodos de datos. También tenga en cuenta que, si se desea usar la Elasticsearch tamaño del montón predeterminado de 2 GB, los servidores deben asignarse al menos 4 GB de memoria.

Después de la obtención de sus servidores, los configure para usar una VPN de malla con este tutorial: Cómo utilizar Ansible y Tinc VPN para proteger su infraestructura de servidores. Asegúrese de que cada servidor tiene un nombre de host único inventario Ansible.

Si está utilizando una red privada, como digitalocean red privada, sus servidores será capaz de comunicarse de forma segura con otros servidores en la misma cuenta o equipo dentro de la misma región. Esto es particularmente importante cuando se utilizan Elasticsearch, ya que no tiene la seguridad integrada en su interfaz HTTP. Supuestos

vamos a suponer que todos los servidores que desee utilizar como nodos Elasticsearch tienen una interfaz de VPN que se denomina “tun0”, tal como se describe en el tutorial vinculado anteriormente. Si no lo hacen, y se quiere tener sus nodos ES escuchan en una interfaz diferente, tendrá que hacer los cambios apropiados en el archivo site.yml del libro de jugadas.

También vamos a asumir que su libro de jugadas se encuentra en un directorio llamado ansible-tinc en el directorio principal de su equipo local.

Descargar el ansible-elasticsearch Playbook

elástico proporciona un papel Ansible que se puede utilizar para configurar fácilmente un cluster Elasticsearch. Para usarlo, simplemente hay que añadir que en nuestro libro de jugadas ansible-tinc y definir unos grupos de hosts y asignar los roles apropiados para los grupos. De nuevo, si aún no lo ha seguido el requisito previo VPN tutorial, que se puede encontrar aquí.

En primer lugar, vaya al directorio que su Tinc Ansible Playbook está en:

cd ~/ansible-tinc

  • cd ~ / ansible-tinc

Entonces clon del papel ansible-elasticsearch, que está disponible en la cuenta de GitHub de elástico, en el directorio de papeles del libro de estrategias :

cd roles
git clone https://github.com/elastic/ansible-elasticsearch

  • papeles cd
  • git clone https://github.com/elastic/ansible-elasticsearch

Renombrar el papel de “elasticsearch”:

mv ansible-elasticsearch elasticsearch

  • mv elasticsearch ansible-elasticsearch

actualización de sitio. edición de yml

Let el maestro archivo libro de jugadas, site.yml, para asignar tres funciones diferentes Elasticsearch a tres diferentes grupos de hosts ansible. Esto nos permitirá crear maestro dedicado, los datos dedicados, y / datos maestros elegibles nodos Elasticsearch por simple adición de anfitriones a los grupos apropiados.

cambiar de nuevo al directorio del libro de estrategias Ansible:

cd ~/ansible-playbook

  • cd ~ / ansible-libro de jugadas

En su editor favorito, editar un nuevo archivo llamado elasticsearch.yml. Vamos a utilizar vi:

vi site.yml

  • vi site.yml

Mapa Elasticsearch Dedicado función de maestro de grupo

En la parte inferior del archivo, asigne la función dedicada elasticsearch principal al grupo elasticsearch_master_nodes añadiendo estas líneas:

- hosts: elasticsearch_master_nodes
roles:
- { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: "node01, node02, node03", network.host: "_tun0_, _local_", cluster.name: "production", discovery.zen.ping.multicast.enabled: false, http.port: 9200, transport.tcp.port: 9300, node.data: false, node.master: true, bootstrap.mlockall: true } }
vars:
es_major_version: "2.x"
es_version: "2.2.1"
es_heap_size: "2g"
es_cluster_name: "production"

Esta función creará nodos maestros dedicados, ya que configura los nodos con estos valores: node.master: verdadero y node.data: falso.

Asegúrese de actualizar los nombres de host resaltados en la variable discovery.zen.ping.unicast.hosts para que coincida con los nombres de host Ansible inventario (o direcciones IP VPN) de algunos de sus servidores Elasticsearch. Esto permitirá que estos nodos para descubrir el cúmulo Elasticsearch. En el ejemplo, estamos utilizando node01, node02 y node03 porque esos eran los nombres de host utilizados en la confirmación previa VPN tutorial. Además, si su interfaz VPN se llamará algo distinto de “tun0”, actualice la variable network.host en consecuencia.

Si desea utilizar una versión diferente de Elasticsearch, actualizar es_version. Tenga en cuenta que esta configuración no funcionará para las versiones anteriores a la 2.2 porque las versiones anteriores no aceptan listas delimitados por comas para la variable network.host.

actualización es_heap_size a un valor que es aproximadamente la mitad de la memoria libre en sus servidores maestros dedicados. Por ejemplo, si el servidor tiene alrededor de 4 GB libre, ajuste el tamaño de la pila a “2G”.

Ahora cualquier hosts que pertenecen a los elasticsearch_master_nodes grupo de hosts Ansible se configurará como maestro dedicado nodos Elasticsearch.

Mapa Elasticsearch Maestro / a de datos Rol Grupo

En la parte inferior del archivo, el mapa la función de maestro-elegibles y datos elasticsearch al grupo elasticsearch_master_data_nodes añadiendo estas líneas:

- hosts: elasticsearch_master_data_nodes
roles:
- { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: "node01, node02, node03", network.host: "_tun0_, _local_", cluster.name: "production", discovery.zen.ping.multicast.enabled: false, http.port: 9200, transport.tcp.port: 9300, node.data: true, node.master: true, bootstrap.mlockall: true } }
vars:
es_major_version: "2.x"
es_version: "2.2.1"
es_heap_size: "2g"
es_cluster_name: "production"

Este papel va a crear nodos de datos que son de master elegibles, ya que configura los nodos con estos valores: node.master: verdadero y node.data: cierto.

Asegúrese de actualizar los nombres de host resaltados en la variable discovery.zen.ping.unicast.hosts para que coincida con los nombres de host Ansible inventario (o direcciones IP VPN) de algunos de sus servidores Elasticsearch. Además, si su interfaz VPN se llamará algo distinto de “tun0”, actualice la variable network.host en consecuencia.

Conjunto es_version al mismo valor que ha utilizado para la función de maestro dedicado.

actualización es_heap_size a un valor que es aproximadamente la mitad de la memoria libre en sus servidores / datos maestros elegibles.

Ahora cualquier hosts que pertenecen a los elasticsearch_master_data_nodes grupo de hosts Ansible se configuran como nodos de datos que son elegibles maestro.

Mapa Elasticsearch Dedicado Rol de datos a Grupo

En la parte inferior del archivo, el mapa del dedicado papel elasticsearch datos para el grupo elasticsearch_data_nodes añadiendo estas líneas:

- hosts: elasticsearch_data_nodes
roles:
- { role: elasticsearch, es_instance_name: "node1", es_config: { discovery.zen.ping.unicast.hosts: "node01, node02, node03", network.host: "_tun0_, _local_", cluster.name: "production", discovery.zen.ping.multicast.enabled: false, http.port: 9200, transport.tcp.port: 9300, node.data: true, node.master: false, bootstrap.mlockall: true } }
vars:
es_major_version: "2.x"
es_version: "2.2.1"
es_heap_size: "2g"
es_cluster_name: "production"

Este papel va a crear nodos de datos dedicados, ya que configura los nodos con estos valores: node.master: falso y node.data: cierto.

Asegúrese de actualizar los nombres de host resaltados en la variable discovery.zen.ping.unicast.hosts para que coincida con los nombres de host Ansible inventario (o direcciones IP VPN) de algunos de sus servidores Elasticsearch. Además, si su interfaz VPN se llamará algo distinto de “tun0”, actualice la variable network.host en consecuencia.

Conjunto es_version con el mismo valor que ha utilizado en los papeles anteriores.

actualización es_heap_size a un valor que es aproximadamente la mitad de la memoria libre en los servidores de datos dedicados.

Ahora cualquier hosts que pertenecen a los elasticsearch_data_nodes grupo de hosts Ansible se configuran como nodos de datos dedicada Elasticsearch.

Guardar y Salir

Ahora que ha definido los tres papeles, y les asignan a grupos de hosts, puede guardar y site.yml salida.

dude en para añadir más funciones Elasticsearch y asignaciones de grupos de acogida después.

actualización del archivo de host Inventario

Ahora que los nuevos papeles Elasticsearch han sido asignadas a grupos de hosts, puede crear diferentes tipos de nodos Elasticsearch por simple adición de los anfitriones a los grupos huésped apropiadas.

Editar el archivo hosts inventario Ansible:

vi hosts

  • vi anfitriones

Si ha seguido el requisito tutorial, el archivo debe ser algo como esto (con sus nombres de host de servidores y direcciones IP):

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=45.55.41.106
node02 vpn_ip=10.0.0.2 ansible_host=159.203.104.93
node03 vpn_ip=10.0.0.3 ansible_host=159.203.104.127
node04 vpn_ip=10.0.0.4 ansible_host=159.203.104.129

[removevpn]

Ahora añadir tres grupos que corresponden a las asignaciones que definimos en site.yml.

[elasticsearch_master_nodes]

[elasticsearch_master_data_nodes]

[elasticsearch_data_nodes]

Ahora distribuir sus anfitriones Elasticsearch entre los nuevos grupos de hosts, dependiendo de los tipos de nodos Elasticsearch que desea el clúster a consistir. Por ejemplo, si quieres tres nodos maestros dedicados y un único nodo de datos dedicado, el archivo de inventario sería algo como esto:

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=45.55.41.106
node02 vpn_ip=10.0.0.2 ansible_host=159.203.104.93
node03 vpn_ip=10.0.0.3 ansible_host=159.203.104.127
node04 vpn_ip=10.0.0.4 ansible_host=159.203.104.129

[removevpn]

[elasticsearch_master_nodes]
node01
node02
node03

[elasticsearch_master_data_nodes]

[elasticsearch_data_nodes]
node04

Nota: Cada nodo Elasticsearch También se debe definir en el grupo de acogida [VPN] para que todos los nodos se pueden comunicar entre sí a través de la VPN. También, cualquier servidor que tiene que conectarse al clúster Elasticsearch también se debe definir en el grupo [VPN] host.

Una vez que el archivo de inventario refleja la configuración deseada Elasticsearch (y VPN), Save and Exit.

Crear Elasticsearch Cluster

Ahora que site.yml y las máquinas está configurado, está listo para crear el clúster Elasticsearch ejecutando el libro de jugadas.

Ejecutar el libro de estrategias con este comando:

ansible-playbook site.yml

  • ansible-libro de jugadas site.yml

Después de que el libro de jugadas completa su carrera, el clúster Elasticsearch debe estar en funcionamiento. El siguiente paso es verificar que todo funciona correctamente.

Verificar Elasticsearch Cluster Estado

Desde cualquiera de sus servidores Elasticsearch, ejecute este comando para imprimir el estado del clúster:

curl -XGET 'http://localhost:9200/_cluster/state?pretty'

  • rizo -XGET ‘http: // localhost: 9200 / _cluster / estado bastante’

Usted debe ver el resultado que indica que un clúster denominado “producción” se está ejecutando. También debe indicar que todos los nodos configurados son miembros:

Cluster State:{
"cluster_name" : "production",
"version" : 8,
"state_uuid" : "SgTyn0vNTTu2rdKPrc6tkQ",
"master_node" : "OzqMzte9RYWSXS6OkGhveA",
"blocks" : { },
"nodes" : {
"OzqMzte9RYWSXS6OkGhveA" : {
"name" : "node02-node1",
"transport_address" : "10.0.0.2:9300",
"attributes" : {
"data" : "false",
"master" : "true"
}
},
"7bohaaYVTeeOHvSgBFp-2g" : {
"name" : "node04-node1",
"transport_address" : "10.0.0.4:9300",
"attributes" : {
"master" : "false"
}
},
"cBat9IgPQwKU_DPF8L3Y1g" : {
"name" : "node03-node1",
"transport_address" : "10.0.0.3:9300",
"attributes" : {
"master" : "false"
}
},
...

Si ves un resultado similar a este, el clúster Elasticsearch está funcionando! Si algunos de sus nodos están desaparecidos, revise su inventario anfitriones Ansible para asegurarse de que sus grupos principal se han definido correctamente.

Solución de problemas

Si aparece el rizo: (7) No se pudo conectar a localhost puerto 9200: Conexión rechazada, Elasticsearch no se está ejecutando en ese servidor. Esto es generalmente causado por errores de configuración en el archivo Elasticsearch site.yml, como entradas o network.host discovery.zen.ping.unicast.hosts incorrectas. Además de revisar ese archivo, también comprobar los registros Elasticsearch en sus servidores (/var/log/elasticsearch
ode01-node1/production.log) en busca de pistas.

Si desea ver un ejemplo del libro de estrategias producido siguiendo este tutorial, echa un vistazo a este repositorio GitHub. Esto debería ayudarle a ver que es lo site.yml y archivo hosts de trabajo se parece.

Conclusión

Su Elasticsearch clúster debe estar en ejecución en un estado saludable, y configurado con algunas optimizaciones básicas!

Elasticsearch tiene muchas otras opciones de configuración que no fueron cubiertos aquí, como el índice, casco, y los parámetros de replicación. Se recomienda que vuelva a visitar la configuración más tarde, junto con la documentación oficial, para asegurar que el clúster está configurado para satisfacer sus necesidades.