Kritično: CA ključi so najdragocenejše premoženje PKI!
RTO: 4 ure | RPO: 24 ur
Postopki za varnostno kopiranje in obnovitev CA ključev in certifikatov.
| Komponenta | Kritičnost | Frekvenca kopiranja |
| ———— | ———— | ——————— |
| Root-CA zasebni ključ | Kritično | Enkratno + brez povezave |
| Intermediate zasebni ključi | Visoka | Po vsaki spremembi |
| CA certifikati | Srednja | Dnevno |
| CA baza podatkov (index.txt) | Srednja | Dnevno |
| Konfiguracija (openssl.cnf) | Nizka | Ob spremembi |
| CRL podpisovalni ključ | Visoka | S CA ključem |
#!/bin/bash # ca-backup.sh - Ustvarjanje CA varnostne kopije BACKUP_DIR="/backup/pki/$(date +%Y%m%d)" ENCRYPTION_KEY="/etc/pki/backup-key.pem" # RSA javni ključ za šifriranje mkdir -p "$BACKUP_DIR" # 1. Zasebni ključi (šifrirano) echo "Varnostno kopiram zasebne ključe..." for key in /etc/pki/CA/*.key; do keyname=$(basename "$key" .key) # Šifriranje z AES-256 openssl enc -aes-256-cbc -salt -pbkdf2 \ -in "$key" \ -out "$BACKUP_DIR/${keyname}.key.enc" \ -pass file:/etc/pki/backup-passphrase.txt # Ali z RSA javnim ključem (asimetrično) openssl pkeyutl -encrypt \ -pubin -inkey "$ENCRYPTION_KEY" \ -in "$key" \ -out "$BACKUP_DIR/${keyname}.key.rsa-enc" done # 2. Certifikati echo "Varnostno kopiram certifikate..." cp /etc/pki/CA/*.pem "$BACKUP_DIR/" # 3. CA baza podatkov echo "Varnostno kopiram CA bazo podatkov..." cp /etc/pki/CA/index.txt "$BACKUP_DIR/" cp /etc/pki/CA/serial "$BACKUP_DIR/" cp /etc/pki/CA/crlnumber "$BACKUP_DIR/" # 4. Konfiguracija cp /etc/pki/CA/openssl.cnf "$BACKUP_DIR/" # 5. Izdani certifikati tar czf "$BACKUP_DIR/issued-certs.tar.gz" /etc/pki/CA/newcerts/ # 6. Kontrolne vsote cd "$BACKUP_DIR" sha256sum * > SHA256SUMS # 7. Celoten arhiv (opcijsko) cd /backup/pki tar czf "ca-backup-$(date +%Y%m%d).tar.gz" "$(date +%Y%m%d)/" echo "Varnostno kopiranje končano: $BACKUP_DIR"
#!/bin/bash # hsm-backup.sh - HSM varnostna kopija ključev # 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 <cluster-id>
#!/bin/bash # shamir-split.sh - Razdelitev ključa med skrbnike KEY_FILE="/etc/pki/CA/root-ca.key" SHARES=5 THRESHOLD=3 # Z ssss-split (Shamirjeva shema deljenja skrivnosti) cat "$KEY_FILE" | ssss-split -t $THRESHOLD -n $SHARES -w root-ca # Rezultat: 5 datotek (root-ca-1 do root-ca-5) # Za obnovitev so potrebne vsaj 3 # Razdelitev med skrbnike echo "Razdelitev deležev med skrbnike:" echo " Delež 1 → Skrbnik A" echo " Delež 2 → Skrbnik B" echo " Delež 3 → Skrbnik C" echo " Delež 4 → Oddaljen sef" echo " Delež 5 → HSM escrow"
#!/bin/bash # ca-restore.sh - Obnovitev CA iz varnostne kopije BACKUP_FILE="$1" RESTORE_DIR="/etc/pki/CA" if [ -z "$BACKUP_FILE" ]; then echo "Uporaba: $0 <backup-file.tar.gz>" exit 1 fi echo "=== OBNOVITEV CA ===" echo "Varnostna kopija: $BACKUP_FILE" read -p "Nadaljujem? (yes/no): " confirm [ "$confirm" != "yes" ] && exit 1 # 1. Varnostno kopiranje trenutnega stanja echo "Varnostno kopiram trenutno stanje..." mv "$RESTORE_DIR" "${RESTORE_DIR}.pre-restore-$(date +%Y%m%d%H%M%S)" # 2. Razpakiranje varnostne kopije echo "Razpakiram varnostno kopijo..." mkdir -p "$RESTORE_DIR" tar xzf "$BACKUP_FILE" -C "$RESTORE_DIR" --strip-components=1 # 3. Dešifriranje zasebnih ključev echo "Dešifriram zasebne ključe..." 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. Nastavitev dovoljenj chmod 600 "$RESTORE_DIR"/*.key chmod 644 "$RESTORE_DIR"/*.pem chown -R root:root "$RESTORE_DIR" # 5. Preverjanje echo "Preverjam obnovitev..." 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 "OK $(basename "$key"): Ključ/Cert ujemanje" else echo "NAPAKA $(basename "$key"): NEUJEMANJE!" fi fi done # 6. Zagon CA storitev echo "Zaganjam CA storitve..." systemctl start pki-ca systemctl start ocsp-responder echo "=== OBNOVITEV KONČANA ==="
#!/bin/bash # shamir-combine.sh - Obnovitev ključa iz deležev echo "Obnovitev Shamir deležev" echo "Potrebni so vsaj 3 od 5 deležev" # Zbiranje deležev (od skrbnikov) ssss-combine -t 3 > /tmp/restored-key.tmp << EOF <Delež-1-od-skrbnika-A> <Delež-2-od-skrbnika-B> <Delež-3-od-skrbnika-C> EOF # Preverjanje openssl rsa -in /tmp/restored-key.tmp -check -noout if [ $? -eq 0 ]; then echo "Ključ uspešno obnovljen" mv /tmp/restored-key.tmp /etc/pki/CA/root-ca.key chmod 600 /etc/pki/CA/root-ca.key else echo "NAPAKA: Ključ neveljaven!" rm /tmp/restored-key.tmp fi
#!/bin/bash # verify-backup.sh - Preverjanje integritete varnostne kopije BACKUP_DIR="$1" echo "=== Preverjanje varnostne kopije ===" # Preverjanje kontrolnih vsot cd "$BACKUP_DIR" sha256sum -c SHA256SUMS if [ $? -ne 0 ]; then echo "NAPAKA: Neujemanje kontrolne vsote!" exit 1 fi # Preverjanje parov ključ/certifikat for enc_key in *.key.enc; do keyname=$(basename "$enc_key" .key.enc) cert="${keyname}.pem" if [ ! -f "$cert" ]; then echo "OPOZORILO: Ni certifikata za $keyname" continue fi # Dešifriranje in preverjanje (začasno) 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 "OK $keyname: V redu" else echo "NAPAKA $keyname: NEUJEMANJE!" fi rm /tmp/verify.key done echo "=== Preverjanje končano ==="
| Komponenta | Frekvenca | Hramba | Medij |
| ———— | ———– | ——– | ——- |
| CA baza podatkov | Dnevno | 30 dni | Disk → Trak |
| Intermediate ključi | Tedensko | 1 leto | Šifriran disk |
| Root-CA ključ | Enkratno | Trajno | Brez povezave sef |
| Konfiguracija | Ob spremembi | 5 verzij | Git |
| # | Kontrolna točka | |
| — | —————– | — |
| 1 | Skripta za varnostno kopiranje konfigurirana | |
| 2 | Šifrirni ključ varno shranjen | |
| 3 | Shamir deleži razdeljeni | |
| 4 | Cron za varnostno kopiranje aktiven | |
| 5 | Oddaljena varnostna kopija obstaja | |
| 6 | Test obnovitve uspešen | |
| 7 | Zadnje preverjanje < 30 dni |
« ← Obnova po katastrofi | → Ceremonija ključev »
Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional