====== CA varnostna kopija/obnova ====== **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. ---- ===== Komponente za varnostno kopiranje ===== | 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 | ---- ===== Strategija varnostnega kopiranja ===== flowchart TB subgraph LIVE["PRODUKCIJA"] L1[CA strežnik] L2[HSM] end subgraph BACKUP["VARNOSTNA KOPIJA"] B1[Šifrirana varnostna kopija] B2[HSM rezervna reža] B3[Shamir deleži] end subgraph OFFLINE["BREZ POVEZAVE"] O1[Sef] O2[Skrbniki] O3[Oddaljena lokacija] end L1 --> B1 --> O1 L2 --> B2 --> O3 L1 --> B3 --> O2 style L2 fill:#e8f5e9 style O1 fill:#e3f2fd ---- ===== Postopek varnostnega kopiranja ===== ==== Programski ključi (brez HSM) ==== #!/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" ==== Ključi v HSM ==== #!/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 ==== Shamirjeva delitev skrivnosti ==== #!/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" ---- ===== Postopek obnovitve ===== ==== Programski ključi ==== #!/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 " 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 ===" ==== Združevanje Shamir deležev ==== #!/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 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 ---- ===== Preverjanje varnostne kopije ===== #!/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 ===" ---- ===== Urnik varnostnega kopiranja ===== | 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 | ---- ===== Kontrolni seznam ===== | # | 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 | | ---- ===== Povezana dokumentacija ===== * [[.:key-ceremony|Ceremonija ključev]] – Varna generacija ključev * [[.:notfall-revocation|Preklic v sili]] – Ob kompromitaciji * [[sl:int:pqcrypt:administrator:betrieb|Obratovanje]] – Vsakodnevno vzdrževanje ---- << [[.:start|← Obnova po katastrofi]] | [[.:key-ceremony|→ Ceremonija ključev]] >> ---- //Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional// {{tag>backup restore disaster-recovery ca operator}}