tls-auth key-direction: το 0 και το 1 πρέπει να διαφέρουν, όχι να ταιριάζουν
Με το tls-auth οι δύο άκρες χρειάζονται αντίθετες κατευθύνσεις, 0 και 1, ή και οι δύο πρέπει να παραλείψουν τη ρύθμιση. Ο ίδιος αριθμός αποτυγχάνει, και το tls-crypt δεν το χρησιμοποιεί ποτέ.
Η μία πλευρά της σήραγγας υπογράφει το κανάλι ελέγχου με μια υποδοχή κλειδιού που η άλλη πλευρά δεν ελέγχει ποτέ, και η σύνδεση πεθαίνει με σφάλμα πιστοποίησης πριν ανταλλαχθεί έστω ένα πιστοποιητικό. Έτσι μοιάζει μια ασυμφωνία κατεύθυνσης στο tls-auth, και είναι ντετερμινιστική: τα ίδια δύο αρχεία αποτυγχάνουν σε κάθε προσπάθεια, από κάθε δίκτυο. Τίποτα στο αρχείο καταγραφής δεν ονομάζει την επιλογή που ψάχνετε, γι' αυτό οι άνθρωποι ξαναχτίζουν κλειδιά και επανεκδίδουν πιστοποιητικά που ποτέ δεν ήταν χαλασμένα. Η λύση είναι να κάνετε τις δύο άκρες συμπληρωματικές ή να αφήσετε και τις δύο αμφίδρομες, αντί να αποδυναμώσετε την επαλήθευση.
Η αποτυχία επέρχεται πριν από τα πιστοποιητικά
Με το tls-auth και οι δύο ομότιμοι κρατούν το ίδιο κοινό κλειδί και ο καθένας χρησιμοποιεί μία από δύο υποδοχές που παράγονται από αυτό: η μία υποδοχή υπογράφει τα εξερχόμενα πακέτα ελέγχου, η άλλη επαληθεύει τα εισερχόμενα. Η κατεύθυνση 0 και η κατεύθυνση 1 αναθέτουν αυτούς τους ρόλους με αντίστροφη σειρά, άρα το ζεύγος πρέπει να είναι συμπληρωματικό για να ταιριάξουν οι έλεγχοι HMAC. Όταν η ανάθεση αντιστραφεί στη μία πλευρά, ο παραλήπτης ψάχνει υπογραφή στη λάθος υποδοχή και απορρίπτει το πακέτο. Η συνεδρία τελειώνει εκεί, γι' αυτό το σφάλμα αφορά την πιστοποίηση πακέτων και όχι κάτι που θα παρήγαγε το αποθετήριο πιστοποιητικών.
Ο ντετερμινισμός μετράει για τη διάγνωση, γιατί ένα πρόβλημα χρόνου ή διαδρομής αφήνει διαφορετικό ίχνος: διαλείπουσες διακοπές, μία κατεύθυνση που αποτυγχάνει ή μια συνεδρία που πεθαίνει μόνο σε συγκεκριμένο δίκτυο. Μια ασυμφωνία κατεύθυνσης αποτυγχάνει στην πρώτη χειραψία κάθε φορά, και αποτυγχάνει πανομοιότυπα σε άλλο μηχάνημα με τα ίδια δύο αρχεία. Διαβάστε το αρχείο καταγραφής στο --verb 4 και βρείτε το πρώτο απορριφθέν πακέτο αντί για την τελευταία γραμμή. Αν αυτή η απόρριψη συμβεί πριν από οποιαδήποτε ανταλλαγή πιστοποιητικών, το κοινό κλειδί και η κατεύθυνσή του είναι τα δύο πράγματα που αξίζει να ελέγξετε.
| What you see | What it rules out | Next check |
|---|---|---|
| Authentication error before any certificate is sent | The data channel is irrelevant; the control channel never authenticated | Compare tls-auth and its direction on both ends |
| Certificate or handshake failure after the control channel authenticates | The shared key and its direction already agree | Check the CA, the certificate dates and the hostname |
| Session completes but throughput or cipher warnings appear | Direction was never the problem | Compare the data-channel cipher settings |
| Startup stops on an options error | The number itself is not the issue | Re-read the inline versus external directive syntax |
Πού ζει ο αριθμός
Το εγχειρίδιο του OpenVPN 2.6 τεκμηριώνει δύο θέσεις για την κατεύθυνση: το δεύτερο όρισμα του tls-auth όταν το κλειδί βρίσκεται σε δικό του αρχείο, και μια αυτόνομη γραμμή key-direction όταν το κλειδί είναι ενσωματωμένο στο προφίλ. Και τα δύο θέτουν την ίδια τιμή, άρα ένα προφίλ πρέπει να χρησιμοποιεί τη μία μορφή ή την άλλη, ποτέ και τις δύο. Και η παράλειψη είναι επιλογή, και βάζει τους δύο ομότιμους σε αμφίδρομη διάταξη που λειτουργεί όταν καμία πλευρά δεν ονομάζει κατεύθυνση. Δύο ομότιμοι με τον ίδιο αριθμό δεν βρίσκονται σε αυτή τη διάταξη: ο καθένας περιμένει να υπογράφει σε μία υποδοχή και να επαληθεύει στην άλλη, και οι δύο το κάνουν με τον ίδιο τρόπο.
# server.conf, external key tls-auth ta.key 0 # client.ovpn, external key tls-auth ta.key 1 # client.ovpn, inline key key-direction 1
Η ενσωματωμένη μορφή είναι οδηγία σε δική της γραμμή, όχι χαρακτηριστικό στην ετικέτα ανοίγματος του μπλοκ κλειδιού, και το να προσθέσετε όρισμα σε αυτή την ετικέτα είναι σφάλμα, όχι αλλαγή κατεύθυνσης. Η θέση μετράει επίσης: η οδηγία βρίσκεται έξω από το μπλοκ στο οποίο ανήκει, άρα μια τιμή γραμμένη μέσα στο μπλοκ διαβάζεται ως υλικό κλειδιού. Αντιγράψτε τη διάταξη που σκόπευε ο διανομέας του προφίλ αντί να επινοήσετε ένα ζεύγος, γιατί ένα προφίλ που λειτουργεί απέναντι σε έναν διακομιστή μπορεί να είναι ήδη κατοπτρισμένο στην άλλη πλευρά.
Τι αφήνει ανέγγιχτο η επιλογή
Δεν κρυπτογραφεί την κίνηση εφαρμογών. Το tls-auth βάζει HMAC γύρω από τα πακέτα του καναλιού ελέγχου, ενώ το κανάλι δεδομένων προστατεύεται από κλειδιά συνεδρίας που διαπραγματεύονται στη χειραψία, άρα ένα ερώτημα για ρυθμό μετάδοσης ή κρυπτογράφηση δεν έχει σχέση με τον αριθμό κατεύθυνσης. Η ρύθμιση δεν προσθέτει και δεύτερο στρώμα κρυπτογράφησης, και αυτή είναι η υπόθεση που στέλνει κόσμο να ψάχνει μακρύτερο κλειδί.
Δεν εφαρμόζεται στο tls-crypt, έναν διαφορετικό μηχανισμό καναλιού ελέγχου με δικές του επιλογές και χειρισμό κλειδιών, και δεν λέει τίποτα για την ταυτότητα πιστοποιητικού κανενός ομότιμου. Άρα μια λειτουργική αντιστοιχία κατεύθυνσης αποδεικνύει μόνο ότι οι δύο άκρες συμφωνούν πώς να πιστοποιούν το κανάλι ελέγχου, όχι ότι επικυρώθηκε η αλυσίδα εμπιστοσύνης.
Ευθυγραμμίστε το ζεύγος και επανασυνδεθείτε
Συγκρίνετε τις δύο ρυθμίσεις πριν αλλάξετε οποιαδήποτε, γιατί η επεξεργασία της πλευράς που ήταν ήδη σωστή διπλασιάζει τη δουλειά. Το grep παρακάτω δείχνει ποιον μηχανισμό επιλέγει κάθε αρχείο· η λεπτομερής εκτέλεση δείχνει αν το κανάλι ελέγχου πιστοποιήθηκε καθόλου. Κρατήστε και τις δύο εξόδους, ώστε η επόμενη αλλαγή να συγκριθεί με γνωστή κατάσταση.
grep -n -E 'tls-auth|tls-crypt|key-direction' server.conf client.ovpn openvpn --config client.ovpn --verb 4 2>&1 | grep -i -E 'hmac|tls error|control channel'
Επανεκκινήστε και τους δύο ομότιμους μετά από κάθε αλλαγή, γιατί αυτές οι επιλογές διαβάζονται μία φορά στην εκκίνηση και η επαναφόρτωση της μίας πλευράς αφήνει το ζεύγος ασυνεπές για όλη τη ζωή της παλιάς συνεδρίας. Αν η ανάπτυξη λειτουργεί τώρα χωρίς ρυθμισμένη κατεύθυνση, η προσθήκη της ρύθμισης στον έναν ομότιμο αναπαράγει την αποτυχία με την οποία ξεκινήσατε· είτε αφήστε και τους δύο είτε ρυθμίστε και τους δύο. Αλλάξτε ένα άκρο τη φορά και κρατήστε το προηγούμενο αρχείο, ώστε μια παλινδρόμηση να είναι επαναφορά δύο λεπτών και όχι ξαναχτίσιμο.
Καταγράψτε τον μηχανισμό, το αρχείο κλειδιού και την κατεύθυνση για κάθε άκρο στις σημειώσεις ανάπτυξης, γιατί αλλιώς το επόμενο άτομο θα διαβάσει δύο παρόμοια αρχεία και θα υποθέσει ότι οι αριθμοί πρέπει να ταιριάζουν μεταξύ τους. Η κατεύθυνση είναι λεπτομέρεια συντονισμού, όχι αναβάθμιση ασφάλειας: χωρίζει τις δύο κατευθύνσεις του καναλιού ελέγχου και δεν κάνει τίποτα άλλο.