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.

Prometheus Node Exporter - Installation und Anbindung an Prometheus

Inhalt:


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.