Installation Elasticsearch - Three Node CLuster
Umgebung:
| Komponente | Name |
|---|---|
| Link: | https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html |
| OS: | Centos Stream 9 |
| Virtualisierung: | vSphere |
| Server A: | Elasticsearch |
| Server B | Elasticsearch |
| Server C: | Elasticsearch |
| Server D: | Kibana |
| Voraussetzung: | JAVA JDK Version |
Server A
Elasticsearch Installation
Per Repo-Einbindung Elastic installieren:
Info: Repo sollte für alle drei Komponenten ausreichen (Elastic, Filebeat, Kibana)[elasticsearch]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
Optional (nur unter RHEL9): update-crypto-policies --set DEFAULT:SHA1
sudo dnf install --enablerepo=elasticsearch elasticsearch
Lesson learned = Es wird ein elastic (Superuser) Passwort nach der Installation im Terminal ausgegeben. Das Passwort ist wichtig für den Zugang zu Elasticsearch. Also am besten speichern. Elasticsearch gibt in der Doku an, das Passwort in eine Umgebungsvariable zu speichern. Erscheint mir unsicher, aber für lokale Instanzen zum ausprobieren sollte es okay sein. In Elasticsearch 8+ sind die Sicherheitseinstellungen an. Das bedeutet, dass in der elasticsearch.yml mehr Optionen in der eingetragen werden müssen als die initiale Doku zeigt. Lesson learned = Entweder über eine .repo Datei oder über ein wget die Installation ermöglichen
Konfiguration
Full elasticsearch.yaml
# ----------------------------Cluster------------------
#-------------------------------Node------------------
node.name: localhost
# Set the bind address to a specific IP (IPv4 or IPv6):
network.host: localhost
#
# Set a custom port for HTTP:
http.port: 9200
# elasticsearch.host: ["http://localhost:9200"]
# --------------------------------- Discovery ----------------------------------
#
# Pass an initial list of hosts to perform discovery when this node is started:
# The default list of hosts is ["127.0.0.1", "[::1]"]
#
discovery.seed_hosts: ["127.0.0.1"]
#
# Bootstrap the cluster using an initial set of master-eligible nodes:
#
#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
#
# The following settings, TLS certificates, and keys have been automatically
# generated to configure Elasticsearch security features on 28-08-2023 14:32:16
#
# --------------------------------------------------------------------------------
# Enable security features
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
enabled: true
keystore.path: /etc/elasticsearch/certs/http.p12
# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
keystore.path: /etc/elasticsearch/certs/transport.p12
truststore.path: /etc/elasticsearch/certs/certs/transport.p12
# Create a new cluster with the current node only
# Additional nodes can still join the cluster later
cluster.initial_master_nodes: ["localhost.localdomain"] # Wenn DNS genutzt werden soll/wird, muss hier der FQDN des Servers stehen
Das bei der Installation erschaffenene Zertifikat muss noch per scp an den Server B (auf dem Logstash installiert wird) kopiert werden und in dem Ordner hinterlegt werden, der in der logstash.yml angegeben ist.
Lesson learned: Wenn man DNS nutzt, dann muss unter cluster.initial_master_nodes ein FQDN eingetragen werden. Probleme kann es geben, wenn der Name nachträglich angepasst wird, nachdem man Elastic installiert hat, da dann die Zertifikate falsch sind.
systemctl daemon-reload
systemctl enable elasticsearch
systemctl start elasticsearch
firewall-cmd --add-port=9200/tcp --permanent
firewall-cmd --reload
Keystore
Nur wenn unter /etc/elasticsearch/ noch nicht enthalten ist:
/usr/share/elasticsearch/bin/elasticsearch-keystore create
Passwort immer neu setzen:
/usr/share/elasticsearch/bin/elasticsearch-keystore passwd
Passwort anzeigen lassen
/usr/share/elasticsearch/bin/elasticsearch-keystore show xpack.security.http.ssl.keystore.secure_password
Um eine CA zu erstellen, muss folgender Befehl eingegeben werden:
Erstellt eine CA:
/usr/share/elasticsearch/bin/elasticsearch-certutil ca
Erstellt ein Cert(braucht man aber bei einem Server nicht, da Initial Certs mitkommen):
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
Lesson learned: In Elastic 8 oder neu wird SSL im Default aktiviert
Der Server muss dann rebootet werden.
Kibana Installation
Kibana Repo unter /etc/yum.repos.d/kibana.repo anlegen.
Konfiguration
Entferne die # vor den Einträgen:
server.port: 5601
server.host: "localhost" # Alternative hier eine IP Addresse ohne "" eintragen
elasticsearch.hosts: ["https://localhost:9200"]
systemctl start kibana
systemctl enable kibana
firewall-cmd --add-port=5601/tcp --permanent
firewall-cmd --reload
Einen Enrollment-Token für Kibana erstellen:
Den Token auf "localhost:5601" im Browser eingeben. Auf dem Server einen Verifizierungs-Code erstellen und im Browser eingeben:Server A
Install Logstash
User anlegen:
In Kibana (auf Server A) muss unter Management -> Dev Tools per API ein User logstash_writer und die Rolle logstash_writer_role erstellt werden.
POST /_security/user/role/logstash_write_role
{
"cluster": [
"monitor",
"manage_index_templates"
],
"indices": [
{
"names": [
"filebeat*"
],
"privileges": [
"write",
"create_index"
],
"field_security": {
"grant": [
"*"
]
}
}
],
"run_as": [],
"metadata": {},
"transient_metadata": {
"enabled": true
}
}
POST /_security/user/logstash_writer
{
"username": "logstash_writer",
"roles" [
"logstash_write_role"
],
"full_name": null,
"email": null
"password": "PASSWORD"
"enabled": true
}
Mit /user/share/elasticsearch/bin/elasticsearch_reset_password -u logstash_writer muss das Passwort neu gesetzt werden und dann per Dev Tools in Kibana gesetzt werden.
Zertifikate übertragen
Übertragung des Zertifikats per scp path/to/http_ca.crt user@IP:/home/user
Übertragung des SSL-Keys perscp path/to/http.p12 user@IP:/home/user
Server B
Installation Installation von Logstash auf dem Server.
Repo-Datei: logstash.repo[logstash-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
# Installation
dnf install logstash
# Erstellung des Ordners für die Zertifikate und der Kopiervorgang
mkdir /etc/logstash/certs
cp /home/user/http* /etc/logstash/certs/
# Änderung der Rechte
chown -R logstash:logstash /etc/logstash/
# X-Pack Management
xpack.management.enabled: true
xpack.management.elasticsearch.username: logstash_system
xpack.management.elasticsearch.password: 'PASSWORD'
xpack.management.elasticsearch.hosts: "https://IP:9200"
xpack.management.elasticsearch.ssl.certificate_authority: "/etc/logstash/certs/http_ca.crt"
xpack.management.elasticsearch.ssl.keystore.path: "/etc/logstash/certs/http.p12"
xpack.management.elasticsearch.ssl.keystore.password: 'PASSOWRD'
#xpack.management.elasticsearch.ssl.certificate: "/etc/logstash/certs/http_ca.crt"
#xpack.management.elasticsearch.ssl.key: "/etc/logstash/certs/http.p12"
Es muss eine Konfigurationsdatei für die Pipeline von Filebeat -> Logstash -> Elasticsearch konfiguriert werden.
Lesson learned: Die Conf-Dateien müssen unter conf.d stehen Lesson learned: SSL ist bei Logstash auch ein "Problem". Es scheint so zu sein, dass man die verschlüsselt .p12 Files sind. Man kann das keystore-Passwort auf den Elasticsearch-Maschinen abfragen.input {
beats {
port => 5044
}
}
filter { #<---- Hier kann der Filter definiert werden
grok {
match => {}
}
date {
match => []
target => ""
}
}
output {
elasticsearch {
hosts => ["https://IP:9200"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}"
cacert => '/etc/logstash/certs/http_ca_crt' #<--- Kann natürlich Variable sein
user => "logstash_writer"
password => "PASSWORD"
ssl => true
}
}
Install Filebeat
Installation Stelle sicher, dass Kibana läuft
Die filebeat.yml ist die Konfig-Datei für Filebeat.Konfiguration Auf jeder Maschine muss eine Filebeat/Beat Konfigurationsdatei angelegt werden.
...
#----------------Filebeat Input--------------------
filebeat.inputs:
- type: log #Hier wird ein Typ angegeben
enabled: true
paths: #Hier werden die Pfade zu den Daten angeben
- /var/log/*.log
#--------------------Logstash Output--------------------
output.logstash
hosts: ["localhost:5044"]
Möchte man Module nutzen, müssen diese per filebeat module enable MODULNAME angeschaltet werden. Die Module liegen unter /etc/filebeat/modules. Das Kommando benennt die Datei von MODULNAME-disabled.yml in MODULNAME.yml