Git
Chapters ▾ 2nd Edition

4.4 Το Git στον διακομιστή - Στήσιμο του διακομιστή

Στήσιμο του διακομιστή

Θα δούμε τώρα τη διαμόρφωση της πρόσβασης SSH από την πλευρά του διακομιστή. Σε αυτό το παράδειγμα θα χρησιμοποιήσουμε τη μέθοδο authorized_keys για την ταυτοποίηση των χρηστών. Υποθέτουμε επίσης ότι τρέχουμε μια τυπική διανομή Linux όπως το Ubuntu. Καταρχήν, δημιουργούμε έναν χρήστη git και έναν κατάλογο .ssh για αυτόν τον χρήστη.

$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

Στη συνέχεια, πρέπει να προσθέσουμε δημόσια κλειδιά SSH για προγραμματιστές στο αρχείο authorized_keys του χρήστη git. Ας υποθέσουμε ότι έχουμε ορισμένα αξιόπιστα δημόσια κλειδιά και τα έχουμε αποθηκεύσει σε προσωρινά αρχεία. Υπενθυμίζουμε ότι τα δημόσια κλειδιά μοιάζουν με αυτό:

$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair

Απλά τα συνάπτουμε στο τέλος του αρχείου authorized_keys του χρήστη git στον κατάλογο .ssh του χρήστη:

$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys

Τώρα, μπορούμε να δημιουργήσουμε ένα κενό αποθετήριο για αυτούς τους προγραμματιστές, τρέχοντας git init με την επιλογή --bare, η οποία αρχικοποιεί το αποθετήριο χωρίς κατάλογο εργασίας:

$ cd /opt/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /opt/git/project.git/

Στη συνέχεια, ο John, ο Josie ή η Jessica μπορούν να ωθήσουν την πρώτη έκδοση του έργου τους σε αυτό το αποθετήριο, προσθέτοντάς το ως απομακρυσμένο και ωθώντας έναν κλάδο. Να σημειωθεί ότι κάποιος πρέπει να μπαίνει στο κέλυφος στο συγκεκριμένο μηχάνημα και να δημιουργεί ένα γυμνό αποθετήριο κάθε φορά που θέλουμε να προσθέσουμε ένα έργο. Ας χρησιμοποιήσουμε το gitserver ως το hostname του διακομιστή στον οποίο έχουμε δημιουργήσει τον χρήστη git και το αποθετήριο. Αν το τρέξουμε εσωτερικά και έχουμε ρυθμίσει το DNS για το gitserver να δείχνει σε εκείνον τον διακομιστή, τότε μπορούμε να χρησιμοποιήσουμε τις εντολές σχεδόν όπως είναι (με την προϋπόθεση ότι το myproject είναι ένα υπάρχον έργο με αρχεία):

# on Johns computer
$ cd myproject
$ git init
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/opt/git/project.git
$ git push origin master

Σε αυτό το σημείο, οι άλλοι μπορούν να κλωνοποιήσουν το αποθετήριο και και να ωθήσουν αλλαγές εξίσου εύκολα:

$ git clone git@gitserver:/opt/git/project.git
$ cd project
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master

Με αυτήν τη μέθοδο, μπορούμε να ξεκινήσουμε γρήγορα έναν διακομιστή Git ανάγνωσης/εγγραφής για μερικούς προγραμματιστές.

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

Μπορούμε εύκολα να περιορίσουμε τον χρήστη git να κάνει μόνο δραστηριότητες Git με ένα περιορισμένο εργαλείο κελύφους που ονομάζεται git-shell και διατίθεται στο Git. Αν ορίσουμε αυτό ως το κέλυφος σύνδεσης του χρήστη git, τότε ο χρήστης git δεν μπορεί να έχει κανονική πρόσβαση μέσω του κελύφους στον διακομιστή μας. Για να χρησιμοποιήσουμε το git-shell πρέπει να αντικαταστήσουμε το κέλυφος εισόδου του χρήστη από bash ή csh σε git-shell. Για να το κάνουμε αυτό, πρέπει πρώτα να προσθέσουμε το git-shell στο /etc/shells αν δεν υπάρχει ήδη:

$ cat /etc/shells   # δες αν το `git-shell` βρίσκεται ήδη εκεί.  Αν όχι...
$ which git-shell   # επιβεβαίωσε ότι το git-shell είναι εγκατεστημένο στο σύστημα
$ sudo vim /etc/shells  # και πρόσθεσε τη διαδρομή για το git-shell από την προηγούμενη εντολή

Τώρα μπορούμε να επεξεργαστούμε το κέλυφος για έναν χρήστη χρησιμοποιώντας chsh <όνομα_χρήστη>:

$ sudo chsh git  # και εισήγαγε τη διαδρομή για το git-shell, συνήθως: /usr/bin/git-shell

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

$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.

Τώρα οι εντολές δικτύου του Git θα λειτουργούν ακόμα μια χαρά, αλλά οι χρήστες δεν θα μπορούν να ανοίξουν ένα κέλυφος. Όπως αναφέρει και η έξοδος της εντολής, μπορούμε επίσης να ρυθμίσουμε έναν κατάλογο στον αρχικό κατάλογο του χρήστη git που προσαρμόζει ελαφρώς την εντολή git-shell. Για παράδειγμα, μπορούμε να περιορίσουμε τις εντολές Git που δέχεται ο διακομιστής ή να προσαρμόσουμε το μήνυμα που βλέπουν οι χρήστες αν προσπαθούν να κάνουν SSH σε αυτό. Τρέχουμε git shell help για περισσότερες πληροφορίες σχετικά με την προσαρμογή του κελύφους στις προτιμήσεις μας.