Git
Chapters ▾ 2nd Edition

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

Έξυπνο HTTP

Έχουμε πλέον ταυτοποιημένη πρόσβαση μέσω SSH και μη-ταυτοποιημένη πρόσβαση μέσω του git://, αλλά υπάρχει και ένα πρωτόκολλο που μπορεί να τα κάνει και τα δύο ταυτόχρονα. Η εγκατάσταση του έξυπνου HTTP βασικά απλά ενεργοποιεί ένα script CGI, που παρέχεται με τον Git και ονομάζεται git-http-backend, στον διακομιστή. (((εντολές git, http-backend) Αυτό το CGI θα διαβάσει τη διαδρομή και τις κεφαλίδες που θα σταλούν με git fetchgit 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, που είναι απαραίτητες για να λειτουργήσει σωστά το παρακάτω.

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

SetEnv GIT_PROJECT_ROOT /opt/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 να επιτρέψει αιτήματα σε αυτήν τη διαδρομή με κάτι σαν αυτό:

<Directory "/usr/lib/git-core*">
   Options ExecCGI Indexes
   Order allow,deny
   Allow from all
   Require all granted
</Directory>

Τέλος, θα θελήσουμε να κάνουμε τις εγγραφές να πιστοποιούνται με κάποιον τρόπο, πιθανώς με ένα μπλοκ Auth όπως αυτό:

<LocationMatch "^/git/.*/git-receive-pack$">
    AuthType Basic
    AuthName "Git Access"
    AuthUserFile /opt/git/.htpasswd
    Require valid-user
</LocationMatch>

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

$ htdigest -c /opt/git/.htpasswd "Git Access" schacon

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

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

Note

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