Runbook: Health Check

Dauer: ~5 Minuten
Rolle: PKI-Operator
Häufigkeit: Täglich (empfohlen: morgens)


Workflow

flowchart LR subgraph CHECKS["🔍 PRÜFUNGEN"] C1[CA-Verfügbarkeit] C2[CRL-Gültigkeit] C3[OCSP-Status] C4[Ablaufende Zertifikate] C5[Disk Space] end subgraph STATUS["📊 STATUS"] S1{OK?} S2[Dashboard] end subgraph ACTION["⚡ AKTION"] A1[Ticket erstellen] A2[Eskalieren] end C1 --> S1 C2 --> S1 C3 --> S1 C4 --> S1 C5 --> S1 S1 -->|Ja| S2 S1 -->|Nein| A1 A1 -->|Kritisch| A2 style S1 fill:#fff3e0 style A2 fill:#ffebee


Schnellprüfung (1 Befehl)

#!/bin/bash
# pki-health-check.sh - Tägliche PKI-Prüfung
 
echo "=== PKI Health Check $(date -Iseconds) ==="
 
# 1. CA-Zertifikate prüfen
echo -e "\n[1] CA-Zertifikate:"
for ca in /etc/pki/CA/ca-*.pem; do
    days=$(( ($(openssl x509 -enddate -noout -in "$ca" | cut -d= -f2 | date -f - +%s) - $(date +%s)) / 86400 ))
    status="OK"
    [ "$days" -lt 365 ] && status="WARNUNG"
    [ "$days" -lt 90 ] && status="KRITISCH"
    echo "  $(basename $ca): $days Tage [$status]"
done
 
# 2. CRL-Gültigkeit
echo -e "\n[2] CRL-Status:"
for crl in /var/www/pki/*.crl; do
    next=$(openssl crl -in "$crl" -nextupdate -noout 2>/dev/null | cut -d= -f2)
    if [ -n "$next" ]; then
        days=$(( ($(date -d "$next" +%s) - $(date +%s)) / 86400 ))
        status="OK"
        [ "$days" -lt 3 ] && status="WARNUNG"
        [ "$days" -lt 1 ] && status="KRITISCH"
        echo "  $(basename $crl): $days Tage bis Update [$status]"
    fi
done
 
# 3. OCSP-Responder
echo -e "\n[3] OCSP-Responder:"
ocsp_status=$(curl -s -o /dev/null -w "%{http_code}" http://ocsp.example.com/status)
[ "$ocsp_status" = "200" ] && echo "  Status: OK" || echo "  Status: FEHLER ($ocsp_status)"
 
# 4. Ablaufende Zertifikate (30 Tage)
echo -e "\n[4] Ablaufende Zertifikate (<30 Tage):"
count=$(find /etc/ssl/certs -name "*.pem" -exec openssl x509 -checkend 2592000 -noout -in {} \; 2>/dev/null | grep -c "will expire")
echo "  Anzahl: $count"
 
# 5. Speicherplatz
echo -e "\n[5] Speicherplatz:"
df -h /etc/pki /var/log | tail -n +2
 
echo -e "\n=== Ende Health Check ==="

Detailprüfungen

1. CA-Zertifikate

# Root-CA Gültigkeit
openssl x509 -in /etc/pki/CA/root-ca.pem -enddate -noout
# Erwartetes Ergebnis: > 10 Jahre
 
# Intermediate-CA Gültigkeit
openssl x509 -in /etc/pki/CA/intermediate-ca.pem -enddate -noout
# Erwartetes Ergebnis: > 2 Jahre
 
# Zertifikatskette prüfen
openssl verify -CAfile /etc/pki/CA/root-ca.pem /etc/pki/CA/intermediate-ca.pem
# Erwartetes Ergebnis: OK

Schwellwerte:

CA-Typ Warnung Kritisch
——–——————-
Root-CA < 5 Jahre < 2 Jahre
Intermediate-CA < 1 Jahr < 6 Monate

2. CRL-Gültigkeit

# CRL Metadaten
openssl crl -in /var/www/pki/crl.pem -text -noout | head -20
 
# Next Update prüfen
openssl crl -in /var/www/pki/crl.pem -nextupdate -noout
 
# CRL von CDP abrufen
curl -s http://crl.example.com/crl.der | openssl crl -inform DER -text -noout

Schwellwerte:

Metrik Warnung Kritisch
——–——————-
Next Update < 3 Tage < 1 Tag
CRL-Größe > 10 MB > 50 MB

3. OCSP-Responder

# OCSP-Verfügbarkeit
curl -s -o /dev/null -w "HTTP: %{http_code}, Zeit: %{time_total}s\n" http://ocsp.example.com/status
 
# OCSP-Response für Test-Zertifikat
openssl ocsp \
    -issuer /etc/pki/CA/intermediate-ca.pem \
    -cert /etc/ssl/certs/test.pem \
    -url http://ocsp.example.com \
    -resp_text
# Erwartetes Ergebnis: "Cert Status: good" (oder "revoked" wenn widerrufen)

Schwellwerte:

Metrik Warnung Kritisch
——–——————-
Response-Zeit > 500ms > 2s
HTTP-Status ≠ 200 Timeout

4. Ablaufende Zertifikate

# Server-Zertifikate (30 Tage)
find /etc/ssl/certs -name "*.pem" -exec sh -c '
    if openssl x509 -checkend 2592000 -noout -in "$1" 2>/dev/null | grep -q "will expire"; then
        echo "ABLAUFEND: $1"
    fi
' _ {} \;
 
# CA-Zertifikate (1 Jahr)
for ca in /etc/pki/CA/*.pem; do
    if openssl x509 -checkend 31536000 -noout -in "$ca" 2>/dev/null | grep -q "will expire"; then
        echo "CA WARNUNG: $ca"
    fi
done
# PowerShell: Ablaufende Zertifikate
Get-ChildItem Cert:\LocalMachine\My | Where-Object {
    $_.NotAfter -lt (Get-Date).AddDays(30)
} | Format-Table Subject, NotAfter, Thumbprint -AutoSize

5. Systemressourcen

# Speicherplatz PKI-Verzeichnisse
df -h /etc/pki /var/log/pki /var/www/pki
 
# Log-Dateien Größe
du -sh /var/log/pki/*
 
# Prozesse
ps aux | grep -E "(ocsp|openssl)"

Schwellwerte:

Ressource Warnung Kritisch
———–——————-
Disk Usage > 80% > 95%
Log-Größe > 1 GB > 5 GB

Automatisierung

Cron-Job

# /etc/cron.d/pki-health-check
# Täglich um 08:00
0 8 * * * root /usr/local/bin/pki-health-check.sh | mail -s "PKI Health Check $(date +%Y-%m-%d)" pki-team@example.com

Prometheus Exporter (Optional)

# prometheus-pki-exporter.yml
- job_name: 'pki'
  static_configs:
    - targets: ['pki-server:9115']
  metrics_path: /probe
  params:
    module: [certificate]

Dashboard-Vorlage

Metrik Status Wert Schwelle
——–——–—————-
Root-CA Gültigkeit 🟢 15 Jahre > 5 Jahre
Intermediate-CA Gültigkeit 🟡 8 Monate > 1 Jahr
CRL Next Update 🟢 5 Tage > 3 Tage
OCSP Response 🟢 120ms < 500ms
Ablaufende Zertifikate 🟡 3 0
Disk /etc/pki 🟢 45% < 80%

Legende:

  • 🟢 OK
  • 🟡 Warnung
  • 🔴 Kritisch

Eskalationsmatrix

Befund Aktion Zeitrahmen
——–——–————
CA < 6 Monate CA-Renewal planen 1 Woche
CRL abgelaufen CRL sofort erneuern 1 Stunde
OCSP nicht erreichbar Responder neustarten 30 Min
> 10 ablaufende Zertifikate Renewal-Sprint 1 Tag
Disk > 95% Logs rotieren/löschen Sofort

Verwandte Runbooks


« ← Zertifikat widerrufen | → Operator-Szenarien »


Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional

Zuletzt geändert: den 29.01.2026 um 15:13