Κρατήστε την αρχική CA του VPN εκτός σύνδεσης και εκδώστε παρ’ όλα αυτά πιστοποιητικά
Κρατήστε το αρχικό κλειδί έξω από το δίκτυο, υπογράψτε φύλλα με μια ενδιάμεση CA, δημοσιεύστε ένα CRL εγκαίρως και δοκιμάστε την αλυσίδα πριν συνδεθεί ο πρώτος πελάτης.
Το VPN σας απαντά σε συνδέσεις στις 3 τα ξημερώματα, ενώ το μηχάνημα που υπογράφει τα πιστοποιητικά του μένει σβηστό σε ένα συρτάρι. Ένας πελάτης που επικυρώνει το πιστοποιητικό του διακομιστή δεν επικοινωνεί ποτέ με την CA σας, άρα η CA δεν χρειάζεται να είναι προσβάσιμη για καμία σύνδεση. Το κομμάτι που χρειάζεται σχεδιασμό είναι η ημέρα κατά την οποία ένα πιστοποιητικό πρέπει να εκδοθεί, να ανανεωθεί ή να ανακληθεί ενώ το αρχικό κλειδί παραμένει κλειδωμένο.
Τι επικυρώνει πραγματικά μια σύνδεση
Όταν συνδέεται ο πελάτης OpenVPN, διατρέχει την αλυσίδα υπογραφών από το φύλλο του διακομιστή προς τα πάνω έως ένα πιστοποιητικό CA που ήδη εμπιστεύεται, ελέγχει το παράθυρο ισχύος και, αν το προφίλ το προβλέπει, συμβουλεύεται μια λίστα ανάκλησης. Δεν αναζητά ποτέ την αρχική σας CA. Ο διακομιστής κάνει την κατοπτρική διαδικασία για τα πιστοποιητικά πελατών. Κατά τη στιγμή της σύνδεσης υπάρχουν μόνο το φύλλο, η ενδιάμεση και η δέσμη εμπιστοσύνης που διανείματε νωρίτερα.
Αυτό που πραγματικά αποτυγχάνει είναι ένα από τρία πράγματα: το κλειδί υπογραφής δεν είναι διαθέσιμο κατά την έκδοση, μια λίστα ανάκλησης έχει παλιώσει ή η δέσμη εμπιστοσύνης του πελάτη είναι παλαιότερη από την αλυσίδα που παρουσιάζει ο διακομιστής. Το πρώτο είναι πρόβλημα διαδικασίας· τα άλλα δύο είναι προβλήματα διανομής. Κανένα δεν απαιτεί το αρχικό κλειδί να είναι σε απευθείας σύνδεση, και μια διαχειριζόμενη υπηρεσία VPN που απαιτεί ιδιωτικό πιστοποιητικό για τον έλεγχο ταυτότητας της σήραγγας μεταφέρει απλώς την αρχή υπογραφής στον πάροχο. Το Azure σημείο-προς-τοποθεσία λειτουργεί αντίστροφα: ανεβάζετε ένα αρχικό πιστοποιητικό και όσα υπογράφονται κάτω από αυτό θεωρούνται αξιόπιστα, οπότε ρωτήστε ποιος υπογράφει, ποιος επικυρώνει και πώς ένα πιστοποιητικό αποσύρεται νωρίς.
Χτίστε την αρχή σε έναν κεντρικό υπολογιστή που δεν αποκτά ποτέ διεύθυνση
Μια αρχική CA εκτός σύνδεσης χρησιμοποιείται σπάνια: για να υπογράψει το πιστοποιητικό της ενδιάμεσης CA και αργότερα για να το ανανεώσει ή να το ανακαλέσει. Όλα τα άλλα συμβαίνουν ένα επίπεδο πιο κάτω. Κάντε τη δουλειά της αρχής σε μηχάνημα που κρατιέται εκτός δικτύου, αν γίνεται από ζωντανό σύστημα, και καταγράψτε ποιος ήταν στο δωμάτιο. Οι εντολές προϋποθέτουν OpenSSL 1.1.1 ή νεότερο, επειδή το -addext δεν υπάρχει σε παλαιότερες εκδόσεις.
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out root.key
openssl req -x509 -new -key root.key -sha256 -days 7300 \
-subj "/CN=Example VPN Root CA" -out root.crt \
-addext "basicConstraints=critical,CA:TRUE" \
-addext "keyUsage=critical,keyCertSign,cRLSign"
Δημιουργήστε την ενδιάμεση στον κεντρικό υπολογιστή υπογραφής και μεταφέρετε μόνο το αίτημά της στο μηχάνημα εκτός σύνδεσης. Η αρχή υπογράφει αυτό το αίτημα με μήκος διαδρομής μηδέν, οπότε η ενδιάμεση CA μπορεί να υπογράφει πιστοποιητικά τελικών σημείων αλλά δεν μπορεί να δημιουργήσει άλλη CA κάτω από αυτήν. Αυτή η μία επέκταση εμποδίζει έναν παραβιασμένο κεντρικό υπολογιστή υπογραφής να κόψει αρχή ισοδύναμη με την αρχική. Χρησιμοποιήστε ECDSA μόνο αν κάθε πελάτης τρέχει OpenVPN 2.4 ή νεότερο· αλλιώς δημιουργήστε κλειδιά RSA και κρατήστε τη ροή ίδια.
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out intermediate.key
openssl req -new -key intermediate.key -subj "/CN=Example VPN Intermediate CA" -out intermediate.csr
openssl x509 -req -in intermediate.csr -CA root.crt -CAkey root.key \
-CAcreateserial -days 3650 -sha256 -extfile intermediate.ext -out intermediate.crt
Το intermediate.ext περιέχει τα basicConstraints=critical,CA:TRUE,pathlen:0, keyUsage=critical,keyCertSign,cRLSign και authorityKeyIdentifier=keyid:always. Επιστρέψτε το αρχικό κλειδί στο θησαυροφυλάκιό του πριν επανασυνδεθεί ο κεντρικός υπολογιστής υπογραφής. Αν η αρχή πρέπει να μπορεί να ανακαλεί την ενδιάμεση, υπογράψτε την με το openssl ca -config root.cnf -extensions intermediate_ca απέναντι σε ένα index.txt επιπέδου αρχής αντί για το openssl x509 -req, ώστε να καταγράφεται ο σειριακός αριθμός· μετά στείλτε την προκύπτουσα λίστα αρχής μέσα στο προφίλ του πελάτη, όπου ένα crl-verify βασισμένο σε αρχείο τη διαβάζει κατά την εκκίνηση. Στείλτε στους πελάτες μια δέσμη με τα δύο πιστοποιητικά CA· ένα φύλλο μόνο του δεν θα επικυρωθεί απέναντι στην αρχή.
Εκδώστε φύλλα από την ενδιάμεση, με μια βάση δεδομένων
Η υπογραφή με το openssl x509 -req δουλεύει μέχρι να χρειαστεί ανάκληση, επειδή τίποτα δεν καταγράφει τον σειριακό αριθμό. Χρησιμοποιήστε το openssl ca από το πρώτο πιστοποιητικό ώστε σειριακός αριθμός, λήξη και κατάσταση ανάκλησης να ζουν σε μία βάση δεδομένων. Δημιουργήστε τα αρχεία της βάσης μία φορά και μετά κατευθύνετε τη διαμόρφωση σε αυτά:
mkdir -p /etc/vpn-ca/intermediate/newcerts
touch /etc/vpn-ca/intermediate/index.txt
echo 1000 > /etc/vpn-ca/intermediate/serial
echo 1000 > /etc/vpn-ca/intermediate/crlnumber
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /etc/vpn-ca/intermediate
database = $dir/index.txt
new_certs_dir = $dir/newcerts
serial = $dir/serial
crlnumber = $dir/crlnumber
certificate = $dir/intermediate.crt
private_key = $dir/intermediate.key
default_md = sha256
default_days = 365
default_crl_days = 30
unique_subject = no
policy = policy_any
[ policy_any ]
commonName = supplied
[ server_cert ]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature
extendedKeyUsage = serverAuth
subjectAltName = @server_names
[ client_cert ]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature
extendedKeyUsage = clientAuth
[ server_names ]
DNS.1 = vpn.example.com
Η γραμμή χρήσης κλειδιού προϋποθέτει κλειδί ECDSA· προσθέστε το keyEncipherment για RSA. Δώστε σε κάθε πελάτη το δικό του κοινό όνομα, γιατί OpenVPN αναγνωρίζει μια σύνδεση από αυτό το πεδίο, και δύο φορητοί υπολογιστές που μοιράζονται το CN=vpn-client δεν ξεχωρίζουν στα αρχεία καταγραφής, στους κανόνες client-config-dir ή σε οποιαδήποτε αποστολή ανά χρήστη, και χάνετε την απόδοση που κάνει μια απόφαση ανάκλησης υπερασπίσιμη. Εκδώστε και επικυρώστε ένα φύλλο έτσι:
openssl req -new -key alice.key -subj "/CN=alice-laptop" -out alice.csr
openssl ca -config intermediate.cnf -extensions client_cert -in alice.csr -out alice.crt -batch
openssl verify -CAfile ca-bundle.crt -untrusted intermediate.crt alice.crt
Κρατήστε το κλειδί υπογραφής πίσω από ένα όριο πολιτικής αντί να το αντιγράψετε στον κεντρικό υπολογιστή VPN: μια μικρή υπηρεσία που ελέγχει την ταυτότητα του αιτήματος, ελέγχει το κοινό όνομα απέναντι σε μια λίστα επιτρεπόμενων και επιστρέφει μόνο το πιστοποιητικό. Καταγράψτε κάθε σειριακό αριθμό· το αρχείο καταγραφής είναι ο μόνος σύνδεσμος ανάμεσα σε ένα πιστοποιητικό και στο άτομο που το ζήτησε.
Δημοσιεύστε ανακλήσεις χωρίς να ξυπνήσετε την αρχή
Τα πιστοποιητικά πελατών ανακαλούνται από την ενδιάμεση, ποτέ από την αρχή. Η λίστα αρχής μετράει μόνο όταν μια ενδιάμεση καεί. Κατευθύνετε τον διακομιστή στη λίστα της ενδιάμεσης με το crl-verify. Ένα CRL βασισμένο σε αρχείο φορτώνεται κατά την εκκίνηση της υπηρεσίας, οπότε επαναφορτώστε το μετά από κάθε αναγέννηση· η μορφή καταλόγου διαβάζει κατάσταση κατά τη σύνδεση και κοστίζει ένα αρχείο ανά σειριακό αριθμό.
Ανακαλέστε και αναγεννήστε με δύο εντολές από την ίδια βάση δεδομένων:
openssl ca -config intermediate.cnf -revoke /etc/vpn-ca/intermediate/newcerts/1001.pem
openssl ca -config intermediate.cnf -gencrl -out /etc/openvpn/crl.pem
Μετά προσέξτε το ρολόι. Ένα CRL φέρει πεδίο επόμενης ενημέρωσης, και όταν περάσει εκείνη η ημερομηνία ένας ομότιμος που επικυρώνει απορρίπτει τη λίστα αντί να την αγνοήσει. Η μηνιαία αναγέννηση με το default_crl_days = 30 αφήνει περιθώριο· η ετήσια όχι. Συντομότερες διάρκειες ζωής φύλλων είναι ο πιο αξιόπιστος έλεγχος, γιατί η ανάκληση ισχύει μόνο όπου συμβουλεύεται η λίστα.
Δοκιμάστε την αλυσίδα και μετά γράψτε την τελετή
Αναπαράγετε τέσσερις αποτυχίες πριν εμπιστευτείτε τον σχεδιασμό. Επικυρώστε την αλυσίδα με το openssl verify -CAfile ca-bundle.crt -untrusted intermediate.crt server.crt. Συνδεθείτε με ληγμένο πιστοποιητικό πελάτη και επιβεβαιώστε ότι ο διακομιστής το αρνείται. Ανακαλέστε έναν δοκιμαστικό πελάτη, επαναφορτώστε και επιβεβαιώστε ότι η λίστα τίθεται σε ισχύ. Προχωρήστε το ρολόι ενός κεντρικού υπολογιστή μία ημέρα μπροστά, γιατί ένα λάθος ρολόι μπορεί να εκδώσει και να απορρίψει πιστοποιητικά που φαίνονται έγκυρα αλλού.
Μια αρχική CA εκτός σύνδεσης είναι έλεγχος μόνο αν υπάρχουν τα χαρτιά: δύο κατονομασμένα άτομα για την τελετή, αρχείο κάθε υπογεγραμμένου σειριακού αριθμού, κρυπτογραφημένο αντίγραφο ασφαλείας φυλαγμένο χωριστά από το μηχάνημα και δοκιμή επαναφοράς σε απομονωμένο κεντρικό υπολογιστή. Υπογράψτε μια εφεδρική ενδιάμεση κατά την ίδια τελετή ώστε ένας νεκρός κεντρικός υπολογιστής υπογραφής να μη σας αναγκάσει να ξεκλειδώσετε την αρχή τα μεσάνυχτα.
Πριν το θεωρήσετε ολοκληρωμένο, επιβεβαιώστε πέντε πράγματα: το αρχικό κλειδί δεν βρίσκεται σε δικτυωμένο κεντρικό υπολογιστή, το ενδιάμεσο κλειδί ζει μόνο στον κεντρικό υπολογιστή υπογραφής, η δέσμη του πελάτη φέρει και τα δύο πιστοποιητικά CA, το CRL έχει μελλοντική επόμενη ενημέρωση και κάποιος κατέχει καταχώριση ημερολογίου για κάθε λήξη στην αλυσίδα. Αν λείπει ένα, η ρύθμιση που φαίνεται εκτός σύνδεσης είναι απλώς ακαταλόγιστη.