Chapters ▾ 2nd Edition

4.6 Το Git στον διακομιστή - Έξυπνο HTTP

Έξυπνο HTTP

Έχουμε πλέον ταυτοποιημένη πρόσβαση μέσω SSH και μη-ταυτοποιημένη πρόσβαση μέσω του git://, αλλά υπάρχει και ένα πρωτόκολλο που μπορεί να κάνει και τα δύο ταυτόχρονα. Η εγκατάσταση του Έξυπνου HTTP βασικά απλά ενεργοποιεί ένα script CGI, που παρέχεται με τον Git και ονομάζεται git-http-backend, στον διακομιστή. Αυτό το CGI θα διαβάσει τη διαδρομή και τις κεφαλίδες που θα σταλούν με git fetch ή git push σε μια διεύθυνση URL HTTP και θα καθορίσει εάν ο πελάτης μπορεί να επικοινωνήσει μέσω HTTP (κάτι που ισχύει για όλους τους πελάτες από την έκδοση 1.6.6 και μετά). Αν το CGI διαπιστώσει ότι ο πελάτης είναι έξυπνος, θα επικοινωνήσει μαζί του έξυπνα, αλλιώς θα επανέλθει στη χαζή συμπεριφορά (συνεπώς έχει προς-τα-πίσω συμβατότητα για ανάγνωσεις με τους παλαιότερους πελάτες).

Ας δούμε αναλυτικά μία πολύ βασική ρύθμιση. Θα υποθέσουμε ότι ο διακομιστής CGI είναι ο Apache. Αν δεν έχουμε Apache, μπορούμε να το κάνουμε σε ένα κουτί Linux με κάτι σαν αυτό:

$ sudo apt-get install apache2 apache2-utils
$ a2enmod cgi alias env

Αυτό ενεργοποιεί επίσης τις λειτουργικές μονάδες (modules) mod_cgi, mod_alias και mod_env, που είναι απαραίτητες για να λειτουργήσει σωστά όλο αυτό.

Θα πρέπει επίσης να ορίσουμε την ομάδα χρηστών Unix φακέλων /srv/git σε www-data, ώστε ο web server να έχει πρόσβαση ανάγνωσης και εγγραφής στα αποθετήρια, διότι ο Apache που τρέχει το script CGA θα τρέχει εξ ορισμού ως ο χρήστης:

$ chgrp -R www-data /srv/git

Στη συνέχεια πρέπει να προσθέσουμε κάποια πράγματα στην παραμετροποίηση του Apache για να εκτελέσουμε το git-http-backend ως τον handler για οτιδήποτε μπαίνει στη διαδρομή /git του web server μας.

SetEnv GIT_PROJECT_ROOT /srv/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/

Εάν παραλείψουμε τη μεταβλητή περιβάλλοντος (environment variable) GIT_HTTP_EXPORT_ALL, τότε το Git θα εξυπηρετεί σε μη-ταυτοποιημένους πελάτες μόνο τα αποθετήρια που περιέχουν το αρχείο git-daemon-export-ok, ακριβώς όπως έκανε και ο δαίμονας Git.

Στη συνέχεια θα πρέπει να πούμε στο Apache να επιτρέψει αιτήματα στο git-http-backend και να ταυτοποιεί με κάποιον τρόπο τις εγγραφές με ένα μπλοκ Auth σαν αυτό:

<Files "git-http-backend">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /srv/git/.htpasswd
    Require expr !(%{QUERY_STRING} -strmatch '*service=git-receive-pack*' || %{REQUEST_URI} =~ m#/git-receive-pack$#)
    Require valid-user
</Files>

Αυτό προϋποθέτει την ύπαρξη ενος αρχείου .htpasswd που περιέχει τους κωδικούς πρόσβασης όλων των έγκυρων χρηστών. Να ένα παράδειγμα προσθήκης του χρήστη “schacon” στο αρχείο :

$ htpasswd -c /srv/git/.htpasswd schacon

Υπάρχουν πάρα πολλοί τρόποι με τους οποίους μπορούμε να ζητήσουμε από τον Apache να ταυτοποιεί χρήστες, θα πρέπει να επιλέξουμε έναν και να τον υλοποιήσουμε. Αυτό είναι το απλούστερο παράδειγμα που μπορέσαμε να σκεφτούμε. Είναι σχεδόν βέβαιο ότι θα θέλήσουμε να το εγκαταστήσουμε πάνω από SSL, ώστε όλα αυτά τα δεδομένα να είναι κρυπτογραφημένα.

Δεν θέλουμε να μπούμε πολύ βαθιά στις ρυθμίσεις του Apache, καθώς ενδεχομένως μπορεί να χρησιμοποιούμε διαφορετικό διακομιστή ή να έχουμε διαφορετικές ανάγκες ταυτοποίησης. Η βασική ιδέα είναι ότι το Git έρχεται με ένα CGI που ονομάζεται git-http-backend που όταν καλείται θα κάνει όλες τις διαπραγματεύσεις για αποστολή και λήψη δεδομένων μέσω HTTP. Δεν υλοποιεί το ίδιο την ταυτοποίηση, αλλά αυτό μπορεί εύκολα να ελεγχθεί στο επίπεδο του web server που τον καλεί. Μπορούμε να κάνουμε τα παραπάνω με σχεδόν οποιοδήποτε web server με δυνατότητα CGI, οπότε χρησιμοποιούμε αυτόν που γνωρίζουμε καλύτερα.

Note

Περισσότερες πληροφορίες σχετικά με την παραμετροποίηση της ταυτοποίησης στον Apache, υπάρχουν στην τεκμηρίωση του Apache εδώ: https://httpd.apache.org/docs/current/howto/auth.html.