Organisasi akses multi-pengguna ke server GIT

Ketika menginstal dan mengkonfigurasi server Git, muncul pertanyaan tentang mengatur akses untuk beberapa pengguna ke beberapa proyek. Saya melakukan studi tentang masalah ini dan menemukan solusi yang memenuhi semua persyaratan saya: sederhana, aman, dapat diandalkan.

Keinginan saya adalah sebagai berikut:

  • setiap pengguna terhubung dengan akunnya sendiri
  • banyak pengguna dapat bekerja pada satu proyek
  • pengguna yang sama dapat bekerja di beberapa proyek
  • setiap pengguna hanya memiliki akses ke proyek-proyek tempat ia bekerja
  • harus dapat terhubung melalui baris perintah, dan bukan hanya melalui beberapa jenis antarmuka web

Itu juga akan bagus:

  • memberikan hak hanya baca untuk mengendalikan orang
  • mudah mengelola izin pengguna di Git

Tinjauan umum opsi untuk mengakses server GIT


Pertama-tama, Anda perlu tahu dari mana harus memilih, jadi gambaran singkat tentang protokol Git.

  • ssh - akun pengguna yang dibuat khusus digunakan untuk mengakses server.
    • aneh bahwa Git tidak mengecualikan dari rekomendasi penggunaan satu akun untuk mengakses semua repositori. Ini tidak memenuhi persyaratan saya.
    • Anda dapat menggunakan banyak akun, tetapi bagaimana membatasi akses pengguna hanya ke direktori tertentu?

      • Menutup ke direktori home tidak cocok, karena sulit untuk mengatur akses tulis di sana untuk pengguna lain
      • Menggunakan tautan simbolik dari direktori home juga sulit karena Git tidak menafsirkannya sebagai tautan
      • Dimungkinkan untuk membatasi akses ke penerjemah, tetapi tidak ada jaminan penuh bahwa ini akan selalu berhasil

        • Anda bahkan dapat menghubungkan penerjemah perintah Anda sendiri untuk pengguna tersebut, tetapi,

          • pertama, ini sudah semacam keputusan sulit,
          • dan dalam 2, ini bisa dielakkan.

    Tapi mungkin ini bukan masalah bahwa pengguna akan dapat menjalankan perintah apa pun? .. Secara umum, metode ini tidak dapat dikecualikan jika Anda menemukan cara menggunakannya. Kami akan kembali ke metode ini nanti, tetapi untuk sementara mempertimbangkan alternatif lain, mungkin ada sesuatu yang lebih mudah di sana.
  • Protokol lokal git dapat digunakan bersamaan dengan sshfs, beberapa pengguna dapat digunakan, tetapi pada dasarnya, ini sama dengan kasus sebelumnya
  • http - baca saja
  • git hanya bisa dibaca
  • https - sulit untuk menginstal, Anda memerlukan perangkat lunak tambahan, semacam panel kontrol untuk mengatur akses pengguna ... terlihat layak, tetapi entah bagaimana itu rumit.

Menggunakan protokol ssh untuk mengatur akses multi-pengguna ke server Git


Kembali ke protokol ssh.

Karena akses ssh digunakan untuk git, Anda perlu mengamankan data server. Seorang pengguna yang terhubung melalui ssh menggunakan login sendiri di server Linux, sehingga ia dapat terhubung melalui klien ssh dan mendapatkan akses ke baris perintah server.
Tidak ada perlindungan penuh terhadap akses tersebut.

Tetapi pengguna tidak harus tertarik pada file Linux. Informasi penting disimpan hanya di repositori git. Oleh karena itu, Anda tidak dapat membatasi akses melalui baris perintah, tetapi Linux dapat mencegah pengguna menonton proyek, tidak termasuk yang ia ikuti.
Jelas menggunakan sistem izin Linux.

Seperti yang telah disebutkan, dimungkinkan untuk menggunakan hanya satu akun untuk akses ssh. Konfigurasi ini tidak aman untuk beberapa pengguna, walaupun metode ini termasuk dalam daftar opsi git yang direkomendasikan.

Untuk menerapkan persyaratan yang diberikan di awal artikel, struktur direktori berikut dibuat dengan penugasan hak dan pemilik:

1) direktori proyek

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

proj1: proj1, proj2: proj2, proj3: proj3 - pengguna Linux yang dibuat khusus yang ditunjuk sebagai direktur dari masing-masing direktori proyek.

hak atas semua direktori ditetapkan pada 0770 - akses penuh untuk pemilik dan grupnya serta larangan lengkap untuk semua orang.

2) akun pengembang

Pengembang 1: dev1: dev1, proj1, proj2
Pengembang 2: dev2: dev2, proj2, proj3

Poin kuncinya adalah bahwa pengembang diberikan grup tambahan dari pengguna sistem yang memiliki proyek yang sesuai. Ini dilakukan oleh administrator server Linux sebagai satu perintah.

Dalam contoh ini, "Pengembang 1" sedang mengerjakan proyek proj1 dan proj2, dan "Pengembang 2" bekerja pada proyek proj2 dan proj3.

Jika ada Pengembang yang terhubung melalui ssh melalui baris perintah, maka haknya tidak akan cukup bahkan untuk melihat isi direktori proyek di mana ia tidak terlibat. Dia sendiri tidak bisa mengubah ini dengan cara apa pun.

Karena dasar dari prinsip ini adalah keamanan dasar dari hak Linux, skema ini dapat diandalkan. Selain itu, skema ini sangat mudah dikelola.

Mari kita lanjutkan berlatih.

Membuat repositori Git di server Linux


Kami periksa.

[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 

lelah mengetik dengan tanganku ...

 [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 memastikan bahwa tidak mungkin untuk mengakses repositori orang lain dari baris perintah dan bahkan melihat isinya.

 [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 dalam Git dari beberapa pengembang dalam satu proyek


Satu pertanyaan tetap, jika satu pengembang memperkenalkan file baru, maka sisa pengembang tidak dapat mengubahnya, karena ia sendiri yang memilikinya (misalnya, dev1), dan bukan pengguna yang memiliki proyek (misalnya, proj1). Karena kita memiliki repositori server, pertama-tama, Anda perlu tahu bagaimana direktori ".git" diatur dan apakah file baru dibuat.

Membuat repositori Git lokal dan mendorong ke server Git


Mari kita beralih ke 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://dev1@10.1.1.11/var/gitservertest/proj2" C:\gittest>git push origin master dev1:dev1@10.1.1.11'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 saat yang sama, file baru terbentuk di server, dan itu milik pengguna yang melakukan 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]$ 

Ketika perubahan diunggah ke server Git, file dan direktori tambahan dibuat, dan pada saat yang sama, pengguna yang melakukan pengunggahan adalah pemiliknya. Tetapi kemudian grup dari file dan direktori ini juga berhubungan dengan grup utama dari pengguna ini, yaitu grup dev1 untuk pengguna dev1 dan grup dev2 untuk pengguna dev2 (mengubah grup utama dari pengguna pengembangan tidak akan membantu, sejak saat itu bagaimana cara mengerjakan beberapa proyek?). Dalam hal ini, pengguna dev2 tidak akan dapat memodifikasi file yang dibuat oleh pengguna dev1, dan ini penuh dengan pelanggaran fungsionalitas.

Linux chown - mengubah pemilik file oleh pengguna biasa



Pemilik file tidak dapat mengubah kepemilikannya. Tapi dia bisa mengubah grup file yang menjadi miliknya, dan kemudian file ini mungkin tersedia untuk diubah ke pengguna lain yang berada di grup yang sama. Inilah yang kami butuhkan.

Menggunakan git hook


Direktori yang berfungsi untuk hook adalah direktori root proyek. hook adalah executable yang berjalan di bawah pengguna yang melakukan push. mengetahui hal ini, kita dapat memenuhi 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 

baik saja

 vi hooks/post-update 

Kembali ke 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:dev1@10.1.1.11's password: d22c66e..b045e22 master -> master 

Di server Git, kami memeriksa setelah melakukan operasi skrip post-update hook

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

- kosong, semuanya baik-baik saja.

Menghubungkan pengembang kedua ke Git


Kami akan meniru karya pengembang kedua.

Di klien

 C:\gittest>git remote remove origin C:\gittest>git remote add origin "ssh://dev2@10.1.1.11/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 dev2@10.1.1.11's password: b045e22..55d49a6 master -> master 

Dan pada saat yang sama, di server ...

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

- kosong lagi, semuanya berfungsi.

Menghapus Proyek Git dan Mengunduh Proyek dari Server Git


Nah, sekali lagi Anda bisa memastikan bahwa semua perubahan dipertahankan.

 C:\gittest>rd /S /Q .       ,       . 

- Untuk menghapus proyek Git, cukup hapus direktori sepenuhnya. Kami akan memasang dengan kesalahan yang dihasilkan, karena tidak mungkin untuk menghapus direktori saat ini untuk perintah ini, tetapi kami hanya perlu perilaku ini.

 C:\gittest>dir   C:\gittest 21.06.2019 08:43 <DIR> . 21.06.2019 08:43 <DIR> .. C:\gittest>git clone ssh://dev2@10.1.1.11/var/gitservertest/proj2 Cloning into 'proj2'... dev2@10.1.1.11's password: C:\gittest>cd proj2 C:\gittest\proj2>dir   C:\gittest\proj2 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:\gittest\proj2>type test1.txt "test dev1 to proj2" "dev1 added some omre" "dev1 3rd line" "!!! dev2 added this" C:\gittest\proj2>type test2.txt "!!! dev2 wrote" 

Berbagi Akses di Git


Sekarang mari kita pastikan bahwa bahkan melalui Git, pengembang kedua tidak bisa mendapatkan akses ke proyek Proj1, yang dia tidak kerjakan.

 C:\gittest\proj2>git remote remove origin C:\gittest\proj2>git remote add origin "ssh://dev2@10.1.1.11/var/gitservertest/proj1" C:\gittest\proj2>git push origin master dev2@10.1.1.11'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 izinkan akses

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

dan setelah itu semuanya bekerja.

 C:\gittest\proj2>git push origin master dev2@10.1.1.11's password: To ssh://10.1.1.11/var/gitservertest/proj1 * [new branch] master -> master 

Informasi tambahan


Selain itu, jika ada masalah dengan izin default saat membuat file dan direktori, di CentOS Anda dapat menggunakan perintah

 setfacl -Rd -mo::5 -mg::7 /var/gitservertest 

Juga dalam artikel Anda dapat menemukan hal-hal kecil yang bermanfaat:

  • cara membangun pohon direktori di Linux
  • bagaimana sed untuk mentransfer berbagai alamat dari baris tertentu ke akhir file, yaitu, untuk melakukan penggantian sed di semua baris kecuali baris pertama
  • Bagaimana di Linux temukan untuk membalikkan istilah pencarian
  • caranya di linux shell untuk mengulang beberapa baris melalui satu baris
  • bagaimana cara menghindari tanda kutip tunggal dalam bash
  • cara menghapus direktori dengan semua konten pada baris perintah windows
  • Cara menggunakan bash mv untuk mengganti nama file tanpa menulis ulang lagi

Terima kasih atas perhatian anda

Source: https://habr.com/ru/post/id457056/


All Articles