Prometheus Node Exporter - Installation und Anbindung an Prometheus
In diesem Beitrag wird sich alles um den Node Exporter und dessen Anbindung an den zuvor installierten Prometheus Server drehen.
Inhalt:
- Vorwort
- Installation & Konfiguration
- Installation
- A-Record auf die Zieladresse des Servers
- Vorbereitung für den Reverse Proxy
- Reverse Proxy mit Nginx
- Basic Auth
- SSL Zertifikate
- Anbindung an den Prometheus Server
Vorwort
In diesem Beitrag wird es rund um den Prometheus Node Exporter gehen. Mithilfe des Programms können Daten vom Hostsystem augelesen werden und anschließend einem Prometheus Server übergeben werden. Die visuelle Darstellung übernimmt zum Schluss Grafana.
Installation & Konfiguration
Installation
Die Installation erfolgt wie beim Prometheus Server auch, über den APT Paketmanager. Als Hostsystem dient mir ebenso ein Ubuntu 20.04 LTS Server mit aktuellen Updates:
apt install prometheus-node-exporter
Anschließend wird geprüft, ob der Node Exporter läuft und anschließend wird dem Daemon übergeben, das Programm bei System Neustart erneut auszuführen.
systemctl status prometheus-node-exporter
systemctl enable prometheus-node-exporter
Wenn ihr jetzt zur Webadresse navigiert, könnt ihr die Daten im Rohformat einsehen:
http://ip-eures-nodes:9100
Das birgt im aktuellen Stadium noch ein paar Punkte, die Nachbesserung benötigen. Daher werden wir zuerst - wie im Setup des Prometheus Server - einen A Record anlegen, anschließend einen Reverse Proxy anlegen und diesen weiter absichern.
A-Record auf die Zieladresse des Servers
Um die Verbindung vom DNS Namen zur IP Adresse eures Servers zu schaffen, wird zunächst ein entsprechender Eintrag benötigt. Im Beitrag werde ich "node-1.bastii717.dev" als Domain Namen für meinen Node Exporter verwenden, die IP Adresse ist rein fiktiv und sollte durch die IP Adresse eures Servers ersetzt werden.
node-1.bastii717.dev IN A 123.123.123.123
Hinweis: Bis zur korrekten Auflösung eures Domainnamens können bis zu 24 Stunden vergehen!
Vorbereitung für den Reverse Proxy
Die Konfigurationsdatei enthält mehrere Mechanismen die einzeln zwar nur einen kleinen Mehrwert bieten, in der Gesamtheit jedoch erheblich zur Absicherung des Prometheus Server beitragen werden:
- Zuerst werden alle Anfragen, außer von zugelassenen IP Adressen, abgewiesen. Nginx wird per Default mit HTTP Code "403 - Forbidden" antworten.
Dort trage ich die IP Adresse meines Prometheus Server ein. - Anschließend wird Basic Auth implementiert. Dies hat zur Folge, dass sich Besucher der URL mit Nutzername und Kennwort authentifizieren müssen, bevor sie an die Daten des Node Exporter kommen.
- Für einen sicheren Kanal sorgen die SSL Zertifikate, welche mittels ACME.sh Skript von LetsEncrypt beantragt wurden.
Reverse Proxy mit Nginx
Sofern Nginx noch nicht auf dem Server installiert ist, lässt sich dies über den folgenden Befehl nachholen:
apt install nginx
Anschließend wird die default Konfiguration entfernt und eine passende Konfiguration für unseren Prometheus Host angelegt:
rm /etc/nginx/conf.d/default.conf
nano /etc/nginx/conf.d/node.conf
Die Datei erhält folgenden Inhalt:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name node-1.bastii717.dev;
# (I) Allow IP from Prometheus-Server
# Deny all other IPs
allow 123.123.123.123;
deny all;
# (II) addition authentication properties
auth_basic "Protected Area";
auth_basic_user_file /etc/nginx/.htpasswd;
# (III) SSL
ssl_certificate /etc/letsencrypt/node-1.bastii717.dev/ecc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/node-1.bastii717.dev/ecc/key.pem;
location / {
proxy_pass http://localhost:9100;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
# Proxy headers
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
# Proxy timeouts
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# Security Headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# . files
location ~ /\.(?!well-known) {
deny all;
}
}
# HTTP redirect
server {
listen 80;
listen [::]:80;
server_name node-1.bastii717.dev;
# (I) Allow IP from Prometheus-Server
# Deny all other IPs
allow 123.123.123.123;
deny all;
location / {
return 301 https://node-1.bastii717.dev;
}
}
Basic Auth
Basic Auth wird über folgenden Befehl hinzugefügt, ersetzt den entsprechenden User durch einen Benutzer eurer Wahl:
htpasswd -c /etc/nginx/.htpasswd User
Anschließend wird ein Passwort abgefragt, denkt bei der Wahl daran hier ein ausreichend starkes Kennwort zu vergeben.
SSL Zertifikate
Zuletzt werden die SSL Zertifikate beantragt, hierzu sollte ACME.sh im Vorfeld installiert und konfiguriert worden sein:
acme.sh --issue --dns dns_cf --ecc --accountemail "[email protected]" -d node-1.bastii717.dev --keylength ec-384 --key-file /etc/letsencrypt/node-1.bastii717.dev/ecc/key.pem --ca-file /etc/letsencrypt/node-1.bastii717.dev/ecc/ca.pem --cert-file /etc/letsencrypt/node-1.bastii717.dev/ecc/cert.pem --fullchain-file /etc/letsencrypt/node-1.bastii717.dev/ecc/fullchain.pem --reloadcmd "systemctl reload nginx"
acme.sh --install-cert -d node-1.bastii717.dev --key-file /etc/letsencrypt/node-1.bastii717.dev/ecc/key.pem --fullchain-file /etc/letsencrypt/node-1.bastii717.dev/ecc/fullchain.pem --reloadcmd "service nginx reload" --ecc
Anbindung an den Prometheus Server
Auf eurem Prometheus Server muss jetzt noch der entfernte Node aufgenommen werden, von dem künftig Daten protokolliert werden sollen. Hierzu wird die Konfigurationsdatei von Prometheus geändert. Die Erklärung findet sich unterhalb der Konfigurationsdatei.
nano /etc/prometheus/prometheus.yml
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 15s
scrape_timeout: 15s
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
- job_name: 'external_node'
scheme: https
scrape_interval: 15s
scrape_timeout: 15s
basic_auth:
username: node-user
password: node-password
static_configs:
- targets: ['node-01.bastii717.dev']
- targets: ['node-02.bastii717.dev']
- targets: ['node-0X.bastii717.dev']
In der oberen Hälfte ist die Scrape Config für die lokale Instanz zu sehen, also den eigenen Host, auf dem der Prometheus Server selbst läuft. Der für unsere Zwecke interessantere Part befindet sich in der unteren Hälfte:
- job_name: Eindeutiger Prozessname, ich habe mich für "external_node" entschieden
- scheme: https, da wir mithilfe des Reverse Proxy alle Daten über einen SSL verschlüsselten Kanal versenden
- basic_auth: beinhaltet die Zugangsdaten die ihr beim Anlegen der nginx Konfigurationsdatei festgelegt habt.
- static_configs: Legt alle Ziele fest, die der Prometheus Server kontaktieren wird, um Daten zu erhalten. Hier können beliebig viele Hosts aufgelistet werden, solange sich die anderen Parameter nicht unterscheiden.
Wenn die Datei bearbeitet wurde, kann mit dem promtool auf etwaige Fehler getestet werden, bevor im Anschluss Prometheus neu gestartet wird.
promtool check config /etc/prometheus/prometheus.yml
systemctl restart prometheus
Zum Check könnt ihr euch jetzt am Prometheus Server anmelden und zu Status -> Targets navigieren. Ist dort alles grün kann Prometheus euren Node einlesen und sammelt ebenso dessen Daten.
