Η στόχευση ενός εικονικού κεντρικού υπολογιστή Subversion σε διεύθυνση VPN αλλάζει ποιος ιστότοπος απαντά σε ένα αίτημα, όχι ποιος επιτρέπεται να το στείλει. Ο έλεγχος πρόσβασης γίνεται αργότερα, σύμφωνα με τους κανόνες στην ενότητα που ταίριαξε με το URL, και το όνομα κεντρικού υπολογιστή δεν μπαίνει ποτέ σε αυτή την απόφαση. Αν το ServerName ήταν η μόνη σας αλλαγή, το αποθετήριο είναι ακριβώς τόσο προσβάσιμο όσο χθες. Δύο ξεχωριστές ερωτήσεις πρέπει να απαντηθούν στη διαμόρφωση: ποια υποδοχή δέχτηκε τη σύνδεση και ποια ταυτότητα έφερε το αίτημα.

Τι αποφασίζει στην πραγματικότητα το ServerName

Η εικονική φιλοξενία βάσει ονόματος συγκρίνει την κεφαλίδα Host με εγγραφές ServerName και ServerAlias, επιλέγει έναν κεντρικό υπολογιστή και τον αφήνει να χειριστεί το αίτημα. Η ίδια η σύνδεση είχε γίνει δεκτή νωρίτερα από υποδοχή Listen που ανήκει στον διακομιστή, όχι στον κεντρικό υπολογιστή. Γι' αυτό ένα όνομα που φαίνεται ιδιωτικό δεν προσφέρει καμία προστασία: κάθε πελάτης που φτάνει στην υποδοχή μπορεί να στείλει αυτή την κεφαλίδα Host. Το όνομα είναι κλειδί δρομολόγησης, και τα κλειδιά δρομολόγησης τα επιλέγει ο καλών.

Μπορείτε να δείτε την αντιστοίχιση χωρίς εικασίες. Το apachectl -S εκτυπώνει κάθε κεντρικό υπολογιστή, τη θύρα και τα ονόματά του και σημειώνει ποιος είναι ο προεπιλεγμένος για τη διεύθυνση.

Το RequireAll είναι το δοχείο που καθιστά υποχρεωτικούς και τους δύο ελέγχους

Το Apache 2.4 τυλίγει τις οδηγίες Require μιας ενότητας σε ένα σιωπηρό RequireAny, άρα δύο γυμνές οδηγίες σημαίνουν ότι αρκεί οποιαδήποτε από τις δύο. Προσθέστε το δοχείο και το νόημα αντιστρέφεται:

<Location /svn/repo>
    AuthType Basic
    AuthName "Subversion"
    AuthBasicProvider file
    AuthUserFile /etc/apache2/svn.htpasswd
    <RequireAll>
        Require ip 10.8.0.0/24
        Require valid-user
    </RequireAll>
</Location>

Το RequireAll απαιτεί και τις δύο συνθήκες: διεύθυνση προέλευσης εντός του εύρους της σήραγγας και χρήστη που δέχεται το αποθετήριο. Αυτό θα έπρεπε να σημαίνει μόνο-VPN για ένα URL Subversion. Η αναφορά του mod_authz_core τεκμηριώνει τους κανόνες του δοχείου. Κρατήστε το μπλοκ μέσα στο υπάρχον Location για το αποθετήριο και αφήστε τις οδηγίες DAV που ήδη λειτουργούν στη θέση τους, γιατί αυτό το απόσπασμα δεν αντικαθιστά ούτε το AuthType ούτε το αρχείο κωδικών ούτε την εξουσιοδότηση σε επίπεδο διαδρομής.

Ο έλεγχος προέλευσης προέρχεται από το mod_authz_host, οπότε επιβεβαιώστε ότι έχει φορτωθεί πριν εντοπίσετε οτιδήποτε άλλο: apachectl -M | grep authz_host.

Η διεύθυνση που αξιολογεί το Apache είναι η διεύθυνση της υποδοχής

Το Require ip συγκρίνει με τη διεύθυνση που κατέγραψε το Apache για τη σύνδεση, και αυτή δεν είναι πάντα η διεύθυνση που ο πελάτης νομίζει ότι έχει.

Όταν το VPN δρομολογεί τις διευθύνσεις του χωρίς μετάφραση, το Apache βλέπει τη διεύθυνση της σήραγγας και το 10.8.0.0/24 ταιριάζει. Όταν μια πύλη μεταφράζει, το Apache βλέπει την πύλη και ο κανόνας σιωπηλά δεν ταιριάζει με τίποτα· το ίδιο συμβαίνει πίσω από εξισορροπητή φόρτου που τερματίζει το TLS μπροστά από τον κεντρικό υπολογιστή. Γι' αυτή την περίπτωση υπάρχει το mod_remoteip. Το RemoteIPHeader X-Forwarded-For μαζί με το RemoteIPTrustedProxy για τον εξισορροπητή αντικαθιστά την καταγεγραμμένη διεύθυνση, και μόνο τότε το εύρος έχει κάτι να συγκρίνει.

Το να εμπιστεύεσαι μια αυθαίρετη κεφαλίδα προώθησης είναι χειρότερο από το να μην έχεις καθόλου κανόνα. Κάθε πελάτης μπορεί να στείλει X-Forwarded-For που περιέχει 10.8.0.9 και να ικανοποιήσει έναν έλεγχο εύρους που δεν ήταν ποτέ αγκυρωμένος σε έμπιστο άλμα.

Στρώστε τον ακροατή και την πολιτική του αποθετηρίου

Η δέσμευση είναι ξεχωριστός έλεγχος και συχνά ο απλούστερος. Το Listen 10.8.0.1:443 αποφασίζει ποιες υποδοχές υπάρχουν, και ένα αίτημα δεν μπορεί να επιλέξει κεντρικό υπολογιστή σε υποδοχή που δεν άνοιξε ποτέ. Το κόστος είναι η σειρά εκκίνησης: αν η διεπαφή της σήραγγας είναι ανενεργή όταν ξεκινά το Apache, η δέσμευση αποτυγχάνει και η υπηρεσία δεν ανεβαίνει. Συνδυάστε την με σειρά μονάδων ή δεσμεύστε σε διεύθυνση που υπάρχει ανεξάρτητα από τη σήραγγα.

Τα δικαιώματα διαδρομής μένουν στο AuthzSVNAccessFile. Ένας έγκυρος λογαριασμός για τον ιστότοπο δεν είναι η ίδια παραχώρηση με την πρόσβαση εγγραφής σε διαδρομή έργου, και ο κανόνας δικτύου δεν το αλλάζει.

Προσέξτε τη συγχώνευση ενοτήτων όταν το μπλοκ βρίσκεται σε συμπεριλαμβανόμενο αρχείο. Το Apache συγχωνεύει δοχεία εξουσιοδότησης σε ένθετες ενότητες και η πιο συγκεκριμένη που ταιριάζει μπορεί να αντικαταστήσει την απαίτηση αντί να την προσθέσει, οπότε ένας κανόνας στο /svn μπορεί να μην φτάνει στο /svn/repo/trunk μόλις μια στενότερη ενότητα ορίσει τον δικό της.

Αποδείξτε και τις δύο απορρίψεις πριν το θεωρήσετε έτοιμο

Δοκιμάστε τέσσερα αιτήματα, όχι ένα. Μέσα στο VPN με έγκυρο λογαριασμό θα πρέπει να λάβετε τη λίστα του αποθετηρίου. Μέσα στο VPN με λάθος κωδικό θα πρέπει να λάβετε 401 αντί για λίστα. Από έξω από το VPN με έγκυρα διαπιστευτήρια θα πρέπει να λάβετε 403, και το ίδιο δημόσιο αίτημα προς εναλλακτικό όνομα κεντρικού υπολογιστή πρέπει να αποτύχει με τον ίδιο τρόπο.

Μία εντολή ανά περίπτωση αρκεί: curl -sI -u user:pass https://svn.example.com/svn/repo/, μετά διαβάστε τη γραμμή κατάστασης. Επαναλάβετε και τη λειτουργική περίπτωση μέσω του πραγματικού πελάτη, γιατί το svn info ασκεί τις μεθόδους DAV που θα χρησιμοποιήσουν τα commits και οι ενημερώσεις.

Αν οποιοδήποτε από τα τέσσερα αποτελέσματα διαφωνεί με την πολιτική που σκοπεύατε, η διαμόρφωση δεν έχει ολοκληρωθεί, και η μετονομασία του κεντρικού υπολογιστή δεν θα το αλλάξει.

Σχετικά άρθρα