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.
Inhalt:
- Vorwort
- Installation
- Prometheus Server Installation
- A-Record auf die Zieladresse des Servers
- Vorbereitung für den Reverse Proxy
- Reverse Proxy mit Nginx
- Basic Auth
- SSL Zertifikate
- Fazit
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.