====== Backup/Restore CA ======
**Critico:** Le chiavi CA sono l'asset più prezioso della PKI! \\
**RTO:** 4 ore | **RPO:** 24 ore
Procedure per il backup e il ripristino delle chiavi e dei certificati CA.
----
===== Componenti del backup =====
| Componente | Criticità | Frequenza backup |
|------------|-----------|------------------|
| Chiave privata Root-CA | **Critica** | Una volta + Offline |
| Chiavi private Intermediate | **Alta** | Dopo ogni modifica |
| Certificati CA | Media | Giornaliero |
| Database CA (index.txt) | Media | Giornaliero |
| Configurazione (openssl.cnf) | Bassa | Su modifica |
| Chiave firma CRL | Alta | Con chiave CA |
----
===== Strategia di backup =====
flowchart TB
subgraph LIVE["🖥️ PRODUZIONE"]
L1[Server CA]
L2[HSM]
end
subgraph BACKUP["💾 BACKUP"]
B1[Backup cifrato]
B2[HSM Backup Slot]
B3[Shamir Shares]
end
subgraph OFFLINE["🔒 OFFLINE"]
O1[Cassaforte]
O2[Depositari]
O3[Off-Site]
end
L1 --> B1 --> O1
L2 --> B2 --> O3
L1 --> B3 --> O2
style L2 fill:#e8f5e9
style O1 fill:#e3f2fd
----
===== Procedure di backup =====
==== Chiavi software (senza HSM) ====
#!/bin/bash
# ca-backup.sh - Creazione backup CA
BACKUP_DIR="/backup/pki/$(date +%Y%m%d)"
ENCRYPTION_KEY="/etc/pki/backup-key.pem" # Chiave pubblica RSA per cifratura
mkdir -p "$BACKUP_DIR"
# 1. Chiavi private (cifrate)
echo "Backup chiavi private..."
for key in /etc/pki/CA/*.key; do
keyname=$(basename "$key" .key)
# Cifratura con AES-256
openssl enc -aes-256-cbc -salt -pbkdf2 \
-in "$key" \
-out "$BACKUP_DIR/${keyname}.key.enc" \
-pass file:/etc/pki/backup-passphrase.txt
# Oppure con chiave pubblica RSA (asimmetrico)
openssl pkeyutl -encrypt \
-pubin -inkey "$ENCRYPTION_KEY" \
-in "$key" \
-out "$BACKUP_DIR/${keyname}.key.rsa-enc"
done
# 2. Certificati
echo "Backup certificati..."
cp /etc/pki/CA/*.pem "$BACKUP_DIR/"
# 3. Database CA
echo "Backup database CA..."
cp /etc/pki/CA/index.txt "$BACKUP_DIR/"
cp /etc/pki/CA/serial "$BACKUP_DIR/"
cp /etc/pki/CA/crlnumber "$BACKUP_DIR/"
# 4. Configurazione
cp /etc/pki/CA/openssl.cnf "$BACKUP_DIR/"
# 5. Certificati emessi
tar czf "$BACKUP_DIR/issued-certs.tar.gz" /etc/pki/CA/newcerts/
# 6. Checksum
cd "$BACKUP_DIR"
sha256sum * > SHA256SUMS
# 7. Archivio completo (opzionale)
cd /backup/pki
tar czf "ca-backup-$(date +%Y%m%d).tar.gz" "$(date +%Y%m%d)/"
echo "Backup completato: $BACKUP_DIR"
==== Chiavi basate su HSM ====
#!/bin/bash
# hsm-backup.sh - Backup chiavi HSM
# Luna HSM
/usr/safenet/lunaclient/bin/lunacm << EOF
partition backup
partition name = ca-partition
backup file = /backup/hsm/ca-partition-$(date +%Y%m%d).bak
EOF
# Thales HSM
nShield-cknfastrc backup --slotlist=0 --output=/backup/hsm/nshield-$(date +%Y%m%d).bak
# AWS CloudHSM
aws cloudhsmv2 create-cluster-backup --cluster-id
==== Shamir Secret Sharing ====
#!/bin/bash
# shamir-split.sh - Distribuzione chiave ai depositari
KEY_FILE="/etc/pki/CA/root-ca.key"
SHARES=5
THRESHOLD=3
# Con ssss-split (Shamir's Secret Sharing Scheme)
cat "$KEY_FILE" | ssss-split -t $THRESHOLD -n $SHARES -w root-ca
# Risultato: 5 file (root-ca-1 a root-ca-5)
# Minimo 3 necessari per il ripristino
# Distribuzione ai depositari
echo "Distribuzione share ai depositari:"
echo " Share 1 → Depositario A"
echo " Share 2 → Depositario B"
echo " Share 3 → Depositario C"
echo " Share 4 → Cassaforte Off-Site"
echo " Share 5 → HSM Escrow"
----
===== Procedure di ripristino =====
==== Chiavi software ====
#!/bin/bash
# ca-restore.sh - Ripristino CA da backup
BACKUP_FILE="$1"
RESTORE_DIR="/etc/pki/CA"
if [ -z "$BACKUP_FILE" ]; then
echo "Utilizzo: $0 "
exit 1
fi
echo "=== RIPRISTINO CA ==="
echo "Backup: $BACKUP_FILE"
read -p "Continuare? (yes/no): " confirm
[ "$confirm" != "yes" ] && exit 1
# 1. Backup stato attuale
echo "Backup stato attuale..."
mv "$RESTORE_DIR" "${RESTORE_DIR}.pre-restore-$(date +%Y%m%d%H%M%S)"
# 2. Estrazione backup
echo "Estrazione backup..."
mkdir -p "$RESTORE_DIR"
tar xzf "$BACKUP_FILE" -C "$RESTORE_DIR" --strip-components=1
# 3. Decifratura chiavi private
echo "Decifratura chiavi private..."
for enc_key in "$RESTORE_DIR"/*.key.enc; do
keyname=$(basename "$enc_key" .key.enc)
openssl enc -aes-256-cbc -d -pbkdf2 \
-in "$enc_key" \
-out "$RESTORE_DIR/${keyname}.key" \
-pass file:/etc/pki/backup-passphrase.txt
rm "$enc_key"
done
# 4. Impostazione permessi
chmod 600 "$RESTORE_DIR"/*.key
chmod 644 "$RESTORE_DIR"/*.pem
chown -R root:root "$RESTORE_DIR"
# 5. Verifica
echo "Verifica ripristino..."
for key in "$RESTORE_DIR"/*.key; do
cert="${key%.key}.pem"
if [ -f "$cert" ]; then
key_mod=$(openssl rsa -in "$key" -noout -modulus 2>/dev/null | md5sum)
cert_mod=$(openssl x509 -in "$cert" -noout -modulus 2>/dev/null | md5sum)
if [ "$key_mod" = "$cert_mod" ]; then
echo "✓ $(basename "$key"): Corrispondenza Key/Cert"
else
echo "✗ $(basename "$key"): NON CORRISPONDONO!"
fi
fi
done
# 6. Avvio servizi CA
echo "Avvio servizi CA..."
systemctl start pki-ca
systemctl start ocsp-responder
echo "=== RIPRISTINO COMPLETATO ==="
==== Combinazione Shamir Shares ====
#!/bin/bash
# shamir-combine.sh - Ripristino chiave da share
echo "Ripristino Shamir Share"
echo "Necessari minimo 3 di 5 share"
# Raccolta share (dai depositari)
ssss-combine -t 3 > /tmp/restored-key.tmp << EOF
EOF
# Verifica
openssl rsa -in /tmp/restored-key.tmp -check -noout
if [ $? -eq 0 ]; then
echo "Chiave ripristinata con successo"
mv /tmp/restored-key.tmp /etc/pki/CA/root-ca.key
chmod 600 /etc/pki/CA/root-ca.key
else
echo "ERRORE: Chiave non valida!"
rm /tmp/restored-key.tmp
fi
----
===== Verifica backup =====
#!/bin/bash
# verify-backup.sh - Verifica integrità backup
BACKUP_DIR="$1"
echo "=== Verifica backup ==="
# Verifica checksum
cd "$BACKUP_DIR"
sha256sum -c SHA256SUMS
if [ $? -ne 0 ]; then
echo "ERRORE: Mismatch checksum!"
exit 1
fi
# Verifica coppie chiave/certificato
for enc_key in *.key.enc; do
keyname=$(basename "$enc_key" .key.enc)
cert="${keyname}.pem"
if [ ! -f "$cert" ]; then
echo "ATTENZIONE: Nessun certificato per $keyname"
continue
fi
# Decifratura e verifica (temporanea)
openssl enc -aes-256-cbc -d -pbkdf2 \
-in "$enc_key" \
-out /tmp/verify.key \
-pass file:/etc/pki/backup-passphrase.txt
key_mod=$(openssl rsa -in /tmp/verify.key -noout -modulus 2>/dev/null | md5sum)
cert_mod=$(openssl x509 -in "$cert" -noout -modulus 2>/dev/null | md5sum)
if [ "$key_mod" = "$cert_mod" ]; then
echo "✓ $keyname: OK"
else
echo "✗ $keyname: NON CORRISPONDONO!"
fi
rm /tmp/verify.key
done
echo "=== Verifica completata ==="
----
===== Pianificazione backup =====
| Componente | Frequenza | Conservazione | Supporto |
|------------|-----------|---------------|----------|
| Database CA | Giornaliero | 30 giorni | Disk → Tape |
| Chiavi Intermediate | Settimanale | 1 anno | Disco cifrato |
| Chiave Root-CA | Una volta | Permanente | Cassaforte offline |
| Configurazione | Su modifica | 5 versioni | Git |
----
===== Checklist =====
| # | Punto di verifica | ✓ |
|---|-------------------|---|
| 1 | Script backup configurato | ☐ |
| 2 | Chiave cifratura conservata sicura | ☐ |
| 3 | Shamir Share distribuiti | ☐ |
| 4 | Cron backup attivo | ☐ |
| 5 | Backup off-site presente | ☐ |
| 6 | Test ripristino riuscito | ☐ |
| 7 | Ultima verifica < 30 giorni | ☐ |
----
===== Documentazione correlata =====
* [[.:key-ceremony|Cerimonia delle chiavi]] – Generazione sicura chiavi
* [[.:notfall-revocation|Revoca di emergenza]] – In caso di compromissione
* [[it:int:pqcrypt:administrator:betrieb|Operatività]] – Manutenzione giornaliera
----
<< [[.:start|← Disaster Recovery]] | [[.:key-ceremony|→ Cerimonia delle chiavi]] >>
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//
{{tag>backup restore disaster-recovery ca operator}}