====== 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:**
* OK
* AVVISO
* CRITICO
----
===== 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 =====
* [[.:zertifikat-erneuern|Rinnovo certificato]] - Per certificati in scadenza
* [[..:monitoring:ablauf-monitoring|Monitoraggio scadenze]] - Sorveglianza automatizzata
* [[..:monitoring:alerting-setup|Setup Alerting]] - Notifiche
----
<< [[.:zertifikat-widerrufen|Revoca certificato]] | [[..:start|Scenari Operator]] >>
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//
{{tag>runbook health-check monitoring operator}}