Inhaltsverzeichnis

Runbook: Health Check

Durata: ~5 minuti
Ruolo: Operatore PKI
Frequenza: Giornaliera (consigliato: mattina)


Workflow

flowchart LR subgraph CHECKS["VERIFICHE"] C1[Disponibilità CA] C2[Validità CRL] C3[Stato OCSP] C4[Certificati in scadenza] C5[Spazio disco] end subgraph STATUS["STATO"] S1{OK?} S2[Dashboard] end subgraph ACTION["AZIONE"] A1[Creare ticket] A2[Escalation] end C1 --> S1 C2 --> S1 C3 --> S1 C4 --> S1 C5 --> S1 S1 -->|Sì| S2 S1 -->|No| A1 A1 -->|Critico| A2 style S1 fill:#fff3e0 style A2 fill:#ffebee


Verifica rapida (1 comando)

#!/bin/bash
# pki-health-check.sh - Verifica PKI giornaliera
 
echo "=== PKI Health Check $(date -Iseconds) ==="
 
# 1. Verifica certificati CA
echo -e "\n[1] Certificati CA:"
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="AVVISO"
    [ "$days" -lt 90 ] && status="CRITICO"
    echo "  $(basename $ca): $days giorni [$status]"
done
 
# 2. Validità CRL
echo -e "\n[2] Stato CRL:"
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="AVVISO"
        [ "$days" -lt 1 ] && status="CRITICO"
        echo "  $(basename $crl): $days giorni al prossimo aggiornamento [$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 "  Stato: OK" || echo "  Stato: ERRORE ($ocsp_status)"
 
# 4. Certificati in scadenza (30 giorni)
echo -e "\n[4] Certificati in scadenza (<30 giorni):"
count=$(find /etc/ssl/certs -name "*.pem" -exec openssl x509 -checkend 2592000 -noout -in {} \; 2>/dev/null | grep -c "will expire")
echo "  Numero: $count"
 
# 5. Spazio disco
echo -e "\n[5] Spazio disco:"
df -h /etc/pki /var/log | tail -n +2
 
echo -e "\n=== Fine Health Check ==="

Verifiche dettagliate

1. Certificati CA

# Validità Root-CA
openssl x509 -in /etc/pki/CA/root-ca.pem -enddate -noout
# Risultato atteso: > 10 anni
 
# Validità Intermediate-CA
openssl x509 -in /etc/pki/CA/intermediate-ca.pem -enddate -noout
# Risultato atteso: > 2 anni
 
# Verifica catena certificati
openssl verify -CAfile /etc/pki/CA/root-ca.pem /etc/pki/CA/intermediate-ca.pem
# Risultato atteso: OK

Soglie:

Tipo CA Avviso Critico
——–——————-
Root-CA < 5 anni < 2 anni
Intermediate-CA < 1 anno < 6 mesi

2. Validità CRL

# Metadati CRL
openssl crl -in /var/www/pki/crl.pem -text -noout | head -20
 
# Verifica Next Update
openssl crl -in /var/www/pki/crl.pem -nextupdate -noout
 
# Recupero CRL da CDP
curl -s http://crl.example.com/crl.der | openssl crl -inform DER -text -noout

Soglie:

Metrica Avviso Critico
——–——————-
Next Update < 3 giorni < 1 giorno
Dimensione CRL > 10 MB > 50 MB

3. OCSP Responder

# Disponibilità OCSP
curl -s -o /dev/null -w "HTTP: %{http_code}, Tempo: %{time_total}s\n" http://ocsp.example.com/status
 
# Risposta OCSP per certificato di test
openssl ocsp \
    -issuer /etc/pki/CA/intermediate-ca.pem \
    -cert /etc/ssl/certs/test.pem \
    -url http://ocsp.example.com \
    -resp_text
# Risultato atteso: "Cert Status: good" (o "revoked" se revocato)

Soglie:

Metrica Avviso Critico
——–——————-
Tempo risposta > 500ms > 2s
Stato HTTP ≠ 200 Timeout

4. Certificati in scadenza

# Certificati server (30 giorni)
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 "IN SCADENZA: $1"
    fi
' _ {} \;
 
# Certificati CA (1 anno)
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 "AVVISO CA: $ca"
    fi
done
# PowerShell: Certificati in scadenza
Get-ChildItem Cert:\LocalMachine\My | Where-Object {
    $_.NotAfter -lt (Get-Date).AddDays(30)
} | Format-Table Subject, NotAfter, Thumbprint -AutoSize

5. Risorse di sistema

# Spazio disco directory PKI
df -h /etc/pki /var/log/pki /var/www/pki
 
# Dimensione file log
du -sh /var/log/pki/*
 
# Processi
ps aux | grep -E "(ocsp|openssl)"

Soglie:

Risorsa Avviso Critico
———–——————-
Utilizzo disco > 80% > 95%
Dimensione log > 1 GB > 5 GB

Automazione

Cron-Job

# /etc/cron.d/pki-health-check
# Giornalmente alle 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 (Opzionale)

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

Template Dashboard

Metrica Stato Valore Soglia
——–——–—————-
Validità Root-CA OK 15 anni > 5 anni
Validità Intermediate-CA AVVISO 8 mesi > 1 anno
CRL Next Update OK 5 giorni > 3 giorni
Risposta OCSP OK 120ms < 500ms
Certificati in scadenza AVVISO 3 0
Disco /etc/pki OK 45% < 80%

Legenda:


Matrice di escalation

Riscontro Azione Tempistica
——–——–————
CA < 6 mesi Pianificare rinnovo CA 1 settimana
CRL scaduta Rinnovare CRL immediatamente 1 ora
OCSP non raggiungibile Riavviare responder 30 min
> 10 certificati in scadenza Sprint di rinnovo 1 giorno
Disco > 95% Ruotare/eliminare log Immediato

Runbook correlati


« Revoca certificato | Scenari Operator »


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