====== 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}}