Organisasi akses multi pangguna menyang server GIT

Nalika nginstal lan ngatur server Git, muncul pitakonan babagan ngatur akses kanggo sawetara pangguna menyang sawetara proyek. Aku nliti masalah kasebut lan nemokake solusi sing cocog karo kabeh syaratku: prasaja, aman, dipercaya.

Kekarepanku yaiku:

  • saben pangguna nyambung karo akun dhewe
  • Sawetara pangguna bisa nggarap siji proyek
  • pangguna sing padha bisa nggarap pirang-pirang proyek
  • saben pangguna mung nduweni akses menyang proyek sing dienggo
  • Sampeyan kudu bisa nyambung liwat baris printah, lan ora mung liwat sawetara jinis antarmuka web

Iku uga bakal apik:

  • menehi idin mung diwaca kanggo ngontrol wong
  • Ngatur hak akses pangguna kanthi gampang ing Git

Ringkesan opsi sing bisa diakses kanggo ngakses server GIT

Kaping pisanan, sampeyan kudu ngerti apa sing kudu dipilih, mula iki ringkesan cepet babagan protokol Git.

  • ssh - akun pangguna sing digawe khusus digunakake kanggo ngakses server.
    • Aneh yen Git ora ngilangi saka rekomendasi panggunaan siji akun kanggo ngakses kabeh repositori. Iki ora nyukupi syaratku.
    • Sampeyan bisa nggunakake macem-macem akun, nanging kepiye sampeyan bisa mbatesi akses pangguna menyang direktori tartamtu?
      • Nutup menyang direktori ngarep ora cocok, amarga iku angel kanggo ngatur akses nulis ana kanggo pangguna liyane
      • Nggunakake symlinks saka direktori ngarep sampeyan uga angel amarga Git ora nerjemahake minangka link
      • Sampeyan bisa matesi akses menyang interpreter, nanging ora ana jaminan lengkap sing bakal tansah bisa
        • Sampeyan umume bisa nyambung interpreter printah dhewe kanggo panganggo kuwi, nanging
          • pisanan, iki wis sawetara jinis kaputusan angel,
          • lan sareh, iki bisa circumvented.

    Nanging Mungkin iku ora masalah sing pangguna bakal bisa kanggo nglakokaké printah sembarang? Kita bakal bali menyang metode iki mengko, nanging saiki kita bakal nimbang sedhela alternatif liyane, bisa uga ana sing luwih gampang.

  • Protokol lokal git bisa digunakake ing kombinasi karo sshfs, sawetara pangguna bisa digunakake, nanging sejatine padha karo kasus sadurunge
  • http - mung diwaca
  • git mung diwaca
  • https - angel diinstal, sampeyan butuh piranti lunak tambahan, sawetara panel kontrol kanggo ngatur akses pangguna ... katon layak, nanging piye wae kabeh rumit.

Nggunakake protokol ssh kanggo ngatur akses multi pangguna menyang server Git

Ayo bali menyang protokol ssh.

Amarga sampeyan nggunakake akses ssh kanggo git, sampeyan kudu njamin keamanan data server. Pangguna sing nyambung liwat ssh nggunakake login dhewe ing server Linux, supaya bisa nyambung liwat klien ssh lan ngakses baris printah server.
Ora ana pangayoman lengkap marang akses kasebut.

Nanging pangguna ngirim ora kasengsem ing file Linux. Informasi penting disimpen mung ing repositori git. Mula, bisa uga ora mbatesi akses liwat baris perintah, nanging nggunakake alat Linux kanggo nglarang pangguna ndeleng proyek, ora kalebu sing melu.
Pilihan sing jelas yaiku nggunakake sistem ijin Linux.

Kaya sing wis kasebut, mung bisa nggunakake siji akun kanggo akses ssh. Konfigurasi iki ora aman kanggo sawetara pangguna, sanajan kalebu ing dhaptar pilihan git sing disaranake.

Kanggo ngetrapake syarat sing diwenehake ing wiwitan artikel, struktur direktori ing ngisor iki digawe kanthi penugasan hak lan pamilik:

1) direktori proyek

dir1(proj1:proj1,0770)
dir2(proj2:proj2,0770)
dir3(proj3:proj3,0770)
...
ngendi
dir1, dir2, dir3 - direktori proyek: proyek 1, proyek 2, proyek 3.

proj1: proj1, proj2: proj2, proj3: proj3 digawe khusus pangguna Linux sing ditugasake minangka pemilik direktori proyek sing cocog.

ijin kanggo kabeh direktori disetel kanggo 0770 - akses lengkap kanggo pemilik lan klompok lan larangan lengkap kanggo wong liya.

2) akun pangembang

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

Intine yaiku pangembang diwenehi klompok tambahan saka pemilik pangguna sistem proyek sing cocog. Iki ditindakake dening administrator server Linux kanthi siji printah.

Ing conto iki, "Developer 1" nggarap proyek proj1 lan proj2, lan "Developer 2" nggarap proyek proj2 lan proj3.

Yen ana pangembang sing nyambung liwat ssh liwat baris perintah, mula hak-hak kasebut ora bakal cukup kanggo ndeleng konten direktori proyek sing ora melu. Dheweke ora bisa ngganti iki dhewe.

Wiwit dhasar prinsip iki minangka keamanan dhasar hak Linux, skema iki bisa dipercaya. Kajaba iku, skema kasebut gampang banget kanggo ngatur.

Ayo padha nerusake kanggo latihan.

Nggawe repositori Git ing server Linux

Ayo priksa.

[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

Aku kesel ngetik nganggo tangan ...

[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

Kita yakin manawa ora bisa ngakses repositori wong liya saka baris perintah lan malah ndeleng isine.

[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

Kolaborasi karo macem-macem pangembang ing proyek sing padha ing Git

Siji pitakonan tetep, yen siji pangembang ngenalake file anyar, mula pangembang liyane ora bisa ngganti, amarga dheweke dhewe sing duwe (contone, dev1), lan dudu pemilik pangguna proyek kasebut (contone, proj1). Awit kita duwe gudang sisih server, pisanan kabeh, kita kudu ngerti carane direktori ".git" wis kabentuk lan apa file anyar digawe.

Nggawe repositori Git lokal lan push menyang server Git

Ayo pindhah menyang mesin klien.

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>

Ing wektu sing padha, file anyar digawe ing server, lan dadi kagungane pangguna sing nindakake push

[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]$

Nalika sampeyan ngunggah owah-owahan menyang server Git, file lan direktori tambahan digawe, lan sing nduweni sejatine pangguna sing nggawe unggahan. Nanging banjur klompok file lan direktori kasebut uga cocog karo klompok utama pangguna iki, yaiku, grup dev1 kanggo pangguna dev1 lan grup dev2 kanggo pangguna dev2 (ngganti grup utama pangguna pangembang ora bakal mbantu, amarga banjur kepiye sampeyan bisa nggarap pirang-pirang proyek?). Ing kasus iki, pangguna dev2 ora bakal bisa ngganti file sing digawe dening panganggo dev1, sing bisa nyebabake kerusakan fungsi.

Linux chown - ngganti pemilik file dening pangguna biasa

Pamilik file ora bisa ngganti kepemilikan. Nanging dheweke bisa ngganti klompok file sing dadi kagungane, banjur file iki bisa diowahi dening pangguna liyane sing ana ing grup sing padha. Sing perlu.

Nggunakake pancing Git

Direktori kerja kanggo pancing yaiku direktori root proyek. pancing minangka eksekusi sing mlaku ing sangisore pangguna sing nindakake push. Ngerti iki, kita bisa ngetrapake rencana kita.

[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

utawa mung

vi hooks/post-update

Ayo bali menyang mesin klien.

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

Ing server Git, kita mriksa operasi skrip pasca-update pancing sawise komit

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

- kosong, kabeh apik.

Nyambungake pangembang kapindho ing Git

Ayo dadi simulasi karya pangembang kapindho.

Ing klien

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

Lan ing wektu sing padha, ing server ...

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

- kosong maneh, kabeh bisa.

Mbusak proyek Git lan ngundhuh proyek saka server Git

Inggih, sampeyan bisa maneh priksa manawa kabeh owah-owahan wis disimpen.

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

- kanggo mbusak proyek Git, mbusak direktori kanthi lengkap. Ayo dadi sijine munggah karo kesalahan sing kui, awit iku mokal kanggo mbusak direktori saiki nggunakake printah iki, nanging iki persis prilaku kita kudu.

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"

Nuduhake akses ing Git

Saiki ayo priksa manawa liwat Git pangembang kapindho ora bisa ngakses proyek Proj1, sing ora digunakake.

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.

Saiki kita ngidini akses

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

lan sawise iku kabeh bisa.

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

Kanggo informasi luwih lengkap,

Kajaba iku, yen ana masalah karo ijin standar nalika nggawe file lan direktori, ing CentOS sampeyan bisa nggunakake perintah kasebut.

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

Uga ing artikel sampeyan bisa kesandhung bab cilik migunani:

  • carane mbangun wit direktori ing Linux
  • carane ngliwati sawetara alamat ing sed saka baris tartamtu menyang mburi file, yaiku, nggawe panggantos ing sed ing kabeh baris kajaba baris pisanan
  • Cara ngowahi kondisi telusuran ing temokake Linux
  • Kepiye cara ngliwati pirang-pirang baris dadi puteran nggunakake siji-liner ing cangkang Linux
  • Carane uwal kuotasi siji ing bash
  • carane mbusak direktori karo kabeh isi ing baris printah windows
  • Cara nggunakake bash mv kanggo ngganti jeneng file tanpa nulis maneh

Matur nuwun kanggo manungsa waé.

Source: www.habr.com

Add a comment