Chapters ▾ 2nd Edition

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

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

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

Note

Πολλά από όσα περιγράφονται εδώ, μπορείτε να τα αυτοματοποιήσετε με την εντολή ssh-copy-id, αντί να αντιγράφετε και εγκαθιστάτε δημόσια κλειδιά χειροκίνητα.

Καταρχάς, δημιουργούμε ένα χρήστη 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 /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/

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

# on John's computer
$ cd myproject
$ git init
$ git add .
$ git commit -m 'Initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master

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

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

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

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

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

$ cat /etc/shells   # see if git-shell is already in there. If not...
$ which git-shell   # make sure git-shell is installed on your system.
$ sudo -e /etc/shells  # and add the path to git-shell from last command

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

$ sudo chsh git -s $(which 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.

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

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

Το αποτέλεσμα πρέπει να μοιάζει με κάτι σαν αυτό:

$ cat ~/.ssh/authorized_keys
no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4LojG6rs6h
PB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4kYjh6541N
YsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9EzSdfd8AcC
IicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myivO7TCUSBd
LQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPqdAv8JggJ
ICUvax2T9va5 gsg-keypair

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa
AAAAB3NzaC1yc2EAAAADAQABAAABAQDEwENNMomTboYI+LJieaAY16qiXiH3wuvENhBG...

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