Der Prometheus Server

In diesem Beitrag wird der Prometheus Server installiert. Er wird künftig als Grundlage für weitere Visualisierungen innerhalb von Grafana dienen.

Der Prometheus Server

Inhalt:


Vorwort

Prometheus ist eine OpenSource Anwendung zum Monitoring von Servern. Auf Wunsch bietet es einige Funktionalitäten zum Benachrichtigen bei bestimmten Ereignissen an. Ich verwende Prometheus und die Node Exporter zum Monitoring meiner Linux Server, gleichzeitig habe ich eigene Regeln definiert, die mich benachrichtigen, sobald auf dem Server ungewöhnliche Prozesse ablaufen. Die Visualisierung wird im Anschluss meine Grafana Instanz übernehmen, vorgefertigte Dashboards gibt es zuhauf auf der Grafana Website.


Installation

Prometheus Server Installation

Mein Beitrag basiert auf einem Ubuntu 20.04 LTS Server mit root Zugang. Die Einrichtung ist soweit nicht weiter kompliziert, da Prometheus in den Ubuntu Paketquellen enthalten ist.

apt install prometheus

Mit diesem Befehl wird Prometheus, sowie der Prometheus Node Exporter installiert. Ob die Installation erfolgreich verlaufen ist, lässt sich mit folgenden beiden Befehlen prüfen. Wird ausgegeben, dass beide Dienste laufen kann zum Webinterface navigiert werden.

systemctl status prometheus
systemctl status prometheus-node-exporter

Webinterface von Prometheus:

http://ip-adresse-eures-server:9090

Natürlich lässt sich der Server über die (lokale) IP eures Servers in Kombination mit dem passenden Port ansteuern. Da auf diesem Server alle Daten aller Nodes, die Prometheus mit Daten speisen, zusammenlaufen empfiehlt es sich diesen abzusichern. Als einen Schritt von vielen empfiehlt es sich daher, einen Reverse Proxy aufzusetzen um später eine sichere Kommunikation via HTTPS umzusetzen.

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 "prometheus.bastii717.dev" als Domain Namen für meinen Prometheus verwenden, die IP Adresse ist rein fiktiv und sollte durch die IP Adresse eures Servers ersetzt werden.

prometheus.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 meiner Grafana Instanz 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 Prometheus Server 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/prometheus.conf

Die Datei erhält folgenden Inhalt:

server {
    listen                  443 ssl http2;
    listen                  [::]:443 ssl http2;
    server_name             prometheus.bastii717.dev;


    # (I) Allow IP from Grafana-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/prometheus.bastii717.dev/ecc/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/prometheus.bastii717.dev/ecc/key.pem;
    
    location / {
        proxy_pass      http://localhost:9090;
        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 prometheus.bastii717.dev;

    # (I) Allow IP from Grafana-Server
    # Deny all other IPs
    allow 123.123.123.123;
    deny all;

    location / {
        return 301 https://prometheus.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 prometheus.bastii717.dev --keylength ec-384 --key-file /etc/letsencrypt/prometheus.bastii717.dev/ecc/key.pem --ca-file /etc/letsencrypt/prometheus.bastii717.dev/ecc/ca.pem --cert-file /etc/letsencrypt/prometheus.bastii717.dev/ecc/cert.pem --fullchain-file /etc/letsencrypt/prometheus.bastii717.dev/ecc/fullchain.pem --reloadcmd "systemctl reload nginx"

acme.sh --install-cert -d prometheus.bastii717.dev --key-file /etc/letsencrypt/prometheus.bastii717.dev/ecc/key.pem --fullchain-file /etc/letsencrypt/prometheus.bastii717.dev/ecc/fullchain.pem --reloadcmd "service nginx reload" --ecc

Fazit

Der Prometheus Server läuft, startet bei Systemstart und ist bereit Daten von anderen Nodes (Servern/Clients) einzusammeln. Die Konfiguration pro Node Exporter, sowie die Anbindung an die bestehende Grafana Instanz wird in einem Folgeartikel betrachtet.