Δεν χρειάζεστε προσωρινό αρχείο για να δημιουργήσετε κλειδί OpenVPN
Η συγκράτηση του υλικού κλειδιού στη μνήμη αποφεύγει έναν κύκλο ζωής αρχείου, όχι μια διαρροή. Κρατήστε χωριστές τη ροή εξόδου και τη ροή σφάλματος, και μετά αντιμετωπίστε το κλειδί ως μυστικό.
Η δημιουργία κλειδιού δεν χρειάζεται προσωρινό αρχείο, και το να το παραλείψετε διορθώνει λιγότερα απ' όσα υπονοούν οι περισσότεροι οδηγοί. Αυτό που αφαιρεί είναι ένας κύκλος ζωής αρχείου και η κούρσα καθαρισμού γύρω του. Αυτό που αφήνει άθικτο είναι κάθε ευκαιρία να διαρρεύσει το μυστικό αργότερα. Το πρόβλημα ορθότητας σε αυτά τα σενάρια βρίσκεται συνήθως αλλού, γιατί η διαγνωστική και το υλικό κλειδιού ταξιδεύουν σε διαφορετικές ροές.
Το αρχείο δεν ήταν ποτέ η έκθεση που νομίζατε
Ένα προσωρινό αρχείο είναι συγκεκριμένος κίνδυνος όταν είναι αναγνώσιμο από όλους, όταν επιβιώνει από κατάρρευση ή όταν ένα βήμα καθαρισμού παραλείπεται μετά από εξαίρεση. Αυτά είναι πραγματικά και αξίζει να διορθωθούν. Είναι επίσης τοπικά, ορατά και εύκολα στη δοκιμή. Ονομάστε το καθένα στο δικό σας σενάριο πριν συμπεράνετε ότι η αλλαγή ήταν καλλωπιστική.
Οι πιο ήσυχοι κίνδυνοι βρίσκονται κατάντη: το κλειδί που εκτυπώνεται κατά την αποσφαλμάτωση, η εξαίρεση που σειριοποιεί ολόκληρο το αντικείμενο αποτελέσματος, ο χειριστής κατάρρευσης που γράφει ένα dump μνήμης, ο συλλέκτης καταγραφών που λαμβάνει τη διαδρομή του αρχείου και μετά το περιεχόμενο. Η αποφυγή προσωρινού αρχείου δεν κάνει τίποτα για κανένα από αυτά, και το να πιστεύετε το αντίθετο είναι ο τρόπος με τον οποίο μια καλόπιστη επανεγγραφή αφήνει το μυστικό πιο εκτεθειμένο από πριν. Αντιμετωπίστε την αλλαγή ως μια βελτίωση σε μια σειρά, όχι ως τη λύση.
Τι γράφει ο πελάτης όταν δεν δίνεται όνομα αρχείου
Οι τρέχουσες εκδόσεις του πελάτη στέλνουν το παραγόμενο κλειδί στην τυπική έξοδο όταν η εντολή κλειδιού δίνεται χωρίς διαδρομή εξόδου. Αυτή η τεκμηριωμένη συμπεριφορά είναι που κάνει βιώσιμη την προσέγγιση στη μνήμη, και αφαιρεί την ανάγκη για το παλαιότερο τέχνασμα της στόχευσης του εργαλείου σε διαδρομή συσκευής.
import subprocess
proc = subprocess.run(
["openvpn", "--genkey", "tls-crypt"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=True,
)
key_material = proc.stdout
Περάστε την εντολή ως λίστα. Εδώ δεν χρειάζεται επέκταση κελύφους, και το να ενεργοποιήσετε κέλυφος θα έκανε το όριο των ορισμάτων εξαρτημένο από εισαγωγικά που δεν ελέγχετε. Χρησιμοποιήστε το προβλεπόμενο εκτελέσιμο με απόλυτη διαδρομή αν το σενάριο μπορεί να τρέξει με διαφορετική διαδρομή αναζήτησης από αυτή που περιμένετε.
Ο έλεγχος κωδικού επιστροφής εμποδίζει τη διαδρομή επιτυχίας να συνεχίσει μετά από αποτυχημένη κλήση. Χωρίς αυτόν, μια κενή συμβολοσειρά byte μπορεί να ρεύσει προς τα εμπρός και να αποτύχει μόνο πολύ αργότερα, στο σημείο όπου χρησιμοποιείται το κλειδί και το μήνυμα σφάλματος δεν αναφέρει καθόλου τη δημιουργία.
Δύο ροές, δύο έννοιες
Η τυπική έξοδος μεταφέρει το κλειδί. Η τυπική έξοδος σφάλματος μεταφέρει ό,τι θέλει να σας πει το εργαλείο, μαζί με προειδοποιήσεις για τη διαμόρφωση, την έκδοση και τον τύπο κλειδιού. Το να ανακατευθύνετε και τις δύο σε ένα buffer είναι το λάθος που παράγει ένα κλειδί με πειστική εμφάνιση και μια πρόταση ραμμένη στη μέση του.
Κρατήστε χωριστή και τη διαδρομή αποτυχίας. Όταν η κλήση αποτύχει, αναφέρετε την εντολή που απέτυχε και την κατάσταση εξόδου, και μετά αποφασίστε συνειδητά αν οποιοδήποτε μέρος της τυπικής εξόδου σφάλματος είναι ασφαλές να εμφανιστεί. Το να ρίξετε ολόκληρο το αντικείμενο αποτελέσματος σε ένα αρχείο καταγραφής είναι η συνηθισμένη συντόμευση, και μπορεί να πάρει μαζί του το κλειδί.
Η ανάγνωση ασφαλής για δυαδικά δεδομένα έχει σημασία αν αργότερα κατακερματίσετε ή συγκρίνετε το υλικό. Η λειτουργία κειμένου με απρόσμενη κωδικοποίηση μπορεί να αλλοιώσει bytes που δεν προορίζονταν ποτέ να είναι κείμενο, και ένα αλλοιωμένο κλειδί δεν ξεχωρίζει από λάθος μέχρι να αποτύχει μια χειραψία.
Αν τελικά το αποθηκεύσετε, κάντε το συνειδητά
Οι περισσότερες εγκαταστάσεις χρειάζονται τελικά το κλειδί στον δίσκο, στην πύλη ή σε αποθήκη μυστικών. Γράψτε το μία φορά, με περιοριστικά δικαιώματα από τη δημιουργία αντί για μεταγενέστερο chmod, και κάντε την εγγραφή ατομική ώστε ένα μερικό αρχείο να μη γίνει ποτέ αυτό που διαβάζει μια υπηρεσία στην εκκίνηση. Μια μετονομασία από διαδρομή στον ίδιο κατάλογο αρκεί συνήθως για αυτό. Αφαιρέστε τη διαδρομή προετοιμασίας στον κλάδο αποτυχίας, γιατί η αποτυχημένη εγγραφή είναι ακριβώς το αντίγραφο που ξεχνούν οι άνθρωποι.
Ορίστε τη λειτουργία του αρχείου όταν δημιουργείται, και κρατήστε περιοριστική και τη λειτουργία του καταλόγου. Αποφύγετε οποιαδήποτε διαδρομή κάτω από τοποθεσία που μια εργασία αντιγράφων ασφαλείας σαρώνει χωρίς σκέψη, γιατί ένα μυστικό σε νυχτερινό αντίγραφο ασφαλείας είναι μυστικό σε κάθε αντίγραφο αυτού του αντιγράφου. Το ίδιο σκεπτικό ισχύει για κοινόχρηστο τόμο που άλλες υπηρεσίες μπορούν να διαβάσουν.
Ένα κοινόχρηστο κλειδί δεν είναι ταυτότητα
Η δημιουργία αυτού του υλικού δεν εκδίδει πιστοποιητικό, δεν εγγράφει πελάτη και δεν καθορίζει ποιος συνδέεται. Το κοινόχρηστο κλειδί προστατεύει ένα κανάλι μεταξύ μερών που ήδη εμπιστεύονται το ένα το άλλο· η ταυτότητα εξακολουθεί να προέρχεται από το πιστοποιητικό και από οποιαδήποτε ταυτοποίηση βρίσκεται μπροστά του.
Οι τύποι κλειδιών επίσης δεν είναι εναλλάξιμοι. Ένα συμμετρικό κλειδί για ένα χαρακτηριστικό δεν είναι άμεσο υποκατάστατο για άλλο, και οι νεότερες εκδόσεις προσθέτουν τις δικές τους παραλλαγές με διαφορετικά αρχεία σε κάθε άκρο. Δημιουργήστε τον τύπο που ονομάζει πραγματικά η διαμόρφωσή σας, και μετά χρησιμοποιήστε τον στον ρόλο που ορίζει αυτός ο τύπος.
Δοκιμάστε το αποτέλεσμα με πραγματική σύνδεση αντί να επιθεωρήσετε το μέγεθος του αρχείου. Αν η χειραψία ολοκληρωθεί και οι καταγραφές δεν δείχνουν προειδοποιήσεις κλειδιού, η διαδρομή δημιουργίας είναι σωστή· αν το κλειδί είχε κοπεί από συγχωνευμένη ροή, η σύνδεση θα αποτύγχανε με τρόπο που δείχνει στον ομότιμο αντί για το σενάριο.