Οργάνωση πρόσβασης πολλών χρηστών στον διακομιστή GIT

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

Οι ευχές μου είναι:

  • κάθε χρήστης συνδέεται με τον δικό του λογαριασμό
  • Πολλοί χρήστες μπορούν να εργαστούν στο ίδιο έργο
  • ο ίδιος χρήστης μπορεί να εργαστεί σε πολλά έργα
  • κάθε χρήστης έχει πρόσβαση μόνο σε εκείνα τα έργα στα οποία εργάζεται
  • θα πρέπει να είναι δυνατή η σύνδεση μέσω της γραμμής εντολών και όχι μόνο μέσω κάποιου είδους διεπαφής ιστού

Θα ήταν επίσης υπέροχο:

  • παραχωρεί δικαιώματα μόνο για ανάγνωση σε ελεγχόμενα πρόσωπα
  • βολική διαχείριση των δικαιωμάτων χρήστη στο Git

Επισκόπηση πιθανών επιλογών πρόσβασης στον διακομιστή GIT

Πρώτα απ 'όλα, πρέπει να ξέρετε τι να επιλέξετε, επομένως μια σύντομη επισκόπηση των πρωτοκόλλων Git.

  • ssh - ένας ειδικά δημιουργημένος λογαριασμός χρήστη χρησιμοποιείται για πρόσβαση στον διακομιστή.
    • Είναι περίεργο το γεγονός ότι το Git δεν συνιστά τη χρήση ενός λογαριασμού για πρόσβαση σε όλα τα αποθετήρια. Αυτό δεν ανταποκρίνεται καθόλου στις απαιτήσεις μου.
    • Μπορείτε να χρησιμοποιήσετε πολλούς λογαριασμούς, αλλά πώς μπορείτε να περιορίσετε την πρόσβαση ενός χρήστη μόνο σε συγκεκριμένους καταλόγους;
      • Το κλείσιμο στον αρχικό κατάλογο δεν είναι κατάλληλο, επειδή είναι δύσκολο να οργανωθεί η πρόσβαση εγγραφής για άλλους χρήστες εκεί
      • Η χρήση συμβολικών συνδέσμων από τον αρχικό κατάλογο είναι επίσης δύσκολη επειδή το Git δεν τους ερμηνεύει ως συνδέσμους.
      • Περιορίστε την πρόσβαση στον διερμηνέα, καλά, μπορείτε, αλλά δεν υπάρχει πλήρης εγγύηση ότι αυτό θα λειτουργεί πάντα
        • Μπορείτε γενικά να συνδέσετε τον δικό σας διερμηνέα εντολών για τέτοιους χρήστες, αλλά
          • πρώτον, αυτό είναι ήδη ένα είδος δύσκολης απόφασης,
          • και 2, μπορεί να παρακαμφθεί.

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

  • Το τοπικό πρωτόκολλο git μπορεί να χρησιμοποιηθεί σε συνδυασμό με sshfs, μπορούν να χρησιμοποιηθούν πολλοί χρήστες, αλλά είναι ουσιαστικά το ίδιο με την προηγούμενη περίπτωση
  • http - μόνο για ανάγνωση
  • Το git είναι μόνο για ανάγνωση
  • Το https είναι δύσκολο να εγκατασταθεί, χρειάζεστε πρόσθετο λογισμικό, κάποιο είδος πίνακα ελέγχου για να οργανώσετε την πρόσβαση των χρηστών ... φαίνεται εφικτό, αλλά κατά κάποιο τρόπο όλα είναι περίπλοκα.

Χρησιμοποιώντας το πρωτόκολλο ssh για να οργανώσετε την πρόσβαση πολλών χρηστών στον διακομιστή Git

Ας επιστρέψουμε στο πρωτόκολλο ssh.

Εφόσον η πρόσβαση ssh χρησιμοποιείται για το git, τα δεδομένα διακομιστή πρέπει να είναι ασφαλή. Ο χρήστης που συνδέεται μέσω ssh χρησιμοποιεί τη δική του σύνδεση στον διακομιστή Linux, ώστε να μπορεί να συνδεθεί μέσω του προγράμματος-πελάτη ssh και να έχει πρόσβαση στη γραμμή εντολών του διακομιστή.
Δεν υπάρχει πλήρης προστασία από την απόκτηση τέτοιας πρόσβασης.

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

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

Για την υλοποίηση των απαιτήσεων που δίνονται στην αρχή του άρθρου, δημιουργείται η ακόλουθη δομή καταλόγου με εκχώρηση δικαιωμάτων και κατόχων:

1) καταλόγους έργων

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
όπου
dir1, dir2, dir3 - κατάλογοι έργων: έργο 1, έργο 2, έργο 3.

Οι proj1:proj1, proj2:proj2, proj3:proj3 είναι ειδικά δημιουργημένοι χρήστες Linux που έχουν εκχωρηθεί ως κάτοχοι των αντίστοιχων καταλόγων έργων.

τα δικαιώματα σε όλους τους καταλόγους έχουν οριστεί στο 0770 - πλήρης πρόσβαση για τον ιδιοκτήτη και την ομάδα του και πλήρης απαγόρευση για όλους τους άλλους.

2) λογαριασμούς προγραμματιστή

Разработчик 1: dev1:dev1,proj1,proj2
Разработчик 2: dev2:dev2,proj2,proj3

Το βασικό σημείο είναι ότι στους προγραμματιστές ανατίθεται μια πρόσθετη ομάδα του χρήστη του συστήματος που κατέχει το αντίστοιχο έργο. Αυτό γίνεται από τον διαχειριστή διακομιστή Linux με μία εντολή.

Σε αυτό το παράδειγμα, ο προγραμματιστής 1 εργάζεται σε έργα proj1 και proj2 και ο προγραμματιστής 2 εργάζεται σε έργα proj2 και proj3.

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

Δεδομένου ότι η βάση αυτής της αρχής είναι η βασική ασφάλεια των δικαιωμάτων Linux, αυτό το σχήμα είναι αξιόπιστο. Επιπλέον, το σύστημα είναι πολύ εύκολο στη διαχείριση.

Ας προχωρήσουμε στην πρακτική.

Δημιουργία αποθετηρίων Git σε διακομιστή Linux

Ας ελέγξουμε.

[root@server ~]# cd /var/
[root@server var]# useradd gitowner
[root@server var]# mkdir gitservertest
[root@server var]# chown gitowner:gitowner gitservertest
[root@server var]# adduser proj1
[root@server var]# adduser proj2
[root@server var]# adduser proj3
[root@server var]# adduser dev1
[root@server var]# adduser dev2
[root@server var]# passwd dev1
[root@server var]# passwd dev2

βαρέθηκα να πληκτρολογώ...

[root@server gitservertest]# sed "s/ /n/g" <<< "proj1 proj2 proj3" | while read u; do mkdir $u; chown $u:$u $u; chmod 0770 $u; done

[root@server gitservertest]# usermod -aG proj1 dev1
[root@server gitservertest]# usermod -aG proj2 dev1
[root@server gitservertest]# usermod -aG proj2 dev2
[root@server gitservertest]# usermod -aG proj3 dev2

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

[dev1@server ~]$ cd /var/gitservertest/proj3
-bash: cd: /var/gitservertest/proj3: Permission denied
[dev1@server ~]$ ls /var/gitservertest/proj3
ls: cannot open directory /var/gitservertest/proj3: Permission denied

Συνεργασία στο Git πολλών προγραμματιστών σε ένα έργο

Ένα ερώτημα παραμένει, εάν ένας προγραμματιστής εισάγει ένα νέο αρχείο, τότε οι άλλοι προγραμματιστές δεν μπορούν να το αλλάξουν, επειδή ο ίδιος είναι ο κάτοχός του (για παράδειγμα, dev1) και όχι ο χρήστης που κατέχει το έργο (για παράδειγμα, proj1). Εφόσον διαθέτουμε αποθετήριο διακομιστή, πρώτα απ 'όλα, πρέπει να γνωρίζουμε πώς είναι τακτοποιημένος ο κατάλογος ".git" και αν δημιουργούνται νέα αρχεία.

Δημιουργήστε ένα τοπικό αποθετήριο Git και σπρώξτε σε έναν διακομιστή Git

Ας περάσουμε στο μηχάνημα πελάτη.

Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

C:gittest>git init .
Initialized empty Git repository in C:/gittest/.git/

C:gittest>echo "test dev1 to proj2" > test1.txt

C:gittest>git add .

C:gittest>git status
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   test1.txt

C:gittest>git commit -am "new test file added"
[master (root-commit) a7ac614] new test file added
 1 file changed, 1 insertion(+)
 create mode 100644 test1.txt
 
C:gittest>git remote add origin "ssh://[email protected]/var/gitservertest/proj2"

C:gittest>git push origin master
dev1:[email protected]'s password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 243 bytes | 243.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://10.1.1.11/var/gitservertest/proj2
 * [new branch]      master -> master

C:gittest>

Ταυτόχρονα, δημιουργούνται νέα αρχεία στον διακομιστή, τα οποία ανήκουν στον χρήστη που πραγματοποίησε την ώθηση

[dev1@server proj2]$ tree
.
├── 1.txt
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── 75
│   │   └── dcd269e04852ce2f683b9eb41ecd6030c8c841
│   ├── a7
│   │   └── ac6148611e69b9a074f59a80f356e1e0c8be67
│   ├── f0
│   │   └── 82ea1186a491cd063925d0c2c4f1c056e32ac3
│   ├── info
│   └── pack
└── refs
    ├── heads
    │   └── master
    └── tags

12 directories, 18 files
[dev1@server proj2]$ ls -l objects/75/dcd269e04852ce2f683b9eb41ecd6030c8c841
-r--r--r--. 1 dev1 dev1 54 Jun 20 14:34 objects/75/dcd269e04852ce2f683b9eb41ecd6030c8c841
[dev1@server proj2]$

Όταν οι αλλαγές μεταφορτώνονται στον διακομιστή Git, δημιουργούνται πρόσθετα αρχεία και κατάλογοι και ανήκουν στην πραγματικότητα στον χρήστη. Αλλά τότε η ομάδα αυτών των αρχείων και καταλόγων αντιστοιχεί επίσης στην κύρια ομάδα αυτού του χρήστη, δηλαδή στην ομάδα dev1 για τον χρήστη dev1 και στην ομάδα dev2 για τον χρήστη dev2 (η αλλαγή της κύριας ομάδας του χρήστη προγραμματιστή δεν θα βοηθήσει, γιατί τότε πώς να εργαστείτε σε πολλά έργα;). Σε αυτήν την περίπτωση, ο χρήστης dev2 δεν θα μπορεί να τροποποιήσει τα αρχεία που δημιουργήθηκαν από τον χρήστη dev1 και αυτό είναι γεμάτο με παραβίαση της λειτουργικότητας.

Linux chown - αλλαγή του κατόχου ενός αρχείου από έναν κανονικό χρήστη

Ο κάτοχος ενός αρχείου δεν μπορεί να αλλάξει την ιδιοκτησία του. Μπορεί όμως να αλλάξει την ομάδα ενός αρχείου που του ανήκει και, στη συνέχεια, αυτό το αρχείο μπορεί να αλλάξει από άλλους χρήστες που ανήκουν στην ίδια ομάδα. Αυτό χρειαζόμαστε.

Χρησιμοποιώντας το Git Hook

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

[dev1@server proj2]$ mv hooks/post-update{.sample,}
[dev1@server proj2]$ sed -i '2,$ s/^/#/' hooks/post-update
[dev1@server proj2]$ cat <<< 'find . -group $(whoami) -exec chgrp proj2 '"'"'{}'"'"' ;' >> hooks/post-update

ή απλά

vi hooks/post-update

Ας επιστρέψουμε στο μηχάνημα πελάτη.

C:gittest>echo "dev1 3rd line" >> test1.txt

C:gittest>git commit -am "3rd from dev1, testing server hook"
[master b045e22] 3rd from dev1, testing server hook
 1 file changed, 1 insertion(+)

C:gittest>git push origin master
dev1:[email protected]'s password:
   d22c66e..b045e22  master -> master

Στον διακομιστή Git, ελέγξτε την εργασία του σεναρίου μετά την ενημέρωση του άγκιστρου μετά την δέσμευση

[dev1@server proj2]$ find . ! -group proj2

- άδειο, όλα είναι καλά.

Σύνδεση δεύτερου προγραμματιστή στο Git

Ας προσομοιώσουμε τη δουλειά του δεύτερου προγραμματιστή.

Στον πελάτη

C:gittest>git remote remove origin

C:gittest>git remote add origin "ssh://[email protected]/var/gitservertest/proj2"

C:gittest>echo "!!! dev2 added this" >> test1.txt

C:gittest>echo "!!! dev2 wrote" > test2.txt

C:gittest>git add test2.txt

C:gittest>git commit -am "dev2 added to test1 and created test2"
[master 55d49a6] dev2 added to test1 and created test2
 2 files changed, 2 insertions(+)
 create mode 100644 test2.txt

C:gittest>git push origin master
[email protected]'s password:
   b045e22..55d49a6  master -> master

Και ταυτόχρονα στον διακομιστή...

[dev1@server proj2]$ find . ! -group proj2

- και πάλι άδειο, όλα λειτουργούν.

Διαγραφή έργου Git και φόρτωση έργου από διακομιστή Git

Λοιπόν, μπορείτε για άλλη μια φορά να βεβαιωθείτε ότι όλες οι αλλαγές έχουν αποθηκευτεί.

C:gittest>rd /S /Q .
Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.

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

C:gittest>dir
 Содержимое папки C:gittest

21.06.2019  08:43    <DIR>          .
21.06.2019  08:43    <DIR>          ..

C:gittest>git clone ssh://[email protected]/var/gitservertest/proj2
Cloning into 'proj2'...
[email protected]'s password:

C:gittest>cd proj2

C:gittestproj2>dir
 Содержимое папки C:gittestproj2

21.06.2019  08:46    <DIR>          .
21.06.2019  08:46    <DIR>          ..
21.06.2019  08:46               114 test1.txt
21.06.2019  08:46                19 test2.txt
C:gittestproj2>type test1.txt
"test dev1 to proj2"
"dev1 added some omre"
"dev1 3rd line"
"!!! dev2 added this"

C:gittestproj2>type test2.txt
"!!! dev2 wrote"

Κοινή χρήση πρόσβασης στο Git

Τώρα ας βεβαιωθούμε ότι ο δεύτερος προγραμματιστής δεν μπορεί να έχει πρόσβαση στο έργο Proj1 μέσω του Git, στο οποίο δεν εργάζεται.

C:gittestproj2>git remote remove origin

C:gittestproj2>git remote add origin "ssh://[email protected]/var/gitservertest/proj1"

C:gittestproj2>git push origin master
[email protected]'s password:
fatal: '/var/gitservertest/proj1' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Τώρα επιτρέψτε την πρόσβαση

[root@server ~]# usermod -aG proj1 dev2

και μετά όλα λειτουργούν.

C:gittestproj2>git push origin master
[email protected]'s password:
To ssh://10.1.1.11/var/gitservertest/proj1
 * [new branch]      master -> master

Για περισσότερες πληροφορίες,

Επιπλέον, εάν υπάρχει πρόβλημα με τα προεπιλεγμένα δικαιώματα κατά τη δημιουργία αρχείων και καταλόγων, στο CentOS μπορείτε να χρησιμοποιήσετε την εντολή

setfacl -Rd -m o::5 -m g::7 /var/gitservertest

Επίσης στο άρθρο μπορείτε να σκοντάψετε σε μικρά χρήσιμα πράγματα:

  • πώς να δημιουργήσετε ένα δέντρο καταλόγου στο linux
  • πώς να περάσετε ένα εύρος διευθύνσεων από μια συγκεκριμένη γραμμή στο τέλος του αρχείου στο sed, δηλαδή να κάνετε αντικατάσταση στο sed σε όλες τις γραμμές εκτός από την πρώτη γραμμή
  • Πώς να αντιστρέψετε την κατάσταση αναζήτησης στο Linux Find
  • πώς να περάσετε πολλές γραμμές μέσω μιας γραμμής σε ένα κέλυφος linux
  • πώς να ξεφύγετε από τα μεμονωμένα εισαγωγικά στο bash
  • πώς να διαγράψετε έναν κατάλογο με όλα τα περιεχόμενα στη γραμμή εντολών των Windows
  • Πώς να μετονομάσετε ένα αρχείο χρησιμοποιώντας το bash mv χωρίς να το ξαναγράψετε

Σας ευχαριστώ για την προσοχή σας.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο