Organisasi akses berbilang pengguna ke pelayan GIT

Apabila memasang dan mengkonfigurasi pelayan Git, persoalan timbul tentang mengatur akses untuk beberapa pengguna kepada beberapa projek. Saya meneliti isu tersebut dan menemui penyelesaian yang memenuhi semua keperluan saya: mudah, selamat, boleh dipercayai.

Hasrat saya ialah:

  • setiap pengguna berhubung dengan akaun mereka sendiri
  • Beberapa pengguna boleh bekerja pada satu projek
  • pengguna yang sama boleh bekerja pada berbilang projek
  • setiap pengguna mempunyai akses hanya kepada projek di mana dia bekerja
  • Ia sepatutnya boleh disambungkan melalui baris arahan, dan bukan hanya melalui beberapa jenis antara muka web

Ia juga akan menjadi hebat:

  • memberikan kebenaran baca sahaja kepada orang yang mengawal
  • Urus hak akses pengguna dengan mudah dalam Git

Gambaran keseluruhan pilihan yang mungkin untuk mengakses pelayan GIT

Pertama sekali, anda perlu tahu apa yang perlu dipilih, jadi berikut ialah gambaran keseluruhan ringkas protokol Git.

  • ssh - akaun pengguna yang dicipta khas digunakan untuk mengakses pelayan.
    • Adalah pelik bahawa Git tidak mengecualikan daripada cadangannya penggunaan satu akaun untuk mengakses semua repositori. Ini tidak memenuhi keperluan saya sama sekali.
    • Anda boleh menggunakan berbilang akaun, tetapi bagaimana anda boleh mengehadkan akses pengguna kepada direktori tertentu sahaja?
      • Menutup ke dalam direktori rumah tidak sesuai, kerana sukar untuk mengatur akses tulis di sana untuk pengguna lain
      • Menggunakan pautan sym dari direktori rumah anda juga sukar kerana Git tidak mentafsirkannya sebagai pautan
      • Adalah mungkin untuk menyekat akses kepada jurubahasa, tetapi tidak ada jaminan penuh bahawa ia akan sentiasa berfungsi
        • Anda biasanya boleh menyambungkan penterjemah arahan anda sendiri untuk pengguna tersebut, tetapi
          • pertama, ini sudah menjadi semacam keputusan yang sukar,
          • dan kedua, ini boleh dielakkan.

    Tetapi mungkin tidak menjadi masalah bahawa pengguna akan dapat melaksanakan sebarang arahan?.. Secara umum, kaedah ini tidak boleh diketepikan jika anda mengetahui dengan tepat cara menggunakannya. Kami akan kembali kepada kaedah ini kemudian, tetapi buat masa ini kami akan mempertimbangkan secara ringkas alternatif lain, mungkin akan ada sesuatu yang lebih mudah.

  • Protokol tempatan git boleh digunakan dalam kombinasi dengan sshfs, berbilang pengguna boleh digunakan, tetapi pada asasnya sama seperti kes sebelumnya
  • http - baca sahaja
  • git ialah baca sahaja
  • https - sukar untuk dipasang, anda memerlukan perisian tambahan, beberapa jenis panel kawalan untuk mengatur akses pengguna... ia kelihatan boleh dilaksanakan, tetapi entah bagaimana semuanya rumit.

Menggunakan protokol ssh untuk mengatur akses berbilang pengguna ke pelayan Git

Mari kembali ke protokol ssh.

Memandangkan anda menggunakan akses ssh untuk git, anda perlu memastikan keselamatan data pelayan. Pengguna yang menyambung melalui ssh menggunakan log masuk mereka sendiri pada pelayan Linux, supaya mereka boleh menyambung melalui klien ssh dan mengakses baris arahan pelayan.
Tiada perlindungan lengkap terhadap akses sedemikian.

Tetapi pengguna tidak sepatutnya berminat dengan fail Linux. Maklumat penting disimpan hanya dalam repositori git. Oleh itu, adalah mungkin untuk tidak menyekat akses melalui baris arahan, tetapi menggunakan alat Linux untuk melarang pengguna daripada melihat projek, tidak termasuk projek yang dia sertai.
Pilihan yang jelas ialah menggunakan sistem kebenaran Linux.

Seperti yang telah disebutkan, adalah mungkin untuk menggunakan hanya satu akaun untuk akses ssh. Konfigurasi ini tidak selamat untuk beberapa pengguna, walaupun ia termasuk dalam senarai pilihan git yang disyorkan.

Untuk melaksanakan keperluan yang diberikan pada permulaan artikel, struktur direktori berikut dibuat dengan penyerahan hak dan pemilik:

1) direktori projek

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

proj1:proj1, proj2:proj2, proj3:proj3 adalah pengguna Linux yang dicipta khas yang ditugaskan sebagai pemilik direktori projek yang sepadan.

kebenaran untuk semua direktori ditetapkan kepada 0770 - akses penuh untuk pemilik dan kumpulannya dan larangan sepenuhnya untuk orang lain.

2) akaun pembangun

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

Perkara utama ialah pembangun diberikan kumpulan tambahan pemilik pengguna sistem bagi projek yang sepadan. Ini dilakukan oleh pentadbir pelayan Linux dengan satu arahan.

Dalam contoh ini, "Pembangun 1" sedang mengusahakan projek proj1 dan proj2, dan "Pembangun 2" sedang mengusahakan projek proj2 dan proj3.

Jika mana-mana Pembangun menyambung melalui ssh melalui baris arahan, maka hak mereka tidak akan mencukupi walaupun untuk melihat kandungan direktori projek di mana mereka tidak mengambil bahagian. Dia tidak boleh mengubahnya sendiri.

Oleh kerana asas prinsip ini adalah keselamatan asas hak Linux, skim ini boleh dipercayai. Di samping itu, skim ini sangat mudah untuk ditadbir.

Mari kita berlatih.

Mencipta repositori Git pada pelayan Linux

Jom semak.

[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

dah penat menaip guna 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

Kami yakin bahawa adalah mustahil untuk mengakses repositori orang lain dari baris arahan dan juga melihat kandungannya.

[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

Bekerjasama dengan berbilang pembangun pada projek yang sama dalam Git

Satu soalan kekal, jika seorang pembangun memperkenalkan fail baharu, maka pembangun lain tidak boleh mengubahnya, kerana dia sendiri adalah pemiliknya (contohnya, dev1), dan bukan pemilik pengguna projek itu (contohnya, proj1). Memandangkan kami mempunyai repositori sebelah pelayan, pertama sekali, kami perlu mengetahui cara direktori ".git" distrukturkan dan sama ada fail baharu dicipta.

Mencipta repositori Git tempatan dan menolak ke pelayan Git

Mari kita beralih kepada mesin pelanggan.

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>

Pada masa yang sama, fail baharu dicipta pada pelayan, dan ia adalah milik pengguna yang melakukan tolakan

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

Apabila anda memuat naik perubahan pada pelayan Git, fail dan direktori tambahan dibuat, dan pemiliknya sebenarnya adalah pengguna yang membuat muat naik. Tetapi kumpulan fail dan direktori ini juga sepadan dengan kumpulan utama pengguna ini, iaitu kumpulan dev1 untuk pengguna dev1 dan kumpulan dev2 untuk pengguna dev2 (menukar kumpulan utama pengguna pembangun tidak akan membantu, kerana kemudian bagaimana anda boleh bekerja pada pelbagai projek?). Dalam kes ini, pengguna dev2 tidak akan dapat menukar fail yang dibuat oleh pengguna dev1, yang boleh menyebabkan kerosakan dalam fungsi.

Linux chown - menukar pemilik fail oleh pengguna biasa

Pemilik fail tidak boleh menukar pemilikannya. Tetapi dia boleh menukar kumpulan fail kepunyaannya, dan kemudian fail ini boleh diubah suai oleh pengguna lain yang berada dalam kumpulan yang sama. Itu yang kita perlukan.

Menggunakan cangkuk Git

Direktori kerja untuk cangkuk ialah direktori akar projek. cangkuk ialah boleh laku yang berjalan di bawah pengguna yang melakukan tolakan. Mengetahui perkara ini, kami boleh melaksanakan rancangan kami.

[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

atau hanya

vi hooks/post-update

Mari kembali ke mesin pelanggan.

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

Pada pelayan Git, kami menyemak operasi skrip pasca kemas kini cangkuk selepas komit

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

- kosong, semuanya baik-baik saja.

Menyambungkan pembangun kedua dalam Git

Mari kita simulasi kerja pembangun kedua.

Pada 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

Dan pada masa yang sama, pada pelayan...

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

- kosong lagi, semuanya berfungsi.

Memadamkan projek Git dan memuat turun projek dari pelayan Git

Nah, anda sekali lagi boleh memastikan bahawa semua perubahan telah disimpan.

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

— untuk memadam projek Git, cuma kosongkan direktori sepenuhnya. Mari kita bersabar dengan ralat yang dihasilkan, kerana adalah mustahil untuk memadamkan direktori semasa menggunakan arahan ini, tetapi ini adalah tingkah laku yang kita perlukan.

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"

Berkongsi akses dalam Git

Sekarang mari kita pastikan bahawa walaupun melalui Git pembangun kedua tidak dapat mengakses projek Proj1, di mana dia tidak berfungsi.

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.

Sekarang kami membenarkan akses

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

dan selepas itu semuanya berfungsi.

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

Untuk maklumat lanjut,

Selain itu, jika terdapat masalah dengan kebenaran lalai semasa membuat fail dan direktori, dalam CentOS anda boleh menggunakan arahan

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

Juga dalam artikel anda mungkin tersandung pada perkara-perkara kecil yang berguna:

  • bagaimana untuk membina pokok direktori di Linux
  • bagaimana untuk menghantar julat alamat dalam sed dari baris tertentu ke penghujung fail, iaitu, buat penggantian dalam sed dalam semua baris kecuali baris pertama
  • Bagaimana untuk menyongsangkan keadaan carian dalam Linux find
  • Bagaimana untuk menghantar berbilang baris ke dalam gelung menggunakan satu pelapik dalam cangkerang Linux
  • Bagaimana untuk melepaskan petikan tunggal dalam bash
  • bagaimana untuk memadam direktori dengan semua kandungannya dalam baris arahan windows
  • Cara menggunakan bash mv untuk menamakan semula fail tanpa menulisnya semula

Terima kasih atas perhatian anda.

Sumber: www.habr.com

Tambah komen